+ struct FunctionResolver: Visitor
+ {
+ std::map<std::string, std::vector<ProgramSyntax::FunctionDeclaration *> > functions;
+
+ virtual void visit(ProgramSyntax::FunctionCall &);
+ virtual void visit(ProgramSyntax::FunctionDeclaration &);
+ };
+
+ struct BlockModifier: Visitor
+ {
+ bool remove_node;
+ std::list<ProgramSyntax::Node *> insert_nodes;
+
+ BlockModifier();
+
+ void flatten_block(ProgramSyntax::Block &);
+ void apply_and_increment(ProgramSyntax::Block &, std::list<ProgramSyntax::NodePtr<ProgramSyntax::Node> >::iterator &);
+ virtual void visit(ProgramSyntax::Block &);
+ };
+
+ struct InterfaceGenerator: BlockModifier