X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=978b01e2d159135d3dcf5dbb7b0ef6b4b5bb6c0d;hb=961715848c111907b5f443c5b545a429b40583e6;hp=63ead7a4c8997f0a6f3bd4d76f8bee10da2a9958;hpb=70f9fe2964700fc199ab3cabb26f9b14d078c56b;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 63ead7a4..978b01e2 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -1,6 +1,7 @@ #ifndef MSP_GL_PROGRAMCOMPILER_H_ #define MSP_GL_PROGRAMCOMPILER_H_ +#include #include "programparser.h" #include "programsyntax.h" @@ -41,6 +42,75 @@ public: }; private: + struct VariableResolver: ProgramSyntax::TraversingVisitor + { + std::vector blocks; + ProgramSyntax::StructDeclaration *type; + bool anonymous; + + VariableResolver(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::MemberAccess &); + virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::StructDeclaration &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::InterfaceBlock &); + }; + + struct InterfaceGenerator: ProgramSyntax::TraversingVisitor + { + ProgramSyntax::Context *context; + std::string in_prefix; + std::string out_prefix; + unsigned scope_level; + std::map > iface_declarations; + bool remove_node; + std::list > insert_nodes; + + InterfaceGenerator(); + + static std::string get_out_prefix(ProgramSyntax::ContextType); + void visit(ProgramSyntax::Context &); + 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 &); + void insert_assignment(const std::string &, ProgramSyntax::Expression *); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::Passthrough &); + }; + + struct VariableRenamer: ProgramSyntax::TraversingVisitor + { + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + + struct UnusedVariableLocator: ProgramSyntax::TraversingVisitor + { + std::set unused_variables; + + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::MemberAccess &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + }; + + struct NodeRemover: ProgramSyntax::TraversingVisitor + { + std::set to_remove; + unsigned n_removed; + bool immutable_block; + bool remove_block; + + NodeRemover(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::StructDeclaration &); + virtual void visit(ProgramSyntax::InterfaceBlock &); + }; + ProgramParser parser; ProgramSyntax::Module *module; @@ -55,6 +125,7 @@ private: void process(); void process(ProgramSyntax::Context &); static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); + static void resolve_variables(ProgramSyntax::Context &); std::string format_context(ProgramSyntax::Context &); };