4 $Id: read.l 1373 2017-02-03 13:57:22Z guillou $
6 Copyright 1989-2016 MINES ParisTech
8 This file is part of NewGen.
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.
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.
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/>.
25 The syntax of tokens written by GEN_WRITE.
35 #include "newgen_include.h"
39 #define yylval genread_lval
42 static string literal = (char*) NULL;
43 static int literal_size = 0;
44 static void append_to_literal(string s)
48 if (literal_size == 0) {
50 literal = (char*) malloc(sizeof(char)*literal_size);
51 message_assert("malloc ok", literal);
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);
71 void newgen_start_lexer(FILE * in)
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;
80 void newgen_lexer_position(FILE * out)
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);
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); }
99 yylval.s = strdup(literal);
100 free(literal); literal=(char*)NULL; literal_size=0;
110 yylval.s = string_undefined;
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; }
134 yylval.c=*(yytext+2);
139 yylval.val=atoi(yytext);
143 [+-]?[ \t]*[0-9]+\.[0-9]+ {
144 yylval.d=atof(yytext);
148 \" { BEGIN a_string ; append_to_literal(""); }
150 \n { newgen_line_number++; newgen_col_number=0; }
151 . { fatal("gen_read: Unknown character %x\n",
158 newgen_char_number++;
169 newgen_start_lexer(NULL);