Mercurial > lcfOS
view python/c3/scope.py @ 268:5ec7580976d9
Op naar tree-IR
author | Windel Bouwman |
---|---|
date | Wed, 14 Aug 2013 20:12:40 +0200 |
parents | 521567d17388 |
children | e64bae57cda8 |
line wrap: on
line source
from . import astnodes class Scope: """ A scope contains all symbols in a scope """ def __init__(self, parent=None): self.symbols = {} self.parent = parent def __iter__(self): # Iterate in a deterministic manner: return iter(self.Constants + self.Variables + self.Functions) @property def Syms(self): syms = self.symbols.values() return sorted(syms, key=lambda v: v.name) @property def Constants(self): return [s for s in self.Syms if type(s) is astnodes.Constant] @property def Variables(self): return [s for s in self.Syms if type(s) is astnodes.Variable] @property def Functions(self): return [s for s in self.Syms if type(s) is astnodes.Function] def getSymbol(self, name): if name in self.symbols: return self.symbols[name] # Look for symbol: if self.parent: return self.parent.getSymbol(name) raise CompilerException("Symbol {0} not found".format(name), name.loc) def hasSymbol(self, name): if name in self.symbols: return True if self.parent: return self.parent.hasSymbol(name) return False def addSymbol(self, sym): self.symbols[sym.name] = sym def __repr__(self): return 'Scope with {} symbols'.format(len(self.symbols)) # buildin types: intType = astnodes.BaseType('int') intType.bytesize = 4 doubleType = astnodes.BaseType('double') voidType = astnodes.BaseType('void') boolType = astnodes.BaseType('bool') stringType = astnodes.BaseType('string') byteType = astnodes.BaseType('byte') def createBuiltins(scope): for tn in ['u64', 'u32', 'u16', 'u8']: scope.addSymbol(astnodes.BaseType(tn)) for t in [intType, doubleType, voidType, boolType, stringType, byteType]: scope.addSymbol(t) topScope = Scope() createBuiltins(topScope)