Added quantiling UDAFs
[com/gs-lite.git] / src / ftacmp / nic.l
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 /*\r
18         MUST COMPILE WITH\r
19                 flex -PNicParser -oniclexer.cc nic.l\r
20         (or equivalent).\r
21 */      \r
22 \r
23 %{\r
24 /*\r
25  * AT&T lex can't handle this lexer due to lex bugs.  It works with flex\r
26  * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.\r
27  */\r
28 \r
29  #include "nic_def.h"\r
30  #include <string.h>\r
31 \r
32 \r
33 \r
34 #include "nic.tab.cc.h"\r
35 \r
36 /*\r
37         Some includes that flex doesn't include as standard,\r
38         but which are needed.\r
39 */\r
40 \r
41 #include <stdlib.h>\r
42 #include <string.h>\r
43 \r
44 \r
45 //              Prevent flex from defining yywrap as extern "C" \r
46 \r
47 #define YY_SKIP_YYWRAP\r
48 \r
49 /*              No lex lib, supply the yywrap fcn. that normally resides there\r
50 */\r
51 \r
52 int NicParserwrap(){return(1);}\r
53 \r
54 extern int NicParserdebug;\r
55 \r
56 \r
57 /*\r
58                 These variables are used for error reporting:\r
59                 flex_nic_lineno : the line currently being parsed when the error occurs.\r
60                 flex_nic_ch : the character on the line where the error occurs\r
61                 flex_nic_linebuf : store the line for reporting.\r
62 \r
63                 NOTE : 1) the fixed size flex_nic_linebuf buffer is dangerous.\r
64                            2) You might get pointed to a place shortly after\r
65                                   where the syntax error occurs.  It is close enough\r
66                                   for now.\r
67 */\r
68 \r
69 int flex_nic_lineno = 1;\r
70 int flex_nic_ch = 0;\r
71 char flex_nic_linebuf[20000];\r
72 \r
73 char *flex_nic_stringinput = NULL;\r
74 int flex_nic_stringinput_ptr = 0;\r
75 FILE *flex_nic_fileinput = NULL;\r
76 int my_NicParser_yyinput(char *buf, int max_size);\r
77 \r
78 \r
79 \r
80 void NicParsererror(char *s){\r
81         int i;\r
82         fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",\r
83                                 flex_nic_lineno, flex_nic_ch, s, NicParsertext, flex_nic_linebuf );\r
84     for(i=0;i<flex_nic_ch;i++){\r
85                 if(flex_nic_linebuf[i] == '\t'){\r
86                         fprintf(stderr,"\t");\r
87                 }else{\r
88                         fprintf(stderr," ");\r
89                 }\r
90         }\r
91         fprintf(stderr,"^\n");\r
92         //      fprintf(stderr,"%*s\n",1+flex_nic_ch,"^");\r
93 }\r
94 \r
95 #undef YY_INPUT\r
96 #define YY_INPUT(b, r, ms) (r = my_NicParser_yyinput(b,ms))\r
97 \r
98 %}\r
99         /* MKS needs the next line to increase the NFA table */\r
100 %e 1200\r
101 %option noyywrap\r
102 \r
103 %%\r
104 \r
105         /* literal keyword tokens */\r
106 \r
107  /*\r
108                         The actions associated with each text token are to\r
109                         keep track of the current location (for syntax error reporting)\r
110                         and to report any necessary info to the emf.y parse tree builder\r
111 \r
112                         Its likely that there are a number of omissions, inconsistencies\r
113                         (some keywords do not need to be in caps), and relics\r
114                         (keywords such as BETWEEN, INDICATOR, etc., are not used\r
115                          in emf.y)\r
116                         This parser is somewhat of a work in progress.\r
117  */\r
118 \r
119  /*             Query keywords          */\r
120 \r
121 OPTIONS:             { flex_nic_ch+=NicParserleng; return OPTIONS; }\r
122 FUNCTIONS:             { flex_nic_ch+=NicParserleng; return FUNC; }\r
123 TYPES:             { flex_nic_ch+=NicParserleng; return TYPES; }\r
124 UNARY_OPS:             { flex_nic_ch+=NicParserleng; return UNARY_OPS; }\r
125 BINARY_OPS:             { flex_nic_ch+=NicParserleng; return BINARY_OPS; }\r
126 MISSING_FIELDS:             { flex_nic_ch+=NicParserleng; return FIELDS; }\r
127 \r
128 [;,=]   { flex_nic_ch+=NicParserleng;  return yytext[0]; }\r
129 \r
130         /* names */\r
131 \r
132 [A-Za-z_][A-Za-z0-9_]*  { flex_nic_ch+=NicParserleng; NicParserlval.strval = strdup(yytext); return NAME; }\r
133 \r
134 \r
135         /* strings */\r
136 \r
137 '[^'\n]*'       {\r
138                 \r
139                 int c;\r
140                 \r
141                 NicParserlval.strval = strdup(NicParsertext+1); \r
142 \r
143                 c = yyinput();\r
144 \r
145                 unput(c);       /* just peeking */\r
146                 if(c != '\'') {\r
147                         flex_nic_ch+=NicParserleng; \r
148                         NicParserlval.strval[NicParserleng-2] = '\0';\r
149                         return STRING_TOKEN;\r
150                 } else\r
151                         yymore();\r
152         }\r
153                 \r
154 '[^'\n]*$       { flex_nic_ch+=NicParserleng; NicParsererror("Unterminated string"); }\r
155 \r
156  /*                                                                                                                     */\r
157  /*             Newline : advance the error reporting line number       */\r
158  /*             and grab the next line into flex_nic_linebuf                    */\r
159  /*                                                                                                                     */\r
160 \r
161 \n.*            {flex_nic_ch=0; flex_nic_lineno++;\r
162                            strcpy(flex_nic_linebuf,NicParsertext+1);\r
163                            yyless(1);\r
164                            }\r
165 \r
166 [ \t\r]+        {flex_nic_ch+=NicParserleng; }  /* white space */\r
167 \r
168 "--".*$         {flex_nic_ch+=NicParserleng; }; /* comment */\r
169 "//".*$         {flex_nic_ch+=NicParserleng; }; /* comment */\r
170 \r
171 .|\n            {flex_nic_ch+=NicParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  NicParsererror(yytext);}\r
172 \r
173 %%\r
174 \r
175 int my_NicParser_yyinput(char *buf, int max_size){\r
176         int c = 0;\r
177         int inchar = 0;\r
178         \r
179         if(flex_nic_stringinput != NULL){\r
180                 while(c<max_size){\r
181                         if(flex_nic_stringinput[flex_nic_stringinput_ptr] != '\0'){\r
182                                 buf[c++] = flex_nic_stringinput[flex_nic_stringinput_ptr++];\r
183                         }else{\r
184                                 break;\r
185                         }\r
186                 }\r
187                 return(c);\r
188         }\r
189         \r
190         if(flex_nic_fileinput != NULL){\r
191                 while(c < max_size){\r
192                         inchar = getc(flex_nic_fileinput);\r
193                         if(inchar != EOF){\r
194                                 buf[c++] = inchar;\r
195                         }else{\r
196                                 break;\r
197                         }\r
198                 }\r
199                 return(c);\r
200         }\r
201         \r
202         return(0);\r
203 }\r
204 \r
205 void NicParser_setfileinput(FILE *f){\r
206         NicParserrestart(NULL);\r
207 \r
208         flex_nic_fileinput = f;\r
209         flex_nic_stringinput = NULL;\r
210         flex_nic_lineno = 1;\r
211         flex_nic_ch = 0;\r
212 }\r
213 \r
214 void NicParser_setstringinput(char *s){\r
215         NicParserrestart(NULL);\r
216 \r
217         flex_nic_fileinput = NULL;\r
218         flex_nic_stringinput = s;\r
219         flex_nic_stringinput_ptr = 0;\r
220         flex_nic_lineno = 1;\r
221         flex_nic_ch = 0;\r
222 }\r
223         \r
224                 \r
225 \r
226 \r