9 const Operator Operator::operators[] =
11 { "[", 2, BINARY, LEFT_TO_RIGHT },
12 { "(", 2, BINARY, LEFT_TO_RIGHT },
13 { ".", 2, BINARY, LEFT_TO_RIGHT },
14 { "++", 2, POSTFIX, LEFT_TO_RIGHT },
15 { "--", 2, POSTFIX, LEFT_TO_RIGHT },
16 { "++", 3, PREFIX, RIGHT_TO_LEFT },
17 { "--", 3, PREFIX, RIGHT_TO_LEFT },
18 { "+", 3, PREFIX, RIGHT_TO_LEFT },
19 { "-", 3, PREFIX, RIGHT_TO_LEFT },
20 { "~", 3, PREFIX, RIGHT_TO_LEFT },
21 { "!", 3, PREFIX, RIGHT_TO_LEFT },
22 { "*", 4, BINARY, LEFT_TO_RIGHT },
23 { "/", 4, BINARY, LEFT_TO_RIGHT },
24 { "%", 4, BINARY, LEFT_TO_RIGHT },
25 { "+", 5, BINARY, LEFT_TO_RIGHT },
26 { "-", 5, BINARY, LEFT_TO_RIGHT },
27 { "<<", 6, BINARY, LEFT_TO_RIGHT },
28 { ">>", 6, BINARY, LEFT_TO_RIGHT },
29 { "<", 7, BINARY, LEFT_TO_RIGHT },
30 { ">", 7, BINARY, LEFT_TO_RIGHT },
31 { "<=", 7, BINARY, LEFT_TO_RIGHT },
32 { ">=", 7, BINARY, LEFT_TO_RIGHT },
33 { "==", 8, BINARY, LEFT_TO_RIGHT },
34 { "!=", 8, BINARY, LEFT_TO_RIGHT },
35 { "&", 9, BINARY, LEFT_TO_RIGHT },
36 { "^", 10, BINARY, LEFT_TO_RIGHT },
37 { "|", 11, BINARY, LEFT_TO_RIGHT },
38 { "&&", 12, BINARY, LEFT_TO_RIGHT },
39 { "^^", 13, BINARY, LEFT_TO_RIGHT },
40 { "||", 14, BINARY, LEFT_TO_RIGHT },
41 { "?", 15, BINARY, RIGHT_TO_LEFT },
42 { ":", 15, BINARY, RIGHT_TO_LEFT },
43 { "=", 16, BINARY, RIGHT_TO_LEFT },
44 { "+=", 16, BINARY, RIGHT_TO_LEFT },
45 { "-=", 16, BINARY, RIGHT_TO_LEFT },
46 { "*=", 16, BINARY, RIGHT_TO_LEFT },
47 { "/=", 16, BINARY, RIGHT_TO_LEFT },
48 { "%=", 16, BINARY, RIGHT_TO_LEFT },
49 { "<<=", 16, BINARY, RIGHT_TO_LEFT },
50 { ">>=", 16, BINARY, RIGHT_TO_LEFT },
51 { "&=", 16, BINARY, RIGHT_TO_LEFT },
52 { "^=", 16, BINARY, RIGHT_TO_LEFT },
53 { "|=", 16, BINARY, RIGHT_TO_LEFT },
54 { ",", 17, BINARY, LEFT_TO_RIGHT },
55 { { 0 }, 18, NO_OPERATOR, LEFT_TO_RIGHT }
60 NodeContainer<C>::NodeContainer(const NodeContainer &c):
63 for(typename C::iterator i=this->begin(); i!=this->end(); ++i)
68 Statement::Statement():
78 void Block::visit(NodeVisitor &visitor)
84 void Literal::visit(NodeVisitor &visitor)
90 void ParenthesizedExpression::visit(NodeVisitor &visitor)
96 VariableReference::VariableReference():
100 void VariableReference::visit(NodeVisitor &visitor)
102 visitor.visit(*this);
106 void MemberAccess::visit(NodeVisitor &visitor)
108 visitor.visit(*this);
112 UnaryExpression::UnaryExpression():
116 void UnaryExpression::visit(NodeVisitor &visitor)
118 visitor.visit(*this);
122 void BinaryExpression::visit(NodeVisitor &visitor)
124 visitor.visit(*this);
128 Assignment::Assignment():
129 self_referencing(false),
130 target_declaration(0)
133 void Assignment::visit(NodeVisitor &visitor)
135 visitor.visit(*this);
139 FunctionCall::FunctionCall():
144 void FunctionCall::visit(NodeVisitor &visitor)
146 visitor.visit(*this);
150 void ExpressionStatement::visit(NodeVisitor &visitor)
152 visitor.visit(*this);
156 void Import::visit(NodeVisitor &visitor)
158 visitor.visit(*this);
162 void Precision::visit(NodeVisitor &visitor)
164 visitor.visit(*this);
168 void Layout::visit(NodeVisitor &visitor)
170 visitor.visit(*this);
174 void InterfaceLayout::visit(NodeVisitor &visitor)
176 visitor.visit(*this);
180 StructDeclaration::StructDeclaration()
182 members.use_braces = true;
185 void StructDeclaration::visit(NodeVisitor &visitor)
187 visitor.visit(*this);
191 VariableDeclaration::VariableDeclaration():
195 linked_declaration(0)
198 void VariableDeclaration::visit(NodeVisitor &visitor)
200 visitor.visit(*this);
204 InterfaceBlock::InterfaceBlock():
207 members.use_braces = true;
210 void InterfaceBlock::visit(NodeVisitor &visitor)
212 visitor.visit(*this);
216 FunctionDeclaration::FunctionDeclaration():
220 FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other):
221 return_type(other.return_type),
223 parameters(other.parameters),
224 definition(other.definition==&other ? this : other.definition),
228 void FunctionDeclaration::visit(NodeVisitor &visitor)
230 visitor.visit(*this);
234 void Conditional::visit(NodeVisitor &visitor)
236 visitor.visit(*this);
240 void Iteration::visit(NodeVisitor &visitor)
242 visitor.visit(*this);
246 void Passthrough::visit(NodeVisitor &visitor)
248 visitor.visit(*this);
252 void Return::visit(NodeVisitor &visitor)
254 visitor.visit(*this);
258 void Jump::visit(NodeVisitor &visitor)
260 visitor.visit(*this);
264 void NodeVisitor::visit(Assignment &assign)
266 visit(static_cast<BinaryExpression &>(assign));
270 void TraversingVisitor::visit(Block &block)
272 for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
276 void TraversingVisitor::visit(ParenthesizedExpression &parexpr)
278 parexpr.expression->visit(*this);
281 void TraversingVisitor::visit(MemberAccess &memacc)
283 memacc.left->visit(*this);
286 void TraversingVisitor::visit(UnaryExpression &unary)
288 unary.expression->visit(*this);
291 void TraversingVisitor::visit(BinaryExpression &binary)
293 binary.left->visit(*this);
294 binary.right->visit(*this);
297 void TraversingVisitor::visit(FunctionCall &call)
299 for(NodeArray<Expression>::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
303 void TraversingVisitor::visit(ExpressionStatement &expr)
305 expr.expression->visit(*this);
308 void TraversingVisitor::visit(InterfaceLayout &layout)
310 layout.layout.visit(*this);
313 void TraversingVisitor::visit(StructDeclaration &strct)
315 strct.members.visit(*this);
318 void TraversingVisitor::visit(VariableDeclaration &var)
321 var.layout->visit(*this);
322 if(var.init_expression)
323 var.init_expression->visit(*this);
325 var.array_size->visit(*this);
328 void TraversingVisitor::visit(InterfaceBlock &iface)
330 iface.members.visit(*this);
333 void TraversingVisitor::visit(FunctionDeclaration &func)
335 for(NodeArray<VariableDeclaration>::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
337 func.body.visit(*this);
340 void TraversingVisitor::visit(Conditional &cond)
342 cond.condition->visit(*this);
343 cond.body.visit(*this);
344 cond.else_body.visit(*this);
347 void TraversingVisitor::visit(Iteration &iter)
349 if(iter.init_statement)
350 iter.init_statement->visit(*this);
352 iter.condition->visit(*this);
353 if(iter.loop_expression)
354 iter.loop_expression->visit(*this);
355 iter.body.visit(*this);
358 void TraversingVisitor::visit(Passthrough &pass)
361 pass.subscript->visit(*this);
364 void TraversingVisitor::visit(Return &ret)
367 ret.expression->visit(*this);
371 Stage::Stage(StageType t):