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 ------------------------------------------- */
18 flex -PxmlParser -oxmllexer.cc xml.l
24 * AT&T lex can't handle this lexer due to lex bugs. It works with flex
25 * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
28 // #include "parse_fta.h"
36 Some includes that flex doesn't include as standard,
44 // Prevent flex from defining yywrap as extern "C"
46 #define YY_SKIP_YYWRAP
48 /* No lex lib, supply the yywrap fcn. that normally resides there
51 int xmlParserwrap(){return(1);}
53 extern int xmlParserdebug;
57 These variables are used for error reporting:
58 flex_xml_lineno : the line currently being parsed when the error occurs.
59 flex_xml_ch : the character on the line where the error occurs
60 flex_xml_linebuf : store the line for reporting.
62 NOTE : 1) the fixed size flex_xml_linebuf buffer is dangerous.
63 2) You might get pointed to a place shortly after
64 where the syntax error occurs. It is close enough
68 int flex_xml_lineno = 1;
70 char flex_xml_linebuf[20000];
72 char *flex_xml_stringinput = NULL;
73 int flex_xml_stringinput_ptr = 0;
74 FILE *flex_xml_fileinput = NULL;
75 int my_xmlParser_yyinput(char *buf, int max_size);
79 void xmlParsererror(char *s){
81 fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
82 flex_xml_lineno, flex_xml_ch, s, xmlParsertext, flex_xml_linebuf );
83 for(i=0;i<flex_xml_ch;i++){
84 if(flex_xml_linebuf[i] == '\t'){
90 fprintf(stderr,"^\n");
91 // fprintf(stderr,"%*s\n",1+flex_xml_ch,"^");
95 #define YY_INPUT(b, r, ms) (r = my_xmlParser_yyinput(b,ms))
98 /* MKS needs the next line to increase the NFA table */
104 /* literal keyword tokens */
107 The actions associated with each text token are to
108 keep track of the current location (for syntax error reporting)
109 and to report any necessary info to the emf.y parse tree builder
111 Its likely that there are a number of omissions, inconsistencies
112 (some keywords do not need to be in caps), and relics
113 (keywords such as BETWEEN, INDICATOR, etc., are not used
115 This parser is somewhat of a work in progress.
123 [<>=/] { flex_xml_ch+=xmlParserleng; return yytext[0]; }
127 [A-Za-z_][A-Za-z0-9_:\-]* { flex_xml_ch+=xmlParserleng; xmlParserlval.strval = strdup(yytext); return NAME; }
136 xmlParserlval.strval = strdup(xmlParsertext+1);
140 unput(c); /* just peeking */
142 flex_xml_ch+=xmlParserleng;
143 xmlParserlval.strval[xmlParserleng-2] = '\0';
149 \'[^\'\n]*$ { flex_xml_ch+=xmlParserleng; xmlParsererror("Unterminated string"); }
152 /* Newline : advance the error reporting line number */
153 /* and grab the next line into flex_xml_linebuf */
156 \n.* {flex_xml_ch=0; flex_xml_lineno++;
157 strcpy(flex_xml_linebuf,xmlParsertext+1);
161 [ \t\r]+ {flex_xml_ch+=xmlParserleng; } /* white space */
163 "--".*$ {flex_xml_ch+=xmlParserleng; }; /* comment */
164 "//".*$ {flex_xml_ch+=xmlParserleng; }; /* comment */
165 "<?xml".*$ {flex_xml_ch+=xmlParserleng; }; /* comment */
167 .|\n {flex_xml_ch+=xmlParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n"); xmlParsererror(yytext);}
171 int my_xmlParser_yyinput(char *buf, int max_size){
175 if(flex_xml_stringinput != NULL){
177 if(flex_xml_stringinput[flex_xml_stringinput_ptr] != '\0'){
178 buf[c++] = flex_xml_stringinput[flex_xml_stringinput_ptr++];
186 if(flex_xml_fileinput != NULL){
188 inchar = getc(flex_xml_fileinput);
201 void xmlParser_setfileinput(FILE *f){
202 xmlParserrestart(NULL);
204 flex_xml_fileinput = f;
205 flex_xml_stringinput = NULL;
210 void xmlParser_setstringinput(char *s){
211 xmlParserrestart(NULL);
213 flex_xml_fileinput = NULL;
214 flex_xml_stringinput = s;
215 flex_xml_stringinput_ptr = 0;