00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef CBZ_TREE_VISITOR_H
00039 #define CBZ_TREE_VISITOR_H
00040
00041
00042
00043 template< class T >
00044 void visit_list(list< T > & l, Visitor * the_visitor)
00045 {
00046 for (typename list< T >::iterator p = l.begin();
00047 p != l.end();
00048 ++p)
00049 (*p)->visit(the_visitor);
00050 }
00051
00052
00053 class tree_visitor : public Visitor
00054 {
00055
00056 public:
00057
00058 virtual void at_unit(unitNode * the_unit)
00059 {
00060 visit_list(the_unit->defs(), this);
00061 }
00062
00063 virtual void at_decl(declNode * the_decl)
00064 {
00065 if (the_decl->type())
00066 the_decl->type()->visit(this);
00067
00068 if (the_decl->init())
00069 the_decl->init()->visit(this);
00070
00071 if (the_decl->bitsize())
00072 the_decl->bitsize()->visit(this);
00073
00074 visit_list(the_decl->attribs(), this);
00075 }
00076
00077 virtual void at_proc(procNode * the_proc)
00078 {
00079 if (the_proc->decl())
00080 the_proc->decl()->visit(this);
00081
00082 if (the_proc->body())
00083 the_proc->body()->visit(this);
00084 }
00085
00086 virtual void at_prim(primNode * the_prim)
00087 {}
00088
00089 virtual void at_tdef(tdefNode * the_tdef)
00090 {}
00091
00092 virtual void at_ptr(ptrNode * the_ptr)
00093 {
00094 the_ptr->type()->visit(this);
00095 }
00096
00097 virtual void at_array(arrayNode * the_array)
00098 {
00099 if (the_array->type())
00100 the_array->type()->visit(this);
00101
00102 if (the_array->dim())
00103 the_array->dim()->visit(this);
00104 }
00105
00106 virtual void at_func(funcNode * the_func)
00107 {
00108 visit_list(the_func->args(), this);
00109
00110 if (the_func->returns())
00111 the_func->returns()->visit(this);
00112 }
00113
00114 virtual void at_struct(structNode * the_struct)
00115 {
00116 if (the_struct->elaborated() && the_struct->spec())
00117 the_struct->spec()->visit(this);
00118 }
00119
00120 virtual void at_union(unionNode * the_union)
00121 {
00122 if (the_union->elaborated() && the_union->spec())
00123 the_union->spec()->visit(this);
00124 }
00125
00126 virtual void at_enum(enumNode * the_enum)
00127 {
00128 if (the_enum->elaborated() && the_enum->spec())
00129 the_enum->spec()->visit(this);
00130 }
00131
00132 virtual void at_suespec(suespecNode * the_suespec)
00133 {
00134 visit_list(the_suespec->fields(), this);
00135 }
00136
00137 virtual void at_const(constNode * the_const)
00138 {
00139 if (the_const->type())
00140 the_const->type()->visit(this);
00141 }
00142
00143 virtual void at_id(idNode * the_id)
00144 {
00145 if (the_id->type())
00146 the_id->type()->visit(this);
00147 }
00148
00149 virtual void at_binary(binaryNode * the_binary)
00150 {
00151 if (the_binary->right())
00152 the_binary->right()->visit(this);
00153
00154 if (the_binary->left())
00155 the_binary->left()->visit(this);
00156
00157 if (the_binary->type())
00158 the_binary->type()->visit(this);
00159 }
00160
00161 virtual void at_unary(unaryNode * the_unary)
00162 {
00163 if (the_unary->expr())
00164 the_unary->expr()->visit(this);
00165
00166 if (the_unary->type())
00167 the_unary->type()->visit(this);
00168
00169 if (the_unary->sizeof_type())
00170 the_unary->sizeof_type()->visit(this);
00171 }
00172
00173 virtual void at_cast(castNode * the_cast)
00174 {
00175 if (the_cast->type())
00176 the_cast->type()->visit(this);
00177
00178 if (the_cast->expr())
00179 the_cast->expr()->visit(this);
00180 }
00181
00182 virtual void at_comma(commaNode * the_comma)
00183 {
00184 visit_list(the_comma->exprs(), this);
00185
00186 if (the_comma->type())
00187 the_comma->type()->visit(this);
00188 }
00189
00190 virtual void at_ternary(ternaryNode * the_ternary)
00191 {
00192 if (the_ternary->cond())
00193 the_ternary->cond()->visit(this);
00194
00195 if (the_ternary->true_br())
00196 the_ternary->true_br()->visit(this);
00197
00198 if (the_ternary->false_br())
00199 the_ternary->false_br()->visit(this);
00200
00201 if (the_ternary->type())
00202 the_ternary->type()->visit(this);
00203 }
00204
00205 virtual void at_call(callNode * the_call)
00206 {
00207 if (the_call->name())
00208 the_call->name()->visit(this);
00209
00210 visit_list(the_call->args(), this);
00211
00212 if (the_call->type())
00213 the_call->type()->visit(this);
00214 }
00215
00216 virtual void at_initializer(initializerNode * the_initializer)
00217 {
00218 visit_list(the_initializer->exprs(), this);
00219
00220 if (the_initializer->type())
00221 the_initializer->type()->visit(this);
00222 }
00223
00224 virtual void at_block(blockNode * the_block)
00225 {
00226 visit_list(the_block->decls(), this);
00227 visit_list(the_block->stmts(), this);
00228
00229 if (the_block->type())
00230 the_block->type()->visit(this);
00231 }
00232
00233 virtual void at_exprstmt(exprstmtNode * the_exprstmt)
00234 {
00235 if (the_exprstmt->expr())
00236 the_exprstmt->expr()->visit(this);
00237 }
00238
00239 virtual void at_label(labelNode * the_label)
00240 {
00241 if (the_label->stmt())
00242 the_label->stmt()->visit(this);
00243 }
00244
00245 virtual void at_case(caseNode * the_case)
00246 {
00247 if (the_case->expr())
00248 the_case->expr()->visit(this);
00249
00250 if (the_case->stmt())
00251 the_case->stmt()->visit(this);
00252 }
00253
00254 virtual void at_if(ifNode * the_if)
00255 {
00256 if (the_if->expr())
00257 the_if->expr()->visit(this);
00258
00259 if (the_if->true_br())
00260 the_if->true_br()->visit(this);
00261
00262 if (the_if->false_br())
00263 the_if->false_br()->visit(this);
00264 }
00265
00266 virtual void at_switch(switchNode * the_switch)
00267 {
00268 if (the_switch->expr())
00269 the_switch->expr()->visit(this);
00270
00271 if (the_switch->stmt())
00272 the_switch->stmt()->visit(this);
00273 }
00274
00275 virtual void at_while(whileNode * the_while)
00276 {
00277 if (the_while->cond())
00278 the_while->cond()->visit(this);
00279
00280 if (the_while->body())
00281 the_while->body()->visit(this);
00282 }
00283
00284 virtual void at_do(doNode * the_do)
00285 {
00286 if (the_do->body())
00287 the_do->body()->visit(this);
00288
00289 if (the_do->cond())
00290 the_do->cond()->visit(this);
00291 }
00292
00293 virtual void at_for(forNode * the_for)
00294 {
00295 if (the_for->init())
00296 the_for->init()->visit(this);
00297
00298 if (the_for->cond())
00299 the_for->cond()->visit(this);
00300
00301 if (the_for->next())
00302 the_for->next()->visit(this);
00303
00304 if (the_for->body())
00305 the_for->body()->visit(this);
00306 }
00307
00308 virtual void at_goto(gotoNode * the_goto)
00309 {}
00310
00311 virtual void at_continue(continueNode * the_continue)
00312 {}
00313
00314 virtual void at_break(breakNode * the_break)
00315 {}
00316
00317 virtual void at_return(returnNode * the_return)
00318 {
00319 if (the_return->expr())
00320 the_return->expr()->visit(this);
00321 }
00322
00323 virtual void at_attrib(attribNode * the_attrib)
00324 {
00325 if (the_attrib->arg())
00326 the_attrib->arg()->visit(this);
00327 }
00328
00329 virtual void at_text(textNode * the_text)
00330 {}
00331 };
00332
00333
00334 #endif // CBZ_TREE_VISITOR_H