PIPS
read.l
Go to the documentation of this file.
1 %{
2 /*
3 
4  $Id: read.l 1373 2017-02-03 13:57:22Z guillou $
5 
6  Copyright 1989-2016 MINES ParisTech
7 
8  This file is part of NewGen.
9 
10  NewGen is free software: you can redistribute it and/or modify it under the
11  terms of the GNU General Public License as published by the Free Software
12  Foundation, either version 3 of the License, or any later version.
13 
14  NewGen is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17  License for more details.
18 
19  You should have received a copy of the GNU General Public License along with
20  NewGen. If not, see <http://www.gnu.org/licenses/>.
21 
22 */
23 
24 /*
25  The syntax of tokens written by GEN_WRITE.
26 */
27 
28 #include <stdio.h>
29 #include <stdint.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <math.h>
33 
34 #include "genC.h"
35 #include "newgen_include.h"
36 #include "genread.h"
37 
38 #ifndef yylval
39 #define yylval genread_lval
40 #endif // yylval
41 
42 static string literal = (char*) NULL;
43 static int literal_size = 0;
44 static void append_to_literal(string s)
45 {
46  int total;
47 
48  if (literal_size == 0) {
49  literal_size = 50;
50  literal = (char*) malloc(sizeof(char)*literal_size);
51  message_assert("malloc ok", literal);
52  literal[0]='\0';
53  }
54 
55  total = strlen(literal)+strlen(s)+1;
56  if (total >= literal_size) {
57  literal_size = total+100;
58  literal = (char*) realloc(literal, sizeof(char)*literal_size);
59  message_assert("realloc ok", literal);
60  }
61 
62  strcat(literal, s);
63 }
64 
65 static size_t
66  newgen_line_number,
67  newgen_char_number,
68  newgen_col_number,
69  newgen_lex_number;
70 
71 void newgen_start_lexer(FILE * in)
72 {
73  if (in) { yyin = in; }
74  newgen_char_number = 0;
75  newgen_line_number = 1;
76  newgen_col_number = 0;
77  newgen_lex_number = 0;
78 }
79 
80 void newgen_lexer_position(FILE * out)
81 {
82  fprintf(out, "newgen lexer token %zd at line %zd (column %zd, char %zd)\n",
83  newgen_lex_number, newgen_line_number,
84  newgen_col_number, newgen_char_number);
85 }
86 
87 %}
88 
89 %Start a_string
90 %option nounput
91 
92 %%
93 <a_string>\\\\ { append_to_literal("\\"); }
94 <a_string>\\\" { append_to_literal("\""); }
95 <a_string>[^\\"\n]* { append_to_literal(yytext); } /* " */
96 <a_string>[ \t\n]* { append_to_literal(yytext); }
97 <a_string>\" {
98  BEGIN 0 ;
99  yylval.s = strdup(literal);
100  free(literal); literal=(char*)NULL; literal_size=0;
101  newgen_lex_number++;
102  return READ_STRING ;
103  }
104 _ {
105  yylval.s = NULL;
106  newgen_lex_number++;
107  return READ_STRING;
108  }
109 ! {
110  yylval.s = string_undefined;
111  newgen_lex_number++;
112  return READ_STRING;
113  }
114 \[ { newgen_lex_number++; return LB; }
115 T { newgen_lex_number++; return CHUNK_BEGIN; }
116 \$ { newgen_lex_number++; return VECTOR_BEGIN; }
117 % { newgen_lex_number++; return ARROW_BEGIN; }
118 \* { newgen_lex_number++; return TABULATED_BEGIN; }
119 \‍( { newgen_lex_number++; return LP; }
120 \‍) { newgen_lex_number++; return RP; }
121 \{ { newgen_lex_number++; return LC; }
122 \} { newgen_lex_number++; return RC; }
123 H { newgen_lex_number++; return SHARED_POINTER; }
124 U { newgen_lex_number++; return READ_UNIT; }
125 B { newgen_lex_number++; return READ_BOOL; }
126 E { newgen_lex_number++; return READ_EXTERNAL; }
127 D { newgen_lex_number++; return READ_DEF; }
128 R { newgen_lex_number++; return READ_REF; }
129 N { newgen_lex_number++; return READ_NULL; }
130 L { newgen_lex_number++; return READ_LIST_UNDEFINED; }
131 S { newgen_lex_number++; return READ_SET_UNDEFINED; }
132 A { newgen_lex_number++; return READ_ARRAY_UNDEFINED; }
133 \#\\. {
134  yylval.c=*(yytext+2);
135  newgen_lex_number++;
136  return READ_CHAR;
137  }
138 [+-]?[ \t]*[0-9]+ {
139  yylval.val=atoi(yytext);
140  newgen_lex_number++;
141  return READ_INT;
142  }
143 [+-]?[ \t]*[0-9]+\.[0-9]+ {
144  yylval.d=atof(yytext);
145  newgen_lex_number++;
146  return READ_FLOAT;
147  }
148 \" { BEGIN a_string ; append_to_literal(""); }
149 [ \t]* ;
150 \n { newgen_line_number++; newgen_col_number=0; }
151 . { fatal("gen_read: Unknown character %x\n",
152  (int) yytext[0]);}
153 %%
154 
155 #ifdef FLEX_SCANNER
156 int genread_input()
157 {
158  newgen_char_number++;
159  newgen_col_number++;
160  return input();
161 }
162 #endif
163 
164 int yywrap(void)
165 {
166 #ifdef FLEX_SCANNER
167  yy_init = 1 ;
168 #endif
169  newgen_start_lexer(NULL);
170  return 1;
171 }