X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=8c4034d4e906baae7812ee66ecc1b84abff39448;hb=00be85f53c5bec0be00a7ed6271e1f5a38e0b534;hp=2a31a962b989a5cec0021e82584f75a7036ccac4;hpb=8812fe9fc71b997246ddfdedb8a91932b679d2d3;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 2a31a962..8c4034d4 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -121,12 +121,12 @@ private: struct BlockModifier: Visitor { bool remove_node; - std::list insert_nodes; + std::list > insert_nodes; BlockModifier(); void flatten_block(ProgramSyntax::Block &); - void apply_and_increment(ProgramSyntax::Block &, std::list >::iterator &); + void apply_and_increment(ProgramSyntax::Block &, std::list >::iterator &); virtual void visit(ProgramSyntax::Block &); }; @@ -135,7 +135,7 @@ private: std::string in_prefix; std::string out_prefix; unsigned scope_level; - std::map iface_declarations; + std::map > iface_declarations; InterfaceGenerator(); @@ -156,6 +156,29 @@ private: virtual void visit(ProgramSyntax::VariableDeclaration &); }; + struct DeclarationReorderer: Visitor + { + enum DeclarationKind + { + NO_DECLARATION, + LAYOUT, + STRUCT, + VARIABLE, + FUNCTION + }; + + DeclarationKind kind; + + DeclarationReorderer(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::InterfaceLayout &) { kind = LAYOUT; } + virtual void visit(ProgramSyntax::StructDeclaration &) { kind = STRUCT; } + virtual void visit(ProgramSyntax::VariableDeclaration &) { kind = VARIABLE; } + virtual void visit(ProgramSyntax::InterfaceBlock &) { kind = VARIABLE; } + virtual void visit(ProgramSyntax::FunctionDeclaration &) { kind = FUNCTION; } + }; + struct ExpressionEvaluator: ProgramSyntax::NodeVisitor { typedef std::map ValueMap; @@ -168,6 +191,7 @@ private: ExpressionEvaluator(const ValueMap &); virtual void visit(ProgramSyntax::Literal &); + virtual void visit(ProgramSyntax::ParenthesizedExpression &); virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::UnaryExpression &); virtual void visit(ProgramSyntax::BinaryExpression &);