X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=8681d3638a032cabd389879922fe7378c4a45a76;hb=f1c6ef565577ac322693255d764eea1f2cab9e77;hp=0c87acf0b953a40198b60299f4288b57a0c59cbe;hpb=a0caabaed3aeb8947133d78986bfb4ae5ae3c893;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 0c87acf0..8681d363 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -108,6 +108,14 @@ private: virtual void visit(ProgramSyntax::InterfaceBlock &); }; + struct FunctionResolver: Visitor + { + std::map > functions; + + virtual void visit(ProgramSyntax::FunctionCall &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + }; + struct InterfaceGenerator: Visitor { std::string in_prefix; @@ -136,6 +144,39 @@ 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: Visitor + { + unsigned scope_level; + ExpressionEvaluator::ValueMap variable_values; + bool remove_node; + ProgramSyntax::Block *replacement_block; + + 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 +215,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;