From 015951495e4a0a22d89be059b46a90a296151802 Mon Sep 17 00:00:00 2001 From: mryouse Date: Sat, 18 Jun 2022 02:56:25 +0000 Subject: move Arg and Environment to structs --- neb/structs.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'neb/structs.py') 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 + -- cgit v1.2.3