summaryrefslogtreecommitdiff
path: root/src/semantic/environment.rs
diff options
context:
space:
mode:
authorDavid Li <li.davidm96@gmail.com>2017-11-05 09:27:10 -0500
committerDavid Li <li.davidm96@gmail.com>2017-11-05 09:27:10 -0500
commitb0711ef63501b7c29cb7c2014f3ceeaa399e3481 (patch)
treeeb1cf61610517a7479e3f78a30b4bff37dd44708 /src/semantic/environment.rs
parent9f393b2eb7b3fb8f1924e80095bad3384049cc67 (diff)
Add stubbed out type checker
Diffstat (limited to 'src/semantic/environment.rs')
-rw-r--r--src/semantic/environment.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/semantic/environment.rs b/src/semantic/environment.rs
new file mode 100644
index 0000000..fab16b3
--- /dev/null
+++ b/src/semantic/environment.rs
@@ -0,0 +1,33 @@
+use std::collections::HashMap;
+use std::hash::Hash;
+
+pub struct Environment<'a, T: 'a, U: 'a> {
+ pub parent: Option<&'a Environment<'a, T, U>>,
+ pub bindings: HashMap<T, U>,
+}
+
+impl<'a, T: 'a, U: 'a> Environment<'a, T, U>
+ where T: Eq + Hash {
+ pub fn new(parent: Option<&'a Environment<'a, T, U>>) -> Environment<'a, T, U> {
+ Environment {
+ parent: parent,
+ bindings: HashMap::new(),
+ }
+ }
+
+ pub fn add_binding(&mut self, key: T, value: U) {
+ self.bindings.insert(key, value);
+ }
+
+ pub fn lookup(&self, key: &T) -> Option<&U> {
+ if let Some(v) = self.bindings.get(key) {
+ Some(v)
+ }
+ else if let Some(p) = self.parent {
+ p.lookup(key)
+ }
+ else {
+ None
+ }
+ }
+}