1 /* 2 * Copyright 2006-2008 The FLWOR Foundation. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #pragma once 17 #ifndef ZORBA_COMPILER_EXPR_VISITOR_H 18 #define ZORBA_COMPILER_EXPR_VISITOR_H 19 20 #include <zorba/config.h> 21 #include "compiler/expression/expr_classes.h" 22 23 namespace zorba 24 { 25 26 #ifndef ZORBA_NO_FULL_TEXT 27 class ftnode_visitor; 28 #endif /* ZORBA_NO_FULL_TEXT */ 29 30 class expr_visitor 31 { 32 public: 33 ~expr_visitor()34 virtual ~expr_visitor() { } 35 36 #ifndef ZORBA_NO_FULL_TEXT 37 virtual ftnode_visitor* get_ftnode_visitor() = 0; 38 #endif /* ZORBA_NO_FULL_TEXT */ 39 40 #define DECL_EXPR_VISITOR_VISIT_MEM_FNS(C) \ 41 virtual bool begin_visit( C& ) = 0; \ 42 virtual void end_visit( C& ) = 0 43 44 DECL_EXPR_VISITOR_VISIT_MEM_FNS( expr ); 45 46 DECL_EXPR_VISITOR_VISIT_MEM_FNS( var_expr ); 47 DECL_EXPR_VISITOR_VISIT_MEM_FNS( flwor_expr ); 48 DECL_EXPR_VISITOR_VISIT_MEM_FNS( promote_expr ); 49 DECL_EXPR_VISITOR_VISIT_MEM_FNS( if_expr ); 50 DECL_EXPR_VISITOR_VISIT_MEM_FNS( fo_expr ); 51 #ifndef ZORBA_NO_FULL_TEXT 52 DECL_EXPR_VISITOR_VISIT_MEM_FNS( ftcontains_expr ); 53 #endif /* ZORBA_NO_FULL_TEXT */ 54 DECL_EXPR_VISITOR_VISIT_MEM_FNS( instanceof_expr ); 55 DECL_EXPR_VISITOR_VISIT_MEM_FNS( treat_expr ); 56 DECL_EXPR_VISITOR_VISIT_MEM_FNS( castable_expr ); 57 DECL_EXPR_VISITOR_VISIT_MEM_FNS( cast_expr ); 58 DECL_EXPR_VISITOR_VISIT_MEM_FNS( name_cast_expr ); 59 DECL_EXPR_VISITOR_VISIT_MEM_FNS( validate_expr ); 60 DECL_EXPR_VISITOR_VISIT_MEM_FNS( extension_expr ); 61 DECL_EXPR_VISITOR_VISIT_MEM_FNS( relpath_expr ); 62 DECL_EXPR_VISITOR_VISIT_MEM_FNS( axis_step_expr ); 63 DECL_EXPR_VISITOR_VISIT_MEM_FNS( match_expr ); 64 DECL_EXPR_VISITOR_VISIT_MEM_FNS( const_expr ); 65 DECL_EXPR_VISITOR_VISIT_MEM_FNS( order_expr ); 66 DECL_EXPR_VISITOR_VISIT_MEM_FNS( elem_expr ); 67 DECL_EXPR_VISITOR_VISIT_MEM_FNS( doc_expr ); 68 DECL_EXPR_VISITOR_VISIT_MEM_FNS( attr_expr ); 69 DECL_EXPR_VISITOR_VISIT_MEM_FNS( text_expr ); 70 DECL_EXPR_VISITOR_VISIT_MEM_FNS( pi_expr ); 71 72 #ifdef ZORBA_WITH_JSON 73 DECL_EXPR_VISITOR_VISIT_MEM_FNS( json_object_expr ); 74 DECL_EXPR_VISITOR_VISIT_MEM_FNS( json_direct_object_expr ); 75 DECL_EXPR_VISITOR_VISIT_MEM_FNS( json_array_expr ); 76 #endif 77 78 DECL_EXPR_VISITOR_VISIT_MEM_FNS( trycatch_expr ); 79 DECL_EXPR_VISITOR_VISIT_MEM_FNS( function_item_expr ); 80 DECL_EXPR_VISITOR_VISIT_MEM_FNS( dynamic_function_invocation_expr ); 81 82 DECL_EXPR_VISITOR_VISIT_MEM_FNS(insert_expr); 83 DECL_EXPR_VISITOR_VISIT_MEM_FNS(delete_expr); 84 DECL_EXPR_VISITOR_VISIT_MEM_FNS(rename_expr); 85 DECL_EXPR_VISITOR_VISIT_MEM_FNS(replace_expr); 86 DECL_EXPR_VISITOR_VISIT_MEM_FNS(transform_expr); 87 88 DECL_EXPR_VISITOR_VISIT_MEM_FNS(block_expr); 89 DECL_EXPR_VISITOR_VISIT_MEM_FNS(var_decl_expr); 90 DECL_EXPR_VISITOR_VISIT_MEM_FNS(var_set_expr); 91 DECL_EXPR_VISITOR_VISIT_MEM_FNS(apply_expr); 92 DECL_EXPR_VISITOR_VISIT_MEM_FNS(exit_expr); 93 DECL_EXPR_VISITOR_VISIT_MEM_FNS(exit_catcher_expr); 94 DECL_EXPR_VISITOR_VISIT_MEM_FNS(while_expr); 95 DECL_EXPR_VISITOR_VISIT_MEM_FNS(flowctl_expr); 96 97 DECL_EXPR_VISITOR_VISIT_MEM_FNS(eval_expr); 98 #ifdef ZORBA_WITH_DEBUGGER 99 DECL_EXPR_VISITOR_VISIT_MEM_FNS(debugger_expr); 100 #endif 101 DECL_EXPR_VISITOR_VISIT_MEM_FNS(function_trace_expr); 102 DECL_EXPR_VISITOR_VISIT_MEM_FNS(wrapper_expr); 103 104 105 #undef DECL_EXPR_VISITOR_VISIT_MEM_FNS 106 #define DECL_EXPR_VISITOR_VISIT_MEM_FNS(C) \ 107 bool begin_visit( C& ); \ 108 void end_visit( C& ) 109 110 #define DEF_EXPR_VISITOR_BEGIN_VISIT(V,C) \ 111 bool V::begin_visit( C& ) { \ 112 return true; \ 113 } 114 115 #define DEF_EXPR_VISITOR_END_VISIT(V,C) \ 116 void V::end_visit( C& ) { \ 117 } 118 119 #define DEF_EXPR_VISITOR_VISIT_MEM_FNS(V,C) \ 120 DEF_EXPR_VISITOR_BEGIN_VISIT(V,C) \ 121 DEF_EXPR_VISITOR_END_VISIT(V,C) 122 123 }; 124 125 } /* namespace zorba */ 126 #endif /* ZORBA_EXPR_VISITOR_H */ 127 /* vim:set et sw=2 ts=2: */ 128