INTERFACE: #include "ptree_visitor.h" #include "downcast.h" // Inherits "virtual"ly from Ptree_visitor to allow mixin // implementations of its interface template class Ptree_program_visitor : virtual public Ptree_visitor { typedef Ptree_visitor Super; }; IMPLEMENTATION: PUBLIC template Ptree_program_visitor::Ptree_program_visitor (Source* s) : Ptree_visitor (s) { } // // Detect type of declarations and call appropriate visit function // // Overloaded version of Ptree_visitor's visit_declaration template virtual Returntype Ptree_program_visitor::visit_declaration (PtreeDeclaration *p) { Ptree* storagespec = p->First(); Ptree* typespec = p->Second(); // It is a function definition? PtreeDeclarator* decl = dynamic_cast (p->Third()); if (decl) return visit_function (storagespec, typespec, decl, downcast (p->Nth(3))); // Not a function definition if (p->Third()->IsLeaf()) { assert (* p->Third()->ToString() == ';'); return visit_type_declaration (storagespec, typespec); } // Must be variable or function-prototype declaration return visit_name_declaration(storagespec, typespec, p->Third()); } PUBLIC template virtual Returntype Ptree_program_visitor::visit_function (Ptree* storagespec, Ptree* returntype, PtreeDeclarator* decl, PtreeBlock* block) { visit(storagespec); visit(returntype); visit(decl); return visit(block); } PUBLIC template virtual Returntype Ptree_program_visitor::visit_type_declaration (Ptree* storagespec, Ptree* type) { visit(storagespec); return visit(type); } PUBLIC template virtual Returntype Ptree_program_visitor::visit_name_declaration (Ptree* storagespec, Ptree* type, Ptree* decllist) { visit(storagespec); visit(type); return visit(decllist); }