X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=db7aefe9ac3762a9234cd88d4b614dfc4c56ccd0;hp=7200679e1813723aca6857a70889663b096955b1;hb=7cd066816f7faab6f8f0eba1fca4dee67ee5dc3b;hpb=a29cc14162e911b36d18d1d1896216697c7dc0c1 diff --git a/source/programcompiler.h b/source/programcompiler.h index 7200679e..db7aefe9 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -12,8 +12,17 @@ class Program; class ProgramCompiler { -public: - struct Formatter: ProgramSyntax::NodeVisitor +private: + struct Visitor: ProgramSyntax::TraversingVisitor + { + ProgramSyntax::Stage *stage; + + Visitor(); + + virtual void apply(ProgramSyntax::Stage &); + }; + + struct Formatter: Visitor { std::string formatted; unsigned indent; @@ -41,8 +50,7 @@ public: virtual void visit(ProgramSyntax::Return &); }; -private: - struct VariableResolver: ProgramSyntax::TraversingVisitor + struct VariableResolver: Visitor { std::vector blocks; ProgramSyntax::StructDeclaration *type; @@ -59,20 +67,19 @@ private: virtual void visit(ProgramSyntax::InterfaceBlock &); }; - struct InterfaceGenerator: ProgramSyntax::TraversingVisitor + struct InterfaceGenerator: Visitor { - ProgramSyntax::Stage *stage; std::string in_prefix; std::string out_prefix; unsigned scope_level; - std::map > iface_declarations; + std::map iface_declarations; bool remove_node; - std::list > insert_nodes; + std::list insert_nodes; InterfaceGenerator(); static std::string get_out_prefix(ProgramSyntax::StageType); - void visit(ProgramSyntax::Stage &); + virtual void apply(ProgramSyntax::Stage &); virtual void visit(ProgramSyntax::Block &); std::string change_prefix(const std::string &, const std::string &) const; bool generate_interface(ProgramSyntax::VariableDeclaration &, const std::string &, const std::string &); @@ -82,15 +89,14 @@ private: virtual void visit(ProgramSyntax::Passthrough &); }; - struct VariableRenamer: ProgramSyntax::TraversingVisitor + struct VariableRenamer: Visitor { virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; - struct UnusedVariableLocator: ProgramSyntax::TraversingVisitor + struct UnusedVariableLocator: Visitor { - ProgramSyntax::Stage *stage; std::set unused_nodes; std::map assignments; bool assignment; @@ -98,7 +104,6 @@ private: UnusedVariableLocator(); - void visit(ProgramSyntax::Stage &); virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::BinaryExpression &); @@ -106,9 +111,8 @@ private: virtual void visit(ProgramSyntax::VariableDeclaration &); }; - struct NodeRemover: ProgramSyntax::TraversingVisitor + struct NodeRemover: Visitor { - ProgramSyntax::Stage *stage; std::set to_remove; unsigned n_removed; bool immutable_block; @@ -116,7 +120,6 @@ private: NodeRemover(); - void visit(ProgramSyntax::Stage &); virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); @@ -138,7 +141,8 @@ private: void generate(ProgramSyntax::Stage &); void optimize(ProgramSyntax::Stage &); static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); - static void resolve_variables(ProgramSyntax::Stage &); + template + static void apply(ProgramSyntax::Stage &); std::string create_source(ProgramSyntax::Stage &); };