virtual void visit(ProgramSyntax::InterfaceBlock &);
};
+ struct FunctionResolver: Visitor
+ {
+ std::map<std::string, std::vector<ProgramSyntax::FunctionDeclaration *> > functions;
+
+ virtual void visit(ProgramSyntax::FunctionCall &);
+ virtual void visit(ProgramSyntax::FunctionDeclaration &);
+ };
+
struct InterfaceGenerator: Visitor
{
std::string in_prefix;
virtual void visit(ProgramSyntax::VariableDeclaration &);
};
+ struct ExpressionEvaluator: ProgramSyntax::NodeVisitor
+ {
+ typedef std::map<ProgramSyntax::VariableDeclaration *, ProgramSyntax::Expression *> 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
virtual void visit(ProgramSyntax::Iteration &);
};
+ struct UnusedFunctionLocator: Visitor
+ {
+ typedef std::set<ProgramSyntax::Node *> ResultType;
+
+ std::set<ProgramSyntax::Node *> unused_nodes;
+ std::set<ProgramSyntax::FunctionDeclaration *> 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<ProgramSyntax::Node *> to_remove;