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 -PPartnParser -opartnlexer.cc partn.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_partn.h"
34 #include "partn.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 PartnParserwrap(){return(1);}
54 extern int PartnParserdebug;
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.
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
69 int flex_partn_lineno = 1;
70 int flex_partn_ch = 0;
71 char flex_partn_linebuf[20000];
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);
80 void PartnParsererror(char *s){
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'){
91 fprintf(stderr,"^\n");
92 // fprintf(stderr,"%*s\n",1+flex_partn_ch,"^");
96 #define YY_INPUT(b, r, ms) (r = my_PartnParser_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 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;}
129 [;%&|!+*/:(),.\[\]$@#] { flex_partn_ch+=PartnParserleng; return yytext[0]; }
130 "-" { flex_partn_ch+=PartnParserleng; return yytext[0]; }
131 "~" { flex_partn_ch+=PartnParserleng; return yytext[0]; }
135 [A-Za-z_][A-Za-z0-9_]* { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext); return NAME; }
140 [0-9]+UL { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext); return INTNUM; }
142 [0-9]+ULL { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext); return LONGINTNUM; }
148 /* Newline : advance the error reporting line number */
149 /* and grab the next line into flex_partn_linebuf */
152 \n.* {flex_partn_ch=0; flex_partn_lineno++;
153 strcpy(flex_partn_linebuf,PartnParsertext+1);
157 [ \t\r]+ {flex_partn_ch+=PartnParserleng; } /* white space */
159 "--".*$ {flex_partn_ch+=PartnParserleng; }; /* comment */
160 "//".*$ {flex_partn_ch+=PartnParserleng; }; /* comment */
162 .|\n {flex_partn_ch+=PartnParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n"); PartnParsererror(yytext);}
166 int my_PartnParser_yyinput(char *buf, int max_size){
170 if(flex_partn_stringinput != NULL){
172 if(flex_partn_stringinput[flex_partn_stringinput_ptr] != '\0'){
173 buf[c++] = flex_partn_stringinput[flex_partn_stringinput_ptr++];
181 if(flex_partn_fileinput != NULL){
183 inchar = getc(flex_partn_fileinput);
196 void PartnParser_setfileinput(FILE *f){
197 PartnParserrestart(NULL);
199 flex_partn_fileinput = f;
200 flex_partn_stringinput = NULL;
201 flex_partn_lineno = 1;
205 void PartnParser_setstringinput(char *s){
206 PartnParserrestart(NULL);
208 flex_partn_fileinput = NULL;
209 flex_partn_stringinput = s;
210 flex_partn_stringinput_ptr = 0;
211 flex_partn_lineno = 1;