Mercurial > lcfOS
diff python/c3/typecheck.py @ 150:4ae0e02599de
Added type check start and analyze phase
author | Windel Bouwman |
---|---|
date | Fri, 01 Mar 2013 16:53:22 +0100 |
parents | |
children | b73bc14a3aa3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/c3/typecheck.py Fri Mar 01 16:53:22 2013 +0100 @@ -0,0 +1,62 @@ +from .astnodes import BaseType, Variable, Designator, Function +from .astnodes import CompoundStatement, Assignment, VariableUse +from .astnodes import Binop, Unop, Constant +from .astnodes import IfStatement, WhileStatement, ReturnStatement +from .astnodes import FunctionType, BaseType +from . import astnodes +from ppci.errors import CompilerException +from .scope import topScope + +class TypeChecker: + def __init__(self, diag): + self.diag = diag + def err(self, msg, loc): + self.diag.diag(CompilerException(msg, loc)) + def checkPackage(self, pkg): + for s in pkg.scope: + self.check(s) + def resolveDesignator(self, d): + if d.scope.hasSymbol(d.tname): + return d.scope.getSymbol(d.tname) + else: + msg = 'Cannot resolve name {0}'.format(d.tname) + self.err(msg, d.loc) + def check(self, sym): + if type(sym) is Variable: + if type(sym.typ) is Designator: + sym.typ = self.resolveDesignator(sym.typ) + elif type(sym) is Function: + for s in sym.scope: + self.check(s) + self.check(sym.typ) + self.check(sym.body) + elif type(sym) is CompoundStatement: + for s in sym.statements: + self.check(s) + elif type(sym) is IfStatement: + self.check(sym.condition) + print(sym.condition) + self.check(sym.truestatement) + self.check(sym.falsestatement) + elif type(sym) is VariableUse: + if type(sym.target) is Designator: + sym.target = self.resolveDesignator(sym.target) + elif type(sym) is Assignment: + self.check(sym.lval) + self.check(sym.rval) + elif type(sym) is ReturnStatement: + self.check(sym.expr) + elif type(sym) is Constant: + if type(sym.value) is int: + sym.typ = topScope.getSymbol('int') + elif type(sym) is FunctionType: + if type(sym.returntype) is Designator: + sym.returntype = self.resolveDesignator(sym.returntype) + self.check(sym.returntype) + elif type(sym) is Binop: + self.check(sym.a) + self.check(sym.b) + if type(sym.a) is Constant and type(sym.b) is Constant: + # Possibly fold expression + pass +