X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramsyntax.cpp;h=6e4d070e2b3e480cd29b09ccabbb7e7ae4194415;hb=a29cc14162e911b36d18d1d1896216697c7dc0c1;hp=09ba82c31fddd42bd10ab2d524ae8f9154e37035;hpb=6e6ee01b68056b23c6709d7f60396710dd7623b9;p=libs%2Fgl.git diff --git a/source/programsyntax.cpp b/source/programsyntax.cpp index 09ba82c3..6e4d070e 100644 --- a/source/programsyntax.cpp +++ b/source/programsyntax.cpp @@ -10,13 +10,65 @@ Block::Block(): use_braces(false) { } -Block::~Block() +void Block::visit(NodeVisitor &visitor) { - for(vector::iterator i=body.begin(); i!=body.end(); ++i) - delete *i; + visitor.visit(*this); } -void Block::visit(NodeVisitor &visitor) + +void Literal::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + +void ParenthesizedExpression::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + +VariableReference::VariableReference(): + declaration(0) +{ } + +void VariableReference::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + +void MemberAccess::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + +UnaryExpression::UnaryExpression(): + prefix(true) +{ } + +void UnaryExpression::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + +BinaryExpression::BinaryExpression(): + assignment(false) +{ } + +void BinaryExpression::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + + +FunctionCall::FunctionCall(): + constructor(false) +{ } + +void FunctionCall::visit(NodeVisitor &visitor) { visitor.visit(*this); } @@ -47,7 +99,9 @@ void StructDeclaration::visit(NodeVisitor &visitor) VariableDeclaration::VariableDeclaration(): constant(false), - array(false) + type_declaration(0), + array(false), + linked_declaration(0) { } void VariableDeclaration::visit(NodeVisitor &visitor) @@ -71,19 +125,19 @@ FunctionDeclaration::FunctionDeclaration(): definition(false) { } -FunctionDeclaration::~FunctionDeclaration() +void FunctionDeclaration::visit(NodeVisitor &visitor) { - for(vector::iterator i=parameters.begin(); i!=parameters.end(); ++i) - delete *i; + visitor.visit(*this); } -void FunctionDeclaration::visit(NodeVisitor &visitor) + +void Conditional::visit(NodeVisitor &visitor) { visitor.visit(*this); } -void Conditional::visit(NodeVisitor &visitor) +void Passthrough::visit(NodeVisitor &visitor) { visitor.visit(*this); } @@ -95,32 +149,113 @@ void Return::visit(NodeVisitor &visitor) } -Iteration::Iteration(): - init_statement(0) -{ } +void Iteration::visit(NodeVisitor &visitor) +{ + visitor.visit(*this); +} + -Iteration::~Iteration() +void TraversingVisitor::visit(Block &block) { - delete init_statement; + for(list >::iterator i=block.body.begin(); i!=block.body.end(); ++i) + (*i)->visit(*this); } -void Iteration::visit(NodeVisitor &visitor) +void TraversingVisitor::visit(ParenthesizedExpression &parexpr) { - visitor.visit(*this); + parexpr.expression->visit(*this); +} + +void TraversingVisitor::visit(MemberAccess &memacc) +{ + memacc.left->visit(*this); +} + +void TraversingVisitor::visit(UnaryExpression &unary) +{ + unary.expression->visit(*this); +} + +void TraversingVisitor::visit(BinaryExpression &binary) +{ + binary.left->visit(*this); + binary.right->visit(*this); +} + +void TraversingVisitor::visit(FunctionCall &call) +{ + for(vector >::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i) + (*i)->visit(*this); +} + +void TraversingVisitor::visit(ExpressionStatement &expr) +{ + expr.expression->visit(*this); +} + +void TraversingVisitor::visit(StructDeclaration &strct) +{ + strct.members.visit(*this); +} + +void TraversingVisitor::visit(VariableDeclaration &var) +{ + if(var.init_expression) + var.init_expression->visit(*this); + if(var.array_size) + var.array_size->visit(*this); +} + +void TraversingVisitor::visit(InterfaceBlock &iface) +{ + iface.members.visit(*this); +} + +void TraversingVisitor::visit(FunctionDeclaration &func) +{ + for(vector >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i) + (*i)->visit(*this); + func.body.visit(*this); +} + +void TraversingVisitor::visit(Conditional &cond) +{ + cond.condition->visit(*this); + cond.body.visit(*this); + cond.else_body.visit(*this); +} + +void TraversingVisitor::visit(Iteration &iter) +{ + iter.init_statement->visit(*this); + if(iter.condition) + iter.condition->visit(*this); + if(iter.loop_expression) + iter.loop_expression->visit(*this); + iter.body.visit(*this); +} + +void TraversingVisitor::visit(Passthrough &pass) +{ + if(pass.subscript) + pass.subscript->visit(*this); +} + +void TraversingVisitor::visit(Return &ret) +{ + if(ret.expression) + ret.expression->visit(*this); } -Context::Context(ContextType t): +Stage::Stage(StageType t): type(t), - present(false) + previous(0) { } Module::Module(): - global_context(GLOBAL), - vertex_context(VERTEX), - geometry_context(GEOMETRY), - fragment_context(FRAGMENT) + shared(SHARED) { } } // namespace ProgramSyntax