File: Synopsis/PTree/Visitor.hh
  1//
  2// Copyright (C) 2004 Stefan Seefeld
  3// All rights reserved.
  4// Licensed to the public under the terms of the GNU LGPL (>= 2),
  5// see the file COPYING for details.
  6//
  7#ifndef Synopsis_PTree_Visitor_hh_
  8#define Synopsis_PTree_Visitor_hh_
  9
 10#include <Synopsis/PTree/NodesFwd.hh>
 11
 12namespace Synopsis
 13{
 14namespace PTree
 15{
 16
 17//. The Visitor class is used to dynamically resolve
 18//. type information about a given Node.
 19//. The default implementation does nothing, so you
 20//. only need to implement the methods you actually need.
 21//. Any types for which no corresponding 'visit' methods
 22//. exist will be caught by the 'visit' of the closest parent. 
 23class Visitor
 24{
 25public:
 26  virtual ~Visitor() {}
 27  virtual void visit(Node *) {}
 28  virtual void visit(Atom *) {}
 29  virtual void visit(List *) {}
 30  // atoms...
 31  virtual void visit(Literal *);
 32  virtual void visit(CommentedAtom *);
 33  virtual void visit(DupAtom *);
 34  virtual void visit(Identifier *);
 35  virtual void visit(Keyword *);
 36  virtual void visit(Kwd::Auto *);
 37  virtual void visit(Kwd::Break *);
 38  virtual void visit(Kwd::Bool *);
 39  virtual void visit(Kwd::Case *);
 40  virtual void visit(Kwd::Catch *);
 41  virtual void visit(Kwd::Char *);
 42  virtual void visit(Kwd::Class *);
 43  virtual void visit(Kwd::Continue *);
 44  virtual void visit(Kwd::Const *);
 45  virtual void visit(Kwd::Default *);
 46  virtual void visit(Kwd::Delete *);
 47  virtual void visit(Kwd::Double *);
 48  virtual void visit(Kwd::Do *);
 49  virtual void visit(Kwd::Else *);
 50  virtual void visit(Kwd::Extern *);
 51  virtual void visit(Kwd::Float *);
 52  virtual void visit(Kwd::For *);
 53  virtual void visit(Kwd::Friend *);
 54  virtual void visit(Kwd::Goto *);
 55  virtual void visit(Kwd::Inline *);
 56  virtual void visit(Kwd::If *);
 57  virtual void visit(Kwd::Int *);
 58  virtual void visit(Kwd::Long *);
 59  virtual void visit(Kwd::Mutable *);
 60  virtual void visit(Kwd::Namespace *);
 61  virtual void visit(Kwd::New *);
 62  virtual void visit(Kwd::Operator *);
 63  virtual void visit(Kwd::Private *);
 64  virtual void visit(Kwd::Protected *);
 65  virtual void visit(Kwd::Public *);
 66  virtual void visit(Kwd::Register *);
 67  virtual void visit(Kwd::Return *);
 68  virtual void visit(Kwd::Short *);
 69  virtual void visit(Kwd::Signed *);
 70  virtual void visit(Kwd::Static *);
 71  virtual void visit(Kwd::Struct *);
 72  virtual void visit(Kwd::Switch *);
 73  virtual void visit(Kwd::Template *);
 74  virtual void visit(Kwd::This *);
 75  virtual void visit(Kwd::Throw *);
 76  virtual void visit(Kwd::Try *);
 77  virtual void visit(Kwd::Typedef *);
 78  virtual void visit(Kwd::Typename *);
 79  virtual void visit(Kwd::Union *);
 80  virtual void visit(Kwd::Unsigned *);
 81  virtual void visit(Kwd::Using *);
 82  virtual void visit(Kwd::Virtual *);
 83  virtual void visit(Kwd::Void *);
 84  virtual void visit(Kwd::Volatile *);
 85  virtual void visit(Kwd::WChar *);
 86  virtual void visit(Kwd::While *);
 87  //. [ { [ <statement>* ] } ]
 88  virtual void visit(Brace *);
 89  //. [ { [ <statement>* ] } ]
 90  virtual void visit(Block *);
 91  virtual void visit(ClassBody *);
 92  virtual void visit(Typedef *);
 93  //. [ template < [types] > [decl] ]
 94  virtual void visit(TemplateDecl *);
 95  virtual void visit(TemplateInstantiation *);
 96  virtual void visit(ExternTemplate *);
 97  virtual void visit(MetaclassDecl *);
 98  //. [ extern ["C++"] [{ body }] ]
 99  virtual void visit(LinkageSpec *);
100  //. [ namespace <identifier> [{ body }] ]
101  virtual void visit(NamespaceSpec *);
102  //. [ using namespace Foo ; ]
103  virtual void visit(UsingDirective *);
104  //. One of:
105  //.
106  //. - Variables: [ [modifiers] name [declarators] ; ]
107  //. - Function: prototype: [ [modifiers] name [declarators] ; ]
108  //. - Typedef: ?
109  //. - Class definition: [ [modifiers] [class foo ...] [declarators]? ; ]
110  virtual void visit(Declaration *);
111  //. [ namespace Foo = Bar ; ]
112  virtual void visit(NamespaceAlias *);
113  //. Function definition: [ [modifiers] name declarator [ { ... } ] ]
114  virtual void visit(FunctionDefinition *);
115  //. One of:
116  //.
117  //. - [ decl-specifier-seq ]
118  //. - [ decl-specifier-seq declarator ]
119  //. - [ decl-specifier-seq declarator = assignment-expression ]
120  //. - [ decl-specifier-seq abstract-declarator ]
121  //. - [ decl-specifier-seq abstract-declarator = assignment-expression ]
122  //. - [ decl-specifier-seq = assignment-expression ]
123  virtual void visit(ParameterDeclaration *);
124  //. [ using Foo `::` x ; ]
125  virtual void visit(UsingDeclaration *);
126  //. [ [ declarator { = <expr> } ] , ... ]
127  virtual void visit(Declarator *);
128  virtual void visit(Name *);
129  //. [ [type] ( [expr] ) ]
130  virtual void visit(FstyleCastExpr *);
131  virtual void visit(ClassSpec *);
132  //. [ enum [name] [{ [name [= value] ]* }] ]
133  virtual void visit(EnumSpec *);
134  //. One of:
135  //.
136  //. - [typename]
137  //. - [typename identifier]
138  //. - [typename identifier = type-id]
139  virtual void visit(TypeParameter *);
140  virtual void visit(AccessSpec *);
141  virtual void visit(AccessDecl *);
142  virtual void visit(UserAccessSpec *);
143  //. [ if ( expr ) statement (else statement)? ]
144  virtual void visit(IfStatement *);
145  //. [ switch ( expr ) statement ]
146  virtual void visit(SwitchStatement *);
147  //. [ while ( expr ) statement ]
148  virtual void visit(WhileStatement *);
149  //. [ do [{ ... }] while ( [...] ) ; ]
150  virtual void visit(DoStatement *);
151  //. [ for ( stmt expr ; expr ) statement ]
152  virtual void visit(ForStatement *);
153  //. [ try [{}] [catch ( arg ) [{}] ]* ]
154  virtual void visit(TryStatement *);
155  //. [ break ; ]
156  virtual void visit(BreakStatement *);
157  virtual void visit(ContinueStatement *);
158  virtual void visit(ReturnStatement *);
159  virtual void visit(GotoStatement *);
160  //. [ case expr : [expr] ]
161  virtual void visit(CaseStatement *);
162  //. [ default : [expr] ]
163  virtual void visit(DefaultStatement *);
164  virtual void visit(LabelStatement *);
165  virtual void visit(ExprStatement *);
166  //. [ expr (, expr)* ]
167  virtual void visit(Expression *);
168  //. [left = right]
169  virtual void visit(AssignExpr *);
170  virtual void visit(CondExpr *);
171  //. [left op right]
172  virtual void visit(InfixExpr *);
173  virtual void visit(PmExpr *);
174  //. ( type-expr ) expr   ..type-expr is type encoded
175  virtual void visit(CastExpr *);
176  //. [op expr]
177  virtual void visit(UnaryExpr *);
178  //. [ throw [expr] ]
179  virtual void visit(ThrowExpr *);
180  //. [ sizeof ( [type [???] ] ) ]
181  virtual void visit(SizeofExpr *);
182  virtual void visit(OffsetofExpr *);
183  virtual void visit(TypeidExpr *);
184  virtual void visit(TypeofExpr *);
185  virtual void visit(NewExpr *);
186  //. [ delete [expr] ]
187  virtual void visit(DeleteExpr *);
188  //. <postfix> \[ <expr> \]
189  virtual void visit(ArrayExpr *);
190  //. [ postfix ( args ) ]
191  virtual void visit(FuncallExpr *);
192  //. [ expr ++ ]
193  virtual void visit(PostfixExpr *);
194  //. [ postfix . name ]
195  virtual void visit(DotMemberExpr *);
196  //. [ postfix -> name ]
197  virtual void visit(ArrowMemberExpr *);
198  //. [ ( expr ) ]
199  virtual void visit(ParenExpr *);
200};
201
202}
203}
204
205#endif