Mercurial > lcfOS
annotate python/c3/astnodes.py @ 221:848c4b15fd0b
pointers
author | Windel Bouwman |
---|---|
date | Mon, 08 Jul 2013 22:21:44 +0200 |
parents | 3f6c30a5d234 |
children | c3f1ce8b638f |
rev | line source |
---|---|
148 | 1 """ |
213 | 2 AST (abstract syntax tree) nodes for the c3 language. |
3 The tree is build by the parser. | |
4 Then it is checked | |
5 Finally code is generated from it. | |
148 | 6 """ |
7 | |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
8 from ppci import SourceLocation |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
9 |
148 | 10 class Node: |
163 | 11 pass |
148 | 12 |
213 | 13 # Modules |
14 class Package(Node): | |
15 def __init__(self, name, loc): | |
16 self.name = name | |
17 self.loc = loc | |
18 self.declarations = [] | |
19 def __repr__(self): | |
20 return 'PACKAGE {}'.format(self.name) | |
21 | |
150 | 22 class Designator(Node): |
213 | 23 def __init__(self, tname, loc): |
24 self.tname = tname | |
25 self.loc = loc | |
26 def __repr__(self): | |
27 return 'DESIGNATOR {}'.format(self.tname) | |
148 | 28 |
29 """ | |
30 Type classes | |
213 | 31 |
32 types must be comparable. | |
33 | |
34 There are the following types: | |
35 - base type | |
36 - struct type | |
37 - pointer type | |
38 - typedef type | |
39 - function type | |
148 | 40 """ |
41 | |
149 | 42 class Type(Node): |
148 | 43 def isType(self, b): |
44 return isType(self, b) | |
45 | |
46 class BaseType(Type): | |
47 def __init__(self, name): | |
48 self.name = name | |
49 def __repr__(self): | |
212 | 50 return '{}'.format(self.name) |
148 | 51 |
52 class FunctionType(Type): | |
167 | 53 def __init__(self, parametertypes, returntype): |
54 self.parametertypes = parametertypes | |
148 | 55 self.returntype = returntype |
56 def __repr__(self): | |
167 | 57 params = ', '.join([str(v) for v in self.parametertypes]) |
165 | 58 return '{1} f({0})'.format(params, self.returntype) |
148 | 59 |
213 | 60 class PointerType(Type): |
61 def __init__(self, ptype): | |
62 self.ptype = ptype | |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
63 def __repr__(self): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
64 return '({}*)'.format(self.ptype) |
213 | 65 |
66 class StructureType(Type): | |
67 def __init__(self, mems): | |
68 self.mems = mems | |
69 | |
148 | 70 class DefinedType(Type): |
71 def __init__(self, name, typ): | |
72 self.name = name | |
73 self.typ = typ | |
74 def __repr__(self): | |
75 return 'Named type {0} of type {1}'.format(self.name, self.typ) | |
76 | |
221 | 77 #class TypeCast(Node): |
78 # def __init__(self, | |
79 | |
148 | 80 # Variables, parameters, local variables, constants: |
81 class Symbol(Node): | |
213 | 82 def __init__(self, name): |
163 | 83 self.name = name |
84 self.refs = [] | |
213 | 85 def addRef(self, r): |
163 | 86 self.refs.append(r) |
213 | 87 @property |
88 def References(self): | |
163 | 89 return self.refs |
148 | 90 |
91 class Constant(Symbol): | |
213 | 92 def __init__(self, name, typ, value): |
163 | 93 super().__init__(name) |
94 self.typ = typ | |
148 | 95 self.value = value |
213 | 96 def __repr__(self): |
148 | 97 return 'CONSTANT {0} = {1}'.format(self.name, self.value) |
98 | |
99 class Variable(Symbol): | |
213 | 100 def __init__(self, name, typ): |
163 | 101 super().__init__(name) |
148 | 102 self.typ = typ |
213 | 103 self.ival = None |
148 | 104 self.isLocal = False |
105 self.isReadOnly = False | |
106 self.isParameter = False | |
107 def __repr__(self): | |
217 | 108 return 'Var {}'.format(self.name) |
148 | 109 |
150 | 110 # Procedure types |
111 class Function(Symbol): | |
213 | 112 """ Actual implementation of a function """ |
113 def __init__(self, name, loc): | |
114 super().__init__(name) | |
115 self.loc = loc | |
215 | 116 self.declarations = [] |
213 | 117 |
118 def __repr__(self): | |
217 | 119 return 'Func {}'.format(self.name) |
148 | 120 |
163 | 121 # Operations / Expressions: |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
122 class Expression(Node): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
123 pass |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
124 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
125 class Unop(Expression): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
126 def __init__(self, op, a, loc): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
127 assert isinstance(a, Expression) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
128 assert isinstance(op, str) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
129 self.a = a |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
130 self.op = op |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
131 self.loc = loc |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
132 def __repr__(self): |
212 | 133 return 'UNOP {}'.format(self.op) |
148 | 134 |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
135 class Binop(Expression): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
136 def __init__(self, a, op, b, loc): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
137 assert isinstance(a, Expression), type(a) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
138 assert isinstance(b, Expression) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
139 assert isinstance(op, str) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
140 self.a = a |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
141 self.b = b |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
142 self.op = op # Operation: '+', '-', '*', '/', 'mod' |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
143 self.loc = loc |
148 | 144 |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
145 def __repr__(self): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
146 return 'BINOP {}'.format(self.op) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
147 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
148 class VariableUse(Expression): |
213 | 149 def __init__(self, target, loc): |
150 | 150 self.target = target |
213 | 151 self.loc = loc |
150 | 152 def __repr__(self): |
163 | 153 nm = self.target.name if hasattr(self.target, 'name') else '' |
212 | 154 return 'VAR USE {}'.format(nm) |
163 | 155 |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
156 class Literal(Expression): |
213 | 157 def __init__(self, val, loc): |
163 | 158 self.val = val |
213 | 159 self.loc = loc |
163 | 160 def __repr__(self): |
212 | 161 return 'LITERAL {}'.format(self.val) |
150 | 162 |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
163 class FunctionCall(Expression): |
213 | 164 def __init__(self, proc, args, loc): |
148 | 165 self.proc = proc |
166 self.args = args | |
213 | 167 self.loc = loc |
148 | 168 def __repr__(self): |
169 return 'CALL {0} '.format(self.proc) | |
170 | |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
171 # Statements |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
172 class Statement(Node): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
173 pass |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
174 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
175 class CompoundStatement(Statement): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
176 def __init__(self, statements): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
177 self.statements = statements |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
178 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
179 def __repr__(self): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
180 return 'COMPOUND STATEMENT' |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
181 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
182 class EmptyStatement(Statement): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
183 def __repr__(self): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
184 return 'NOP' |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
185 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
186 class ReturnStatement(Statement): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
187 def __init__(self, expr, loc): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
188 self.expr = expr |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
189 self.loc = loc |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
190 def __repr__(self): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
191 return 'RETURN STATEMENT' |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
192 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
193 class Assignment(Node): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
194 def __init__(self, lval, rval, loc): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
195 assert isinstance(lval, Node) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
196 assert isinstance(rval, Node) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
197 assert isinstance(loc, SourceLocation) |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
198 self.lval = lval |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
199 self.rval = rval |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
200 self.loc = loc |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
201 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
202 def __repr__(self): |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
203 return 'ASSIGNMENT' |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
204 |
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
205 class IfStatement(Statement): |
213 | 206 def __init__(self, condition, truestatement, falsestatement, loc): |
148 | 207 self.condition = condition |
208 self.truestatement = truestatement | |
209 self.falsestatement = falsestatement | |
213 | 210 self.loc = loc |
148 | 211 def __repr__(self): |
212 return 'IF-statement' | |
213 | |
220
3f6c30a5d234
Major change in expression parsing to enable pointers and structs
Windel Bouwman
parents:
217
diff
changeset
|
214 class WhileStatement(Statement): |
213 | 215 def __init__(self, condition, statement, loc): |
148 | 216 self.condition = condition |
213 | 217 self.statement = statement |
218 self.loc = loc | |
148 | 219 def __repr__(self): |
220 return 'WHILE-statement' | |
221 |