view python/c3/semantics.py @ 163:8104fc8b5e90

Added visitor to c3
author Windel Bouwman
date Mon, 18 Mar 2013 20:13:57 +0100
parents b73bc14a3aa3
children e023d3ce1d63
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 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
      self.curFunc.typ = astnodes.FunctionType(parameters, 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):
      return astnodes.VariableUse(d)