Example #1
0
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
Example #2
0
 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)
Example #3
0
 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
Example #4
0
 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)