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
7 http://www.apache.org/licenses/LICENSE-2.0
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 ------------------------------------------- */
19 flex -PIfqParser -oifqlexer.cc ifq.l
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.
29 #include "parse_fta.h"
34 #include "ifq.tab.cc.h"
37 Some includes that flex doesn't include as standard,
45 // Prevent flex from defining yywrap as extern "C"
47 #define YY_SKIP_YYWRAP
49 /* No lex lib, supply the yywrap fcn. that normally resides there
52 int IfqParserwrap(){return(1);}
54 extern int IfqParserdebug;
58 These variables are used for error reporting:
59 flex_ifq_lineno : the line currently being parsed when the error occurs.
60 flex_ifq_ch : the character on the line where the error occurs
61 flex_ifq_linebuf : store the line for reporting.
63 NOTE : 1) the fixed size flex_ifq_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
69 int flex_ifq_lineno = 1;
71 char flex_ifq_linebuf[20000];
73 char *flex_ifq_stringinput = NULL;
74 int flex_ifq_stringinput_ptr = 0;
75 FILE *flex_ifq_fileinput = NULL;
76 int my_IfqParser_yyinput(char *buf, int max_size);
80 void IfqParsererror(char *s){
82 fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
83 flex_ifq_lineno, flex_ifq_ch, s, IfqParsertext, flex_ifq_linebuf );
84 for(i=0;i<flex_ifq_ch;i++){
85 if(flex_ifq_linebuf[i] == '\t'){
91 fprintf(stderr,"^\n");
92 // fprintf(stderr,"%*s\n",1+flex_ifq_ch,"^");
96 #define YY_INPUT(b, r, ms) (r = my_IfqParser_yyinput(b,ms))
99 /* MKS needs the next line to increase the NFA table */
105 /* literal keyword tokens */
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
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
116 This parser is somewhat of a work in progress.
121 AND|And|and { flex_ifq_ch+=IfqParserleng; return AND; }
122 NOT|Not|not { flex_ifq_ch+=IfqParserleng; return NOT; }
123 OR|Or|or { flex_ifq_ch+=IfqParserleng; return OR; }
125 TRUE { flex_ifq_ch+=IfqParserleng; return TRUE_V;}
126 FALSE { flex_ifq_ch+=IfqParserleng; return FALSE_V;}
128 Contains|Equals|Exists {flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return PRED; }
130 ; {flex_ifq_ch+=IfqParserleng; return SEMICOLON;}
134 [&|!+*/:(),.\[\]$] { flex_ifq_ch+=IfqParserleng; return yytext[0]; }
135 "-" { flex_ifq_ch+=IfqParserleng; return yytext[0]; }
136 "~" { flex_ifq_ch+=IfqParserleng; return yytext[0]; }
140 [A-Za-z_][A-Za-z0-9_]* { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return NAME; }
145 [0-9]+UL { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return INTNUM; }
147 [0-9]+ULL { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return LONGINTNUM; }
151 [0-9]+[eE][+-]?[0-9]+ |
152 [0-9]+"."[0-9]*[eE][+-]?[0-9]+ |
153 "."[0-9]*[eE][+-]?[0-9]+ { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return APPROXNUM; }
161 IfqParserlval.strval = strdup(IfqParsertext+1);
165 unput(c); /* just peeking */
167 flex_ifq_ch+=IfqParserleng;
168 IfqParserlval.strval[IfqParserleng-2] = '\0';
174 '[^'\n]*$ { flex_ifq_ch+=IfqParserleng; IfqParsererror("Unterminated string"); }
177 /* Newline : advance the error reporting line number */
178 /* and grab the next line into flex_ifq_linebuf */
181 \n.* {flex_ifq_ch=0; flex_ifq_lineno++;
182 strcpy(flex_ifq_linebuf,IfqParsertext+1);
186 [ \t\r]+ {flex_ifq_ch+=IfqParserleng; } /* white space */
188 "--".*$ {flex_ifq_ch+=IfqParserleng; }; /* comment */
189 "//".*$ {flex_ifq_ch+=IfqParserleng; }; /* comment */
191 .|\n {flex_ifq_ch+=IfqParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n"); IfqParsererror(yytext);}
195 int my_IfqParser_yyinput(char *buf, int max_size){
199 if(flex_ifq_stringinput != NULL){
201 if(flex_ifq_stringinput[flex_ifq_stringinput_ptr] != '\0'){
202 buf[c++] = flex_ifq_stringinput[flex_ifq_stringinput_ptr++];
210 if(flex_ifq_fileinput != NULL){
212 inchar = getc(flex_ifq_fileinput);
225 void IfqParser_setfileinput(FILE *f){
226 IfqParserrestart(NULL);
228 flex_ifq_fileinput = f;
229 flex_ifq_stringinput = NULL;
234 void IfqParser_setstringinput(char *s){
235 IfqParserrestart(NULL);
237 flex_ifq_fileinput = NULL;
238 flex_ifq_stringinput = s;
239 flex_ifq_stringinput_ptr = 0;