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_FTNODE_VISITOR_H
18 #define ZORBA_COMPILER_FTNODE_VISITOR_H
19 
20 #include "compiler/expression/expr_base.h"
21 #include "compiler/expression/ftnode_classes.h"
22 
23 namespace zorba {
24 
25 ///////////////////////////////////////////////////////////////////////////////
26 
27 class ftnode_visitor {
28 public:
29   virtual ~ftnode_visitor();
30 
31   virtual expr_visitor* get_expr_visitor() = 0;
32 
33 # define DECL_FTNODE_VISITOR_VISIT_MEM_FNS(C)           \
34   virtual ft_visit_result::type begin_visit( C& ) = 0;  \
35   virtual void end_visit( C& ) = 0
36 
37   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftand );
38   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftextension_selection );
39   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftmild_not );
40   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftor );
41   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftprimary_with_options );
42   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftrange );
43   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftselection );
44   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftunary_not );
45   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftweight );
46   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwords );
47   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwords_times );
48 
49   // FTPosFilters
50   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftcontent_filter );
51   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftdistance_filter );
52   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftorder_filter );
53   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftscope_filter );
54   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwindow_filter );
55 
56   // FTMatchOptions
57   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftcase_option );
58   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftdiacritics_option );
59   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftextension_option );
60   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftlanguage_option );
61   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftmatch_options );
62   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftstem_option );
63   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftstop_word_option );
64   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftstop_words );
65   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftthesaurus_id );
66   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftthesaurus_option );
67   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwild_card_option );
68 
69 #undef DECL_FTNODE_VISITOR_VISIT_MEM_FNS
70 #define DECL_FTNODE_VISITOR_VISIT_MEM_FNS(C)  \
71   ft_visit_result::type begin_visit( C& );    \
72   void end_visit( C& )
73 
74 #define DEF_FTNODE_VISITOR_BEGIN_VISIT(V,C)     \
75   ft_visit_result::type V::begin_visit( C& ) {  \
76     return ft_visit_result::proceed;            \
77   }
78 
79 #define DEF_FTNODE_VISITOR_END_VISIT(V,C)   \
80   void V::end_visit( C& ) {                 \
81   }
82 
83 #define DEF_FTNODE_VISITOR_VISIT_MEM_FNS(V,C)   \
84   DEF_FTNODE_VISITOR_BEGIN_VISIT(V,C)           \
85   DEF_FTNODE_VISITOR_END_VISIT(V,C)
86 
87 protected:
ftnode_visitor()88   ftnode_visitor() { }
89 };
90 
91 ///////////////////////////////////////////////////////////////////////////////
92 
93 /**
94  * An FTNodeExprCollector is-an ftnode_visitor that collects all nested expr
95  * nodes into a single collection.
96  */
97 class FTNodeExprCollector : public ftnode_visitor {
98 public:
99   typedef std::vector<expr**> expr_list_t;
100 
101   expr_visitor* get_expr_visitor();
102 
get_expr_list()103   expr_list_t& get_expr_list() {
104     return expr_list_;
105   }
106 
107 protected:
108   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftand );
109   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftextension_selection );
110   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftmild_not );
111   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftor );
112   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftprimary_with_options );
113   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftrange );
114   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftselection );
115   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftunary_not );
116   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftweight );
117   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwords );
118   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwords_times );
119 
120   // FTPosFilters
121   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftcontent_filter );
122   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftdistance_filter );
123   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftorder_filter );
124   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftscope_filter );
125   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwindow_filter );
126 
127   // FTMatchOptions
128   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftcase_option );
129   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftdiacritics_option );
130   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftextension_option );
131   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftlanguage_option );
132   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftmatch_options );
133   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftstem_option );
134   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftstop_word_option );
135   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftstop_words );
136   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftthesaurus_id );
137   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftthesaurus_option );
138   DECL_FTNODE_VISITOR_VISIT_MEM_FNS( ftwild_card_option );
139 
140 private:
push_back(expr ** e)141   void push_back( expr** e ) {
142     expr_list_.push_back( e );
143   }
144 
145   expr_list_t expr_list_;
146 };
147 
148 } // namespace zorba
149 #endif /* ZORBA_FTNODE_VISITOR_H */
150 
151 /*
152  * Local variables:
153  * mode: c++
154  * End:
155  */
156 /* vim:set et sw=2 ts=2: */
157