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