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