aboutsummaryrefslogtreecommitdiff
path: root/neb/structs.py
diff options
context:
space:
mode:
authormryouse2022-06-18 02:56:25 +0000
committermryouse2022-06-18 02:56:25 +0000
commit015951495e4a0a22d89be059b46a90a296151802 (patch)
tree42a49bfc7798c92a2564ccd597f29f705f998fee /neb/structs.py
parentd1a1c1592e610526c4a0432f93bd9ea6ae96d6e8 (diff)
move Arg and Environment to structs
Diffstat (limited to 'neb/structs.py')
-rw-r--r--neb/structs.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/neb/structs.py b/neb/structs.py
index 09807db..3aac72a 100644
--- a/neb/structs.py
+++ b/neb/structs.py
@@ -106,3 +106,56 @@ class List:
def __str__(self):
return "(" + " ".join(f"{arg}" for arg in self.args) + ")"
+# function things
+class Arg:
+
+ def __init__(self, name, type_, *, optional=False, lazy=False):
+ self.name = name
+ self.type_ = type_
+ self.optional = optional
+ self.lazy = lazy
+
+ def __str__(self):
+ opt = "?" if self.optional else ""
+ lazy = "~" if self.lazy else ""
+ return f"{lazy}{opt}{self.name} {self.type_}"
+
+class Environment:
+
+ def __init__(self, parent=None):
+ self.parent = parent
+ self.environment = {}
+
+ def register(self, key, value):
+ self.environment[key] = value
+
+ def reregister(self, key, value):
+ if not self.contains(key):
+ raise NebPanic(f"undefined symbol: '{key}")
+ if key in self.environment:
+ self.register(key, value)
+ else:
+ self.parent.reregister(key, value)
+
+ def contains(self, key):
+ if key in self.environment:
+ return True
+ elif self.parent is not None:
+ return self.parent.contains(key)
+ else:
+ return False
+
+ def get(self, key):
+ if not self.contains(key):
+ raise NebPanic(f"undefined symbol: '{key}")
+ if key in self.environment:
+ return self.environment[key]
+ else:
+ return self.parent.get(key)
+
+ def __str__(self):
+ out = ""
+ for k, v in self.environment.items():
+ out += f"{k}: {v}, "
+ return out
+