def replace(token, st): if isinstance(token, list): if not token: raise SyntaxError("Empty () that is not in function literal") if lex.is_raw_sym(token[0]): head = token[0] if head.name() in table: return table[head.name()](token[1:]) return literals.Call(replace(token[0], st), [replace(e, st) for e in token[1:]]) elif lex.is_raw_sym(token): return st.lookup(token) else: return token
def define(self, raw_sym, kind, value): if not lex.is_raw_sym(raw_sym): raise TypeError("Attempt to define non-symbol " + str(raw_sym)) name = raw_sym.name() if name in self.st: raise AttributeError("Cannot redefine symbol" + str(raw_sym)) self.st[name] = Defined(name, kind, value)
def addParameter(self, raw_sym): if not lex.is_raw_sym(raw_sym): raise TypeError("Attempt to add non-symbol param " + str(raw_sym)) name = raw_sym.name() if name in self.st: raise AttributeError("Adding parameter symbol twice: " + name) else: p = Parameter(name) self.st[name] = p return p
def lookup(self, raw_sym): if not lex.is_raw_sym(raw_sym): raise TypeError("Attempt to lookup non-symbol " + str(raw_sym)) name = raw_sym.name() try: return self.st[name] except KeyError: if self.parent == None: raise KeyError("Symbol " + str(name) + " not found.") return self.parent.lookup(raw_sym)