1
2 #line 1 "pullscan.rl"
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #define BUFSIZE 4096
8
9 typedef struct _Scanner {
10 /* Scanner state. */
11 int cs;
12 int act;
13 int have;
14 int curline;
15 char *ts;
16 char *te;
17 char *p;
18 char *pe;
19 char *eof;
20 FILE *file;
21 int done;
22
23 /* Token data */
24 char *data;
25 int len;
26 int value;
27
28 char buf[BUFSIZE];
29 } Scanner;
30
31
32
33 #line 34 "pullscan.c"
34 static const int Scanner_start = 2;
35 static const int Scanner_first_final = 2;
36 static const int Scanner_error = -1;
37
38 static const int Scanner_en_main = 2;
39
40
41 #line 33 "pullscan.rl"
42
43
scan_init(Scanner * s,FILE * file)44 void scan_init( Scanner *s, FILE *file )
45 {
46 memset (s, '\0', sizeof(Scanner));
47 s->curline = 1;
48 s->file = file;
49 s->eof = 0;
50
51 #line 52 "pullscan.c"
52 {
53 s->cs = Scanner_start;
54 s->ts = 0;
55 s->te = 0;
56 s->act = 0;
57 }
58
59 #line 42 "pullscan.rl"
60 }
61
62 #define TK_NO_TOKEN (-1)
63 #define TK_ERR 128
64 #define TK_EOF 129
65 #define TK_Identifier 130
66 #define TK_Number 131
67 #define TK_String 132
68
69 #define ret_tok( _tok ) token = _tok; s->data = s->ts
70
scan(Scanner * s)71 int scan( Scanner *s )
72 {
73 int token = TK_NO_TOKEN;
74 int space, readlen;
75
76 while ( 1 ) {
77 if ( s->p == s->pe ) {
78 printf("scanner: need more data\n");
79
80 if ( s->ts == 0 )
81 s->have = 0;
82 else {
83 /* There is data that needs to be shifted over. */
84 printf("scanner: buffer broken mid token\n");
85 s->have = s->pe - s->ts;
86 memmove( s->buf, s->ts, s->have );
87 s->te -= (s->ts-s->buf);
88 s->ts = s->buf;
89 }
90
91 s->p = s->buf + s->have;
92 space = BUFSIZE - s->have;
93
94 if ( space == 0 ) {
95 /* We filled up the buffer trying to scan a token. */
96 printf("scanner: out of buffer space\n");
97 return TK_ERR;
98 }
99
100 if ( s->done ) {
101 printf("scanner: end of file\n");
102 s->p[0] = 0;
103 readlen = 1;
104 }
105 else {
106 readlen = fread( s->p, 1, space, s->file );
107 if ( readlen < space )
108 s->done = 1;
109 }
110
111 s->pe = s->p + readlen;
112 }
113
114
115 #line 116 "pullscan.c"
116 {
117 if ( ( s->p) == ( s->pe) )
118 goto _test_eof;
119 switch ( s->cs )
120 {
121 tr0:
122 #line 125 "pullscan.rl"
123 {{( s->p) = (( s->te))-1;}{ ret_tok( *s->p ); {( s->p)++; s->cs = 2; goto _out;} }}
124 goto st2;
125 tr2:
126 #line 113 "pullscan.rl"
127 { s->te = ( s->p)+1;{ ret_tok( TK_String ); {( s->p)++; s->cs = 2; goto _out;} }}
128 goto st2;
129 tr4:
130 #line 125 "pullscan.rl"
131 { s->te = ( s->p)+1;{ ret_tok( *s->p ); {( s->p)++; s->cs = 2; goto _out;} }}
132 goto st2;
133 tr5:
134 #line 121 "pullscan.rl"
135 { s->te = ( s->p)+1;{ ret_tok( TK_EOF ); {( s->p)++; s->cs = 2; goto _out;} }}
136 goto st2;
137 tr6:
138 #line 110 "pullscan.rl"
139 { s->te = ( s->p)+1;}
140 goto st2;
141 tr10:
142 #line 125 "pullscan.rl"
143 { s->te = ( s->p);( s->p)--;{ ret_tok( *s->p ); {( s->p)++; s->cs = 2; goto _out;} }}
144 goto st2;
145 tr11:
146 #line 117 "pullscan.rl"
147 { s->te = ( s->p);( s->p)--;{ ret_tok( TK_Number ); {( s->p)++; s->cs = 2; goto _out;} }}
148 goto st2;
149 tr12:
150 #line 107 "pullscan.rl"
151 { s->te = ( s->p);( s->p)--;{ ret_tok( TK_Identifier ); {( s->p)++; s->cs = 2; goto _out;} }}
152 goto st2;
153 st2:
154 #line 1 "NONE"
155 { s->ts = 0;}
156 if ( ++( s->p) == ( s->pe) )
157 goto _test_eof2;
158 case 2:
159 #line 1 "NONE"
160 { s->ts = ( s->p);}
161 #line 162 "pullscan.c"
162 switch( (*( s->p)) ) {
163 case 0: goto tr5;
164 case 32: goto tr6;
165 case 34: goto tr7;
166 case 95: goto st5;
167 }
168 if ( (*( s->p)) < 48 ) {
169 if ( 9 <= (*( s->p)) && (*( s->p)) <= 10 )
170 goto tr6;
171 } else if ( (*( s->p)) > 57 ) {
172 if ( (*( s->p)) > 90 ) {
173 if ( 97 <= (*( s->p)) && (*( s->p)) <= 122 )
174 goto st5;
175 } else if ( (*( s->p)) >= 65 )
176 goto st5;
177 } else
178 goto st4;
179 goto tr4;
180 tr7:
181 #line 1 "NONE"
182 { s->te = ( s->p)+1;}
183 goto st3;
184 st3:
185 if ( ++( s->p) == ( s->pe) )
186 goto _test_eof3;
187 case 3:
188 #line 189 "pullscan.c"
189 switch( (*( s->p)) ) {
190 case 34: goto tr2;
191 case 92: goto st1;
192 }
193 goto st0;
194 st0:
195 if ( ++( s->p) == ( s->pe) )
196 goto _test_eof0;
197 case 0:
198 switch( (*( s->p)) ) {
199 case 34: goto tr2;
200 case 92: goto st1;
201 }
202 goto st0;
203 st1:
204 if ( ++( s->p) == ( s->pe) )
205 goto _test_eof1;
206 case 1:
207 goto st0;
208 st4:
209 if ( ++( s->p) == ( s->pe) )
210 goto _test_eof4;
211 case 4:
212 if ( 48 <= (*( s->p)) && (*( s->p)) <= 57 )
213 goto st4;
214 goto tr11;
215 st5:
216 if ( ++( s->p) == ( s->pe) )
217 goto _test_eof5;
218 case 5:
219 if ( (*( s->p)) == 95 )
220 goto st5;
221 if ( (*( s->p)) < 65 ) {
222 if ( 48 <= (*( s->p)) && (*( s->p)) <= 57 )
223 goto st5;
224 } else if ( (*( s->p)) > 90 ) {
225 if ( 97 <= (*( s->p)) && (*( s->p)) <= 122 )
226 goto st5;
227 } else
228 goto st5;
229 goto tr12;
230 }
231 _test_eof2: s->cs = 2; goto _test_eof;
232 _test_eof3: s->cs = 3; goto _test_eof;
233 _test_eof0: s->cs = 0; goto _test_eof;
234 _test_eof1: s->cs = 1; goto _test_eof;
235 _test_eof4: s->cs = 4; goto _test_eof;
236 _test_eof5: s->cs = 5; goto _test_eof;
237
238 _test_eof: {}
239 if ( ( s->p) == ( s->eof) )
240 {
241 switch ( s->cs ) {
242 case 3: goto tr10;
243 case 0: goto tr0;
244 case 1: goto tr0;
245 case 4: goto tr11;
246 case 5: goto tr12;
247 }
248 }
249
250 _out: {}
251 }
252
253 #line 130 "pullscan.rl"
254
255
256 if ( s->cs == Scanner_error )
257 return TK_ERR;
258
259 if ( token != TK_NO_TOKEN ) {
260 s->len = s->p - s->data;
261 return token;
262 }
263 }
264 }
265
266
main(int argc,char ** argv)267 int main (int argc, char** argv)
268 {
269 Scanner ss;
270 int tok;
271
272 scan_init(&ss, stdin);
273
274 while ( 1 ) {
275 tok = scan (&ss);
276 if ( tok == TK_EOF ) {
277 printf ("parser: EOF\n");
278 break;
279 }
280 else if ( tok == TK_ERR ) {
281 printf ("parser: ERR\n");
282 break;
283 }
284 else {
285 printf ("parser: %d \"", tok);
286 fwrite ( ss.data, 1, ss.len, stdout );
287 printf ("\"\n" );
288 }
289 }
290
291 return 0;
292 }
293
294
295