Mercurial > lcfOS
diff python/c3/semantics.py @ 148:e5263f74b287
Added c3 language frontend initial parser
author | Windel Bouwman |
---|---|
date | Fri, 01 Mar 2013 10:24:01 +0100 |
parents | |
children | 74241ca312cc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/c3/semantics.py Fri Mar 01 10:24:01 2013 +0100 @@ -0,0 +1,50 @@ +from . import astnodes + +class Scope: + """ A scope contains all symbols in a scope """ + def __init__(self, parent=None): + self.symbols = {} + self.parent = parent + def getType(self, name): + t = self.getSymbol(name) + print(t) + assert isinstance(t, astnodes.Type) + return t + 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 createBuiltins(scope): + scope.addSymbol(astnodes.BaseType('int')) + +class Semantics: + """ This class constructs the AST from parser input """ + def __init__(self, diag): + self.diag = diag + def handlePackage(self, name, loc): + self.mod = astnodes.Package(name) + self.mod.loc = loc + self.mod.scope = self.curScope = Scope() + createBuiltins(self.curScope) + def handleBinop(self, lhs, op, rhs): + pass + def actOnLocal(self, t, name, ival): + s = astnodes.Variable(name, t, False) + self.curScope.addSymbol(s) + def actOnType(self, tok): + # Try to lookup type, in case of failure return void + pass +