diff python/ppci/c3/astnodes.py @ 300:158068af716c

yafm
author Windel Bouwman
date Tue, 03 Dec 2013 18:00:22 +0100
parents python/c3/astnodes.py@bd2593de3ff8
children 6753763d3bec
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python/ppci/c3/astnodes.py	Tue Dec 03 18:00:22 2013 +0100
@@ -0,0 +1,361 @@
+"""
+AST (abstract syntax tree) nodes for the c3 language.
+The tree is build by the parser.
+Then it is checked
+Finally code is generated from it.
+"""
+
+from ppci import SourceLocation
+
+
+class Node:
+    pass
+
+
+# Variables, parameters, local variables, constants and named types:
+class Symbol(Node):
+    def __init__(self, name):
+        self.name = name
+        self.refs = []
+
+    def addRef(self, r):
+        self.refs.append(r)
+
+    @property
+    def References(self):
+        return self.refs
+
+
+# Modules
+class Package(Node):
+    def __init__(self, name, loc):
+        self.name = name
+        self.loc = loc
+        self.declarations = []
+        self.imports = []
+
+    def __repr__(self):
+        return 'MODULE {}'.format(self.name)
+
+
+class Designator(Node):
+    def __init__(self, tname, loc):
+        self.tname = tname
+        self.loc = loc
+
+    def __repr__(self):
+        return 'DESIGNATOR {}'.format(self.tname)
+
+
+class ImportDesignator(Designator):
+    def __init__(self, tname, vname, loc):
+        super().__init__(tname, loc)
+        self.vname = vname
+
+    def __repr__(self):
+        return 'IMPORT DESIGNATOR {}:{}'.format(self.tname, self.vname)
+
+
+"""
+Type classes
+
+types must be comparable.
+
+There are the following types:
+- base type -> basic type (built in)
+- struct type -> a composite type that contains a list of named fields
+            of other types
+- function type
+"""
+
+
+class Type(Node):
+    pass
+
+
+class NamedType(Type, Symbol):
+    def __init__(self, name):
+        Symbol.__init__(self, name)
+
+
+class BaseType(NamedType):
+    def __init__(self, name):
+        super().__init__(name)
+
+    def __repr__(self):
+        return '{}'.format(self.name)
+
+
+class FunctionType(Type):
+    def __init__(self, parametertypes, returntype):
+        self.parametertypes = parametertypes
+        self.returntype = returntype
+
+    def __repr__(self):
+        params = ', '.join([str(v) for v in self.parametertypes])
+        return '{1} f({0})'.format(params, self.returntype)
+
+
+class PointerType(Type):
+    """ A type that points to data of some other type """
+    def __init__(self, ptype):
+        assert isinstance(ptype, Type) or isinstance(ptype, Designator)
+        self.ptype = ptype
+
+    def __repr__(self):
+        return '({}*)'.format(self.ptype)
+
+
+class StructField:
+    def __init__(self, name, typ):
+        self.name = name
+        self.typ = typ
+        self.offset = 0
+
+
+class StructureType(Type):
+    def __init__(self, mems):
+        self.mems = mems
+        for mem in mems:
+            assert type(mem) is StructField
+            assert type(mem.name) is str
+
+    def hasField(self, name):
+        for mem in self.mems:
+            if name == mem.name:
+                return True
+        return False
+
+    def fieldType(self, name):
+        return self.findField(name).typ
+
+    def fieldOffset(self, name):
+        return self.findField(name).offset
+
+    def findField(self, name):
+        for mem in self.mems:
+            if name == mem.name:
+                return mem
+        raise KeyError(name)
+
+    def __repr__(self):
+        return 'STRUCT'
+
+
+class DefinedType(NamedType):
+    """ A named type indicating another type """
+    def __init__(self, name, typ, loc):
+        assert isinstance(name, str)
+        super().__init__(name)
+        self.typ = typ
+        self.loc = loc
+
+    def __repr__(self):
+        return 'Named type {0} of type {1}'.format(self.name, self.typ)
+
+
+class Constant(Symbol):
+    def __init__(self, name, typ, value):
+        super().__init__(name)
+        self.typ = typ
+        self.value = value
+
+    def __repr__(self):
+        return 'CONSTANT {0} = {1}'.format(self.name, self.value)
+
+
+class Variable(Symbol):
+    def __init__(self, name, typ):
+        super().__init__(name)
+        self.typ = typ
+        self.ival = None
+        self.isLocal = False
+        self.isReadOnly = False
+        self.isParameter = False
+
+    def __repr__(self):
+        return 'Var {} [{}]'.format(self.name, self.typ)
+
+
+class LocalVariable(Variable):
+    def __init__(self, name, typ):
+        super().__init__(name, typ)
+        self.isLocal = True
+
+
+class FormalParameter(Variable):
+    def __init__(self, name, typ):
+        super().__init__(name, typ)
+        self.isParameter = True
+
+
+# Procedure types
+class Function(Symbol):
+    """ Actual implementation of a function """
+    def __init__(self, name, loc):
+        super().__init__(name)
+        self.loc = loc
+        self.declarations = []
+
+    def __repr__(self):
+        return 'Func {}'.format(self.name)
+
+
+# Operations / Expressions:
+class Expression(Node):
+    def __init__(self, loc):
+        self.loc = loc
+
+
+class Deref(Expression):
+    def __init__(self, ptr, loc):
+        super().__init__(loc)
+        assert isinstance(ptr, Expression)
+        self.ptr = ptr
+
+    def __repr__(self):
+        return 'DEREF {}'.format(self.ptr)
+
+
+class TypeCast(Expression):
+    def __init__(self, to_type, x, loc):
+        super().__init__(loc)
+        self.to_type = to_type
+        self.a = x
+
+    def __repr__(self):
+        return 'TYPECAST {}'.format(self.to_type)
+
+
+class FieldRef(Expression):
+    def __init__(self, base, field, loc):
+        super().__init__(loc)
+        assert isinstance(base, Expression)
+        assert isinstance(field, str)
+        self.base = base
+        self.field = field
+
+    def __repr__(self):
+        return 'FIELD {}.{}'.format(self.base, self.field)
+
+
+class Unop(Expression):
+    def __init__(self, op, a, loc):
+        super().__init__(loc)
+        assert isinstance(a, Expression)
+        assert isinstance(op, str)
+        self.a = a
+        self.op = op
+
+    def __repr__(self):
+        return 'UNOP {}'.format(self.op)
+
+
+class Binop(Expression):
+    def __init__(self, a, op, b, loc):
+        super().__init__(loc)
+        assert isinstance(a, Expression), type(a)
+        assert isinstance(b, Expression)
+        assert isinstance(op, str)
+        self.a = a
+        self.b = b
+        self.op = op   # Operation: '+', '-', '*', '/', 'mod'
+
+    def __repr__(self):
+        return 'BINOP {}'.format(self.op)
+
+
+class VariableUse(Expression):
+    def __init__(self, target, loc):
+        super().__init__(loc)
+        self.target = target
+
+    def __repr__(self):
+        return 'VAR USE {}'.format(self.target)
+
+
+class Literal(Expression):
+    def __init__(self, val, loc):
+        super().__init__(loc)
+        self.val = val
+
+    def __repr__(self):
+        return 'LITERAL {}'.format(self.val)
+
+
+class FunctionCall(Expression):
+    def __init__(self, proc, args, loc):
+        super().__init__(loc)
+        self.proc = proc
+        self.args = args
+
+    def __repr__(self):
+        return 'CALL {0} '.format(self.proc)
+
+
+# Statements
+class Statement(Node):
+    def __init__(self, loc):
+        self.loc = loc
+
+
+class CompoundStatement(Statement):
+    def __init__(self, statements):
+        super().__init__(None)
+        self.statements = statements
+        for s in self.statements:
+            assert isinstance(s, Statement)
+
+    def __repr__(self):
+        return 'COMPOUND STATEMENT'
+
+
+class ReturnStatement(Statement):
+    def __init__(self, expr, loc):
+        super().__init__(loc)
+        self.expr = expr
+
+    def __repr__(self):
+        return 'RETURN STATEMENT'
+
+
+class Assignment(Statement):
+    def __init__(self, lval, rval, loc):
+        super().__init__(loc)
+        assert isinstance(lval, Node)
+        assert isinstance(rval, Node)
+        self.lval = lval
+        self.rval = rval
+
+    def __repr__(self):
+        return 'ASSIGNMENT'
+
+
+class ExpressionStatement(Statement):
+    def __init__(self, ex, loc):
+        super().__init__(loc)
+        self.ex = ex
+
+    def __repr__(self):
+        return 'Epression'
+
+
+class IfStatement(Statement):
+    def __init__(self, condition, truestatement, falsestatement, loc):
+        super().__init__(loc)
+        self.condition = condition
+        self.truestatement = truestatement
+        self.falsestatement = falsestatement
+
+    def __repr__(self):
+        return 'IF-statement'
+
+
+class WhileStatement(Statement):
+    def __init__(self, condition, statement, loc):
+        super().__init__(loc)
+        self.condition = condition
+        self.statement = statement
+
+    def __repr__(self):
+        return 'WHILE-statement'