Mercurial > lcfOS
view python/c3/typecheck.py @ 155:b28a11c01dbe
Simplified IR classes
author | Windel Bouwman |
---|---|
date | Sun, 03 Mar 2013 13:20:03 +0100 |
parents | b73bc14a3aa3 |
children | 8104fc8b5e90 |
line wrap: on
line source
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, ProcedureCall from .astnodes import FunctionType, BaseType from . import astnodes from .scope import topScope class TypeChecker: def __init__(self, diag): self.diag = diag 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.diag.error(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) 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 ProcedureCall: if type(sym.proc) is Designator: sym.proc = self.resolveDesignator(sym.proc) 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