X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=2a31a962b989a5cec0021e82584f75a7036ccac4;hb=8812fe9fc71b997246ddfdedb8a91932b679d2d3;hp=0c87acf0b953a40198b60299f4288b57a0c59cbe;hpb=a0caabaed3aeb8947133d78986bfb4ae5ae3c893;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 0c87acf0..2a31a962 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -38,6 +38,7 @@ private: Formatter(); + virtual void apply(ProgramSyntax::Stage &); const std::string &get_result() const { return formatted; } virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Literal &); @@ -51,6 +52,7 @@ private: virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::Import &); virtual void visit(ProgramSyntax::Layout &); + virtual void visit(ProgramSyntax::InterfaceLayout &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &); @@ -108,14 +110,32 @@ private: virtual void visit(ProgramSyntax::InterfaceBlock &); }; - struct InterfaceGenerator: Visitor + struct FunctionResolver: Visitor + { + std::map > functions; + + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + }; + + struct BlockModifier: Visitor + { + bool remove_node; + std::list insert_nodes; + + BlockModifier(); + + void flatten_block(ProgramSyntax::Block &); + void apply_and_increment(ProgramSyntax::Block &, std::list >::iterator &); + virtual void visit(ProgramSyntax::Block &); + }; + + struct InterfaceGenerator: BlockModifier { std::string in_prefix; std::string out_prefix; unsigned scope_level; std::map iface_declarations; - bool remove_node; - std::list insert_nodes; InterfaceGenerator(); @@ -136,6 +156,37 @@ private: virtual void visit(ProgramSyntax::VariableDeclaration &); }; + struct ExpressionEvaluator: ProgramSyntax::NodeVisitor + { + typedef std::map ValueMap; + + const ValueMap *variable_values; + float result; + bool result_valid; + + ExpressionEvaluator(); + ExpressionEvaluator(const ValueMap &); + + virtual void visit(ProgramSyntax::Literal &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::UnaryExpression &); + virtual void visit(ProgramSyntax::BinaryExpression &); + }; + + struct ConstantConditionEliminator: BlockModifier + { + unsigned scope_level; + ExpressionEvaluator::ValueMap variable_values; + + ConstantConditionEliminator(); + + virtual void visit(ProgramSyntax::Block &); + virtual void visit(ProgramSyntax::Assignment &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::Conditional &); + virtual void visit(ProgramSyntax::Iteration &); + }; + struct UnusedVariableLocator: Visitor { struct AssignmentList @@ -174,6 +225,18 @@ private: virtual void visit(ProgramSyntax::Iteration &); }; + struct UnusedFunctionLocator: Visitor + { + typedef std::set ResultType; + + std::set unused_nodes; + std::set used_definitions; + + const ResultType &get_result() const { return unused_nodes; } + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + }; + struct NodeRemover: Visitor { std::set to_remove; @@ -185,6 +248,22 @@ private: virtual void visit(ProgramSyntax::VariableDeclaration &); }; + struct LegacyConverter: BlockModifier + { + Version target_version; + std::string type; + std::string frag_out_name; + + LegacyConverter(); + LegacyConverter(const Version &); + + bool check_version(const Version &); + virtual void visit(ProgramSyntax::VariableReference &); + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::VariableDeclaration &); + virtual void visit(ProgramSyntax::InterfaceBlock &); + }; + Resources *resources; ProgramParser parser; ProgramSyntax::Module *module;