Improvements to aggregation code and fucntion library
[com/gs-lite.git] / src / ftacmp / partn.l
1 /* ------------------------------------------------
2 Copyright 2014 AT&T Intellectual Property
3    Licensed under the Apache License, Version 2.0 (the "License");
4    you may not use this file except in compliance with the License.
5    You may obtain a copy of the License at
6
7      http://www.apache.org/licenses/LICENSE-2.0
8
9    Unless required by applicable law or agreed to in writing, software
10    distributed under the License is distributed on an "AS IS" BASIS,
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12    See the License for the specific language governing permissions and
13    limitations under the License.
14  ------------------------------------------- */
15
16
17 /*
18         MUST COMPILE WITH
19                 flex -PPartnParser -opartnlexer.cc partn.l
20         (or equivalent).
21 */      
22
23 %{
24 /*
25  * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
26  * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
27  */
28
29  #include "parse_partn.h"
30  #include <string.h>
31
32
33
34 #include "partn.tab.cc.h"
35
36 /*
37         Some includes that flex doesn't include as standard,
38         but which are needed.
39 */
40
41 #include <stdlib.h>
42 #include <string.h>
43
44
45 //              Prevent flex from defining yywrap as extern "C" 
46
47 #define YY_SKIP_YYWRAP
48
49 /*              No lex lib, supply the yywrap fcn. that normally resides there
50 */
51
52 int PartnParserwrap(){return(1);}
53
54 extern int PartnParserdebug;
55
56
57 /*
58                 These variables are used for error reporting:
59                 flex_partn_lineno : the line currently being parsed when the error occurs.
60                 flex_partn_ch : the character on the line where the error occurs
61                 flex_partn_linebuf : store the line for reporting.
62
63                 NOTE : 1) the fixed size flex_partn_linebuf buffer is dangerous.
64                            2) You might get pointed to a place shortly after
65                                   where the syntax error occurs.  It is close enough
66                                   for now.
67 */
68
69 int flex_partn_lineno = 1;
70 int flex_partn_ch = 0;
71 char flex_partn_linebuf[20000];
72
73 char *flex_partn_stringinput = NULL;
74 int flex_partn_stringinput_ptr = 0;
75 FILE *flex_partn_fileinput = NULL;
76 int my_PartnParser_yyinput(char *buf, int max_size);
77
78
79
80 void PartnParsererror(char *s){
81         int i;
82         fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
83                                 flex_partn_lineno, flex_partn_ch, s, PartnParsertext, flex_partn_linebuf );
84     for(i=0;i<flex_partn_ch;i++){
85                 if(flex_partn_linebuf[i] == '\t'){
86                         fprintf(stderr,"\t");
87                 }else{
88                         fprintf(stderr," ");
89                 }
90         }
91         fprintf(stderr,"^\n");
92         //      fprintf(stderr,"%*s\n",1+flex_partn_ch,"^");
93 }
94
95 #undef YY_INPUT
96 #define YY_INPUT(b, r, ms) (r = my_PartnParser_yyinput(b,ms))
97
98 %}
99         /* MKS needs the next line to increase the NFA table */
100 %e 1200
101 %option noyywrap
102
103 %%
104
105         /* literal keyword tokens */
106
107  /*
108                         The actions associated with each text token are to
109                         keep track of the current location (for syntax error reporting)
110                         and to report any necessary info to the emf.y parse tree builder
111
112                         Its likely that there are a number of omissions, inconsistencies
113                         (some keywords do not need to be in caps), and relics
114                         (keywords such as BETWEEN, INDICATOR, etc., are not used
115                          in emf.y)
116                         This parser is somewhat of a work in progress.
117  */
118
119  /*             Query keywords          */
120
121 HEX     { flex_partn_ch+=PartnParserleng; return HEX_L;}
122 LHEX    { flex_partn_ch+=PartnParserleng; return LHEX_L;}
123 IP_VAL  { flex_partn_ch+=PartnParserleng; return IP_L;}
124
125
126
127         /* punctuation */
128
129 [;%&|!+*/:(),.\[\]$@#]  { flex_partn_ch+=PartnParserleng; return yytext[0]; }
130 "-"     { flex_partn_ch+=PartnParserleng; return yytext[0]; }
131 "~"     { flex_partn_ch+=PartnParserleng; return yytext[0]; }
132
133         /* names */
134
135 [A-Za-z_][A-Za-z0-9_]*  { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext); return NAME; }
136
137         /* numbers */
138
139 [0-9]+  |
140 [0-9]+UL        { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext);  return INTNUM; }
141
142 [0-9]+ULL       { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext);  return LONGINTNUM; }
143
144
145         /* strings */
146
147  /*                                                                                                                     */
148  /*             Newline : advance the error reporting line number       */
149  /*             and grab the next line into flex_partn_linebuf                  */
150  /*                                                                                                                     */
151
152 \n.*            {flex_partn_ch=0; flex_partn_lineno++;
153                            strcpy(flex_partn_linebuf,PartnParsertext+1);
154                            yyless(1);
155                            }
156
157 [ \t\r]+        {flex_partn_ch+=PartnParserleng; }      /* white space */
158
159 "--".*$         {flex_partn_ch+=PartnParserleng; };     /* comment */
160 "//".*$         {flex_partn_ch+=PartnParserleng; };     /* comment */
161
162 .|\n            {flex_partn_ch+=PartnParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  PartnParsererror(yytext);}
163
164 %%
165
166 int my_PartnParser_yyinput(char *buf, int max_size){
167         int c = 0;
168         int inchar = 0;
169         
170         if(flex_partn_stringinput != NULL){
171                 while(c<max_size){
172                         if(flex_partn_stringinput[flex_partn_stringinput_ptr] != '\0'){
173                                 buf[c++] = flex_partn_stringinput[flex_partn_stringinput_ptr++];
174                         }else{
175                                 break;
176                         }
177                 }
178                 return(c);
179         }
180         
181         if(flex_partn_fileinput != NULL){
182                 while(c < max_size){
183                         inchar = getc(flex_partn_fileinput);
184                         if(inchar != EOF){
185                                 buf[c++] = inchar;
186                         }else{
187                                 break;
188                         }
189                 }
190                 return(c);
191         }
192         
193         return(0);
194 }
195
196 void PartnParser_setfileinput(FILE *f){
197         PartnParserrestart(NULL);
198
199         flex_partn_fileinput = f;
200         flex_partn_stringinput = NULL;
201         flex_partn_lineno = 1;
202         flex_partn_ch = 0;
203 }
204
205 void PartnParser_setstringinput(char *s){
206         PartnParserrestart(NULL);
207
208         flex_partn_fileinput = NULL;
209         flex_partn_stringinput = s;
210         flex_partn_stringinput_ptr = 0;
211         flex_partn_lineno = 1;
212         flex_partn_ch = 0;
213 }
214         
215                 
216
217