1 #include "programsyntax.h"
7 namespace ProgramSyntax {
10 NodeContainer<C>::NodeContainer(const NodeContainer &c):
13 for(typename C::iterator i=this->begin(); i!=this->end(); ++i)
22 void Block::visit(NodeVisitor &visitor)
28 void Literal::visit(NodeVisitor &visitor)
34 void ParenthesizedExpression::visit(NodeVisitor &visitor)
40 VariableReference::VariableReference():
44 void VariableReference::visit(NodeVisitor &visitor)
50 void MemberAccess::visit(NodeVisitor &visitor)
56 UnaryExpression::UnaryExpression():
60 void UnaryExpression::visit(NodeVisitor &visitor)
66 void BinaryExpression::visit(NodeVisitor &visitor)
72 Assignment::Assignment():
73 self_referencing(false),
77 void Assignment::visit(NodeVisitor &visitor)
83 FunctionCall::FunctionCall():
88 void FunctionCall::visit(NodeVisitor &visitor)
94 void ExpressionStatement::visit(NodeVisitor &visitor)
100 void Import::visit(NodeVisitor &visitor)
102 visitor.visit(*this);
106 void Layout::visit(NodeVisitor &visitor)
108 visitor.visit(*this);
112 void InterfaceLayout::visit(NodeVisitor &visitor)
114 visitor.visit(*this);
118 StructDeclaration::StructDeclaration()
120 members.use_braces = true;
123 void StructDeclaration::visit(NodeVisitor &visitor)
125 visitor.visit(*this);
129 VariableDeclaration::VariableDeclaration():
133 linked_declaration(0)
136 void VariableDeclaration::visit(NodeVisitor &visitor)
138 visitor.visit(*this);
142 InterfaceBlock::InterfaceBlock():
145 members.use_braces = true;
148 void InterfaceBlock::visit(NodeVisitor &visitor)
150 visitor.visit(*this);
154 FunctionDeclaration::FunctionDeclaration():
158 FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other):
159 return_type(other.return_type),
161 parameters(other.parameters),
162 definition(other.definition==&other ? this : other.definition),
166 void FunctionDeclaration::visit(NodeVisitor &visitor)
168 visitor.visit(*this);
172 void Conditional::visit(NodeVisitor &visitor)
174 visitor.visit(*this);
178 void Iteration::visit(NodeVisitor &visitor)
180 visitor.visit(*this);
184 void Passthrough::visit(NodeVisitor &visitor)
186 visitor.visit(*this);
190 void Return::visit(NodeVisitor &visitor)
192 visitor.visit(*this);
196 void NodeVisitor::visit(Assignment &assign)
198 visit(static_cast<BinaryExpression &>(assign));
202 void TraversingVisitor::visit(Block &block)
204 for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); ++i)
208 void TraversingVisitor::visit(ParenthesizedExpression &parexpr)
210 parexpr.expression->visit(*this);
213 void TraversingVisitor::visit(MemberAccess &memacc)
215 memacc.left->visit(*this);
218 void TraversingVisitor::visit(UnaryExpression &unary)
220 unary.expression->visit(*this);
223 void TraversingVisitor::visit(BinaryExpression &binary)
225 binary.left->visit(*this);
226 binary.right->visit(*this);
229 void TraversingVisitor::visit(FunctionCall &call)
231 for(vector<RefPtr<Expression> >::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
235 void TraversingVisitor::visit(ExpressionStatement &expr)
237 expr.expression->visit(*this);
240 void TraversingVisitor::visit(InterfaceLayout &layout)
242 layout.layout.visit(*this);
245 void TraversingVisitor::visit(StructDeclaration &strct)
247 strct.members.visit(*this);
250 void TraversingVisitor::visit(VariableDeclaration &var)
253 var.layout->visit(*this);
254 if(var.init_expression)
255 var.init_expression->visit(*this);
257 var.array_size->visit(*this);
260 void TraversingVisitor::visit(InterfaceBlock &iface)
262 iface.members.visit(*this);
265 void TraversingVisitor::visit(FunctionDeclaration &func)
267 for(vector<RefPtr<VariableDeclaration> >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
269 func.body.visit(*this);
272 void TraversingVisitor::visit(Conditional &cond)
274 cond.condition->visit(*this);
275 cond.body.visit(*this);
276 cond.else_body.visit(*this);
279 void TraversingVisitor::visit(Iteration &iter)
281 iter.init_statement->visit(*this);
283 iter.condition->visit(*this);
284 if(iter.loop_expression)
285 iter.loop_expression->visit(*this);
286 iter.body.visit(*this);
289 void TraversingVisitor::visit(Passthrough &pass)
292 pass.subscript->visit(*this);
295 void TraversingVisitor::visit(Return &ret)
298 ret.expression->visit(*this);
302 Stage::Stage(StageType t):
312 } // namespace ProgramSyntax