+ template<typename T>
+ struct NodeGatherer: Visitor
+ {
+ typedef std::list<T *> ResultType;
+
+ std::list<T *> nodes;
+
+ const ResultType &get_result() const { return nodes; }
+ virtual void visit(T &n) { nodes.push_back(&n); }
+ };
+
+ struct DeclarationCombiner: Visitor
+ {
+ bool toplevel;
+ std::map<std::string, std::vector<ProgramSyntax::FunctionDeclaration *> > functions;
+ std::map<std::string, ProgramSyntax::VariableDeclaration *> variables;
+ bool remove_node;
+
+ DeclarationCombiner();
+
+ virtual void visit(ProgramSyntax::Block &);
+ virtual void visit(ProgramSyntax::FunctionDeclaration &);
+ virtual void visit(ProgramSyntax::VariableDeclaration &);
+ };
+
+ struct VariableResolver: Visitor