127e900be7d6c25e0736f13c3deddba666aad3cb
[com/gs-lite.git] / src / ftacmp / ifq.y
1 /* ------------------------------------------------\r
2 Copyright 2014 AT&T Intellectual Property\r
3    Licensed under the Apache License, Version 2.0 (the "License");\r
4    you may not use this file except in compliance with the License.\r
5    You may obtain a copy of the License at\r
6 \r
7      http://www.apache.org/licenses/LICENSE-2.0\r
8 \r
9    Unless required by applicable law or agreed to in writing, software\r
10    distributed under the License is distributed on an "AS IS" BASIS,\r
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12    See the License for the specific language governing permissions and\r
13    limitations under the License.\r
14  ------------------------------------------- */\r
15 \r
16 /*\r
17         MUST COMPILE WITH\r
18                 bison --verbose --defines=ifq.tab.cc.h -p IfqParser  -o ifq.tab.cc ifq.y\r
19 \r
20          (or equivalent).\r
21 */\r
22 \r
23 %{\r
24 \r
25 \r
26 #include <stdio.h>\r
27 \r
28 /*              Some addn'l includes, necessary but not included by the\r
29                 bison generated code.\r
30 */\r
31 \r
32 #include <stdlib.h>\r
33 \r
34 /*              prototypes for the parser callbacks.\r
35 */\r
36 \r
37 #include "parse_fta.h"\r
38 \r
39 \r
40 extern fta_parse_t *ifq_parse_result;\r
41 \r
42 \r
43 #define YYDEBUG 1\r
44 \r
45 %}\r
46 \r
47 \r
48         /* symbolic tokens */\r
49 \r
50 %union {\r
51         int intval;\r
52         double floatval;\r
53         char *strval;\r
54         int subtok;\r
55 \r
56 /*                      for FTA definition.     */\r
57         literal_t *litval;\r
58         scalarexp_t *scalarval;\r
59         se_list_t *se_listval;\r
60         select_list_t *select_listval;\r
61         table_exp_t *tblp;\r
62         predicate_t *predp;\r
63         literal_list_t *lit_l;\r
64         tablevar_t *table;\r
65         tablevar_list_t *tbl_list;\r
66         colref_t *colref;\r
67         colref_list_t *clist;\r
68         var_defs_t *var_defs;\r
69         var_pair_t *var_pair;\r
70         gb_t *gb_val;\r
71         gb_list_t *gb_list;\r
72 \r
73         query_list_t *q_list;\r
74 \r
75 \r
76 }\r
77 \r
78 %token <strval> NAME\r
79 %token <strval> PRED\r
80 %token <strval> STRING_TOKEN\r
81 %token <strval> INTNUM\r
82 %token <strval> LONGINTNUM\r
83 %token <strval> APPROXNUM\r
84 \r
85 /*                      for FTA definition.     */\r
86 %type <q_list> query_list\r
87 %type <tblp> gsql\r
88 %type <tblp> select_statement\r
89 %type <tblp> table_exp\r
90 %type <predp> where_clause\r
91 %type <predp> search_condition\r
92 %type <predp> predicate\r
93 %type <litval> literal\r
94 %type <scalarval> scalar_exp\r
95 %type <se_listval> scalar_exp_commalist\r
96 \r
97 \r
98 \r
99 \r
100 \r
101         /* operators */\r
102 \r
103 %left OR\r
104 %left AND\r
105 %left NOT\r
106 \r
107         /* literal keyword tokens */\r
108 %token  SEMICOLON LEFTBRACE RIGHTBRACE\r
109 /*              For query definition    */\r
110 %token BY AS\r
111 %token <strval> AGGR\r
112 %token FROM INNER_JOIN OUTER_JOIN LEFT_OUTER_JOIN RIGHT_OUTER_JOIN\r
113 %token GROUP HAVING IN\r
114 %token SELECT\r
115 %token WHERE\r
116 %token SUCH THAT\r
117 \r
118 %token TRUE_V FALSE_V\r
119 %token TIMEVAL_L HEX_L LHEX_L IP_L\r
120 %token  MERGE SLACK\r
121 \r
122 %token DEFINE_SEC PARAM_SEC\r
123 \r
124 /*              For table definition    */\r
125 %token RIGHTBRACE PROTOCOL TABLE STREAM FTA\r
126 %token OPERATOR OPERATOR_VIEW FIELDS SUBQUERIES SELECTION_PUSHDOWN\r
127 \r
128 \r
129 %%\r
130 \r
131 /*                      Union of possible results       */\r
132 parse_result:   query_list      {\r
133                 ifq_parse_result->parse_tree_list = $1;\r
134                 ifq_parse_result->tables = NULL;\r
135                 ifq_parse_result->parse_type = QUERY_PARSE;\r
136         }\r
137         ;\r
138 \r
139 \r
140 \r
141 /*              Query definition.\r
142                 WARNING: there might be some relics.\r
143 */\r
144 \r
145 gsql:   NAME ':' select_statement {\r
146                                 $$ = $3; $$->nmap["name"] = $1;\r
147                         }\r
148         ;\r
149 \r
150 query_list:     gsql    {$$ = new query_list_t($1);}\r
151         |       query_list SEMICOLON gsql       {$$ = $1->append($3);}\r
152         ;\r
153 \r
154 \r
155 select_statement:\r
156                 table_exp       {$$ = $1;}\r
157         ;\r
158 \r
159 \r
160         /* query expressions */\r
161 \r
162 \r
163 \r
164 table_exp:\r
165                 where_clause {$$=new table_exp_t(NULL,$1,NULL,NULL,NULL,NULL,NULL,NULL);}\r
166         ;\r
167 \r
168 \r
169 \r
170 where_clause:\r
171                 search_condition        {$$ = $1;}\r
172         ;\r
173 \r
174 \r
175 \r
176         /* search conditions */\r
177 \r
178 search_condition:\r
179                 search_condition OR search_condition  {$$=new predicate_t("OR",$1,$3);}\r
180         |       search_condition AND search_condition {$$=new predicate_t("AND",$1,$3);}\r
181         |       NOT search_condition    {$$ = new predicate_t("NOT", $2 );}\r
182         |       '(' search_condition ')' {$$ = $2;}\r
183         |       predicate {$$ = $1;}\r
184         ;\r
185 \r
186 predicate:\r
187                 PRED '[' scalar_exp_commalist ']' {$$ = new predicate_t($1, $3->get_se_list()); }\r
188         ;\r
189 \r
190 \r
191         /* scalar expressions */\r
192 \r
193 scalar_exp:\r
194                 literal { $$= scalarexp_t::make_param_reference($1->to_string().c_str());}\r
195         |       NAME {$$ = scalarexp_t::make_param_reference($1);}\r
196         ;\r
197 \r
198 \r
199 scalar_exp_commalist:\r
200                 scalar_exp      {       $$= new se_list_t($1); }\r
201         |       scalar_exp_commalist ',' scalar_exp     { $$=$1->append($3); }\r
202         ;\r
203 \r
204 literal:\r
205                 STRING_TOKEN    {$$ = new literal_t($1,LITERAL_STRING);}\r
206         |       INTNUM          {$$ = new literal_t($1,LITERAL_INT);}\r
207         |       LONGINTNUM              {$$ = new literal_t($1,LITERAL_LONGINT);}\r
208         |       APPROXNUM       {$$ = new literal_t($1,LITERAL_FLOAT);}\r
209         |       TRUE_V          {$$ = new literal_t("TRUE",LITERAL_BOOL);}\r
210         |       FALSE_V         {$$ = new literal_t("FALSE",LITERAL_BOOL);}\r
211         |       TIMEVAL_L STRING_TOKEN  {$$ = new literal_t($2,LITERAL_TIMEVAL);}\r
212         |       HEX_L  STRING_TOKEN     {$$ = new literal_t($2,LITERAL_HEX);}\r
213         |       LHEX_L  STRING_TOKEN    {$$ = new literal_t($2,LITERAL_LONGHEX);}\r
214         |       IP_L  STRING_TOKEN      {$$ = new literal_t($2,LITERAL_IP);}\r
215         ;\r
216 \r
217 \r
218 \r
219 %%\r
220 \r