view python/c3/semantics.py @ 169:ee0d30533dae

Added more tests and improved the diagnostic update
author Windel Bouwman
date Sat, 23 Mar 2013 18:34:41 +0100
parents 0b5b2ee6b435
children a51b3c956386
line wrap: on
line source

from . import astnodes
from .scope import Scope, topScope

class Semantics:
   """ This class constructs the AST from parser input """
   def __init__(self, diag):
      self.diag = diag
   def reinit(self):
      # Set mod to empty package:
      self.mod = astnodes.Package('unnamed')
      self.mod.scope = Scope(topScope)
   def addSymbol(self, s):
      if self.curScope.hasSymbol(s.name):
         msg = 'Redefinition of {0}'.format(s.name)
         self.diag.error(msg, s.loc)
      else:
         self.curScope.addSymbol(s)
   def handlePackage(self, name, loc):
      self.mod = astnodes.Package(name)
      self.mod.loc = loc
      self.mod.scope = self.curScope = Scope(topScope)
   def actOnVarDef(self, name, loc, t, ival):
      s = astnodes.Variable(name, t)
      s.loc = loc
      self.addSymbol(s)
   def actOnConstDef(self, name, loc, t, val):
      s = astnodes.Constant(name, t, val)
      s.loc = loc
      self.addSymbol(s)
   def actOnFuncDef1(self, name, loc):
      self.curFunc = astnodes.Function(name)
      self.curFunc.loc = loc
      self.addSymbol(self.curFunc)
      self.curScope = self.curFunc.scope = Scope(self.curScope)
   def actOnParameter(self, name, loc, t):
      p = astnodes.Variable(name, t)
      p.loc = loc
      p.parameter = True
      self.addSymbol(p)
      return p
   def actOnFuncDef2(self, parameters, returntype, body):
      self.curFunc.body = body
      paramtypes = [p.typ for p in parameters]
      self.curFunc.typ = astnodes.FunctionType(paramtypes, returntype)
      self.curFunc = None
      self.curScope = self.curScope.parent
   def actOnType(self, tok):
      # Try to lookup type, in case of failure return void
      pass
   def actOnDesignator(self, tname, loc):
      d = astnodes.Designator(tname)
      d.scope = self.curScope
      d.loc = loc
      return d
   def actOnBinop(self, lhs, op, rhs, loc):
      bo = astnodes.Binop(lhs, op, rhs)
      bo.loc = loc
      return bo
   def actOnNumber(self, num, loc):
      n = astnodes.Literal(num)
      n.loc = loc
      return n
   def actOnVariableUse(self, d, loc):
      vu = astnodes.VariableUse(d)
      vu.loc = loc
      return vu
   def actOnAssignment(self, lval, rval, loc):
      a = astnodes.Assignment(lval, rval)
      a.loc = loc
      return a
   def actOnFunctionCall(self, func, args, loc):
      fc = astnodes.FunctionCall(func, args)
      fc.loc = loc
      return fc
   def actOnIfStatement(self, cond, yes, no, loc):
      i = astnodes.IfStatement(cond, yes, no)
      i.loc = loc
      return i