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