1/* Generated by re2c 0.9.1-C on Sun Oct  9 22:15:58 2005
2 */
3#line 1 "scanner.re"
4#include <stdlib.h>
5#include <string.h>
6#include "tools/re2c/scanner.h"
7#include "tools/re2c/parse.h"
8#include "tools/re2c/globals.h"
9#include "re2c-parser.h"
10
11#ifndef MAX
12#define MAX(a,b) (((a)>(b))?(a):(b))
13#endif
14
15#define	BSIZE	8192
16
17#define	YYCTYPE		unsigned char
18#define	YYCURSOR	cursor
19#define	YYLIMIT		s->lim
20#define	YYMARKER	s->ptr
21#define	YYFILL(n)	{cursor = fill(s, cursor);}
22
23#define	RETURN(i)	{s->cur = cursor; return i;}
24
25static unsigned char *fill(Scanner*, unsigned char*);
26
27void
28Scanner_init(Scanner *s, FILE *i)
29{
30    s->in = i;
31    s->bot = s->tok = s->ptr = s->cur = s->pos = s->lim = s->top =
32	     s->eof = NULL;
33    s->tchar = s->tline = 0;
34    s->cline = 1;
35}
36
37static unsigned char *
38fill(Scanner *s, unsigned char *cursor)
39{
40    if(!s->eof){
41	unsigned int cnt = s->tok - s->bot;
42	if(cnt){
43	    memcpy(s->bot, s->tok, s->lim - s->tok);
44	    s->tok = s->bot;
45	    s->ptr -= cnt;
46	    cursor -= cnt;
47	    s->pos -= cnt;
48	    s->lim -= cnt;
49	}
50	if((s->top - s->lim) < BSIZE){
51	    unsigned char *buf = malloc(((s->lim - s->bot) + BSIZE));
52	    memcpy(buf, s->tok, s->lim - s->tok);
53	    s->tok = buf;
54	    s->ptr = &buf[s->ptr - s->bot];
55	    cursor = &buf[cursor - s->bot];
56	    s->pos = &buf[s->pos - s->bot];
57	    s->lim = &buf[s->lim - s->bot];
58	    s->top = &s->lim[BSIZE];
59	    if (s->bot)
60		free(s->bot);
61	    s->bot = buf;
62	}
63	if((cnt = fread(s->lim, 1, BSIZE, s->in)) != BSIZE){
64	    s->eof = &s->lim[cnt]; *s->eof++ = '\0';
65	}
66	s->lim += cnt;
67    }
68    return cursor;
69}
70
71#line 79 "scanner.re"
72
73
74int
75Scanner_echo(Scanner *s, FILE *out)
76{
77    unsigned char *cursor = s->cur;
78    int ignore_eoc = 0;
79
80    /* Catch EOF */
81    if (s->eof && cursor == s->eof)
82	return 0;
83
84    s->tok = cursor;
85echo:
86
87#line 87 "scanner.c"
88{
89	YYCTYPE yych;
90	unsigned int yyaccept;
91	goto yy0;
92	++YYCURSOR;
93yy0:
94	if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);
95	yych = *YYCURSOR;
96	if(yych <= ')'){
97		if(yych <= '\000')	goto yy7;
98		if(yych == '\n')	goto yy5;
99		goto yy9;
100	} else {
101		if(yych <= '*')	goto yy4;
102		if(yych != '/')	goto yy9;
103		goto yy2;
104	}
105yy2:	yyaccept = 0;
106	yych = *(YYMARKER = ++YYCURSOR);
107	if(yych == '*')	goto yy12;
108	goto yy3;
109yy3:
110#line 117 "scanner.re"
111{ goto echo; }
112#line 112 "scanner.c"
113yy4:	yych = *++YYCURSOR;
114	if(yych == '/')	goto yy10;
115	goto yy3;
116yy5:	yych = *++YYCURSOR;
117	goto yy6;
118yy6:
119#line 112 "scanner.re"
120{ fwrite(s->tok, 1, cursor - s->tok, out);
121				  s->tok = s->pos = cursor; s->cline++; oline++;
122				  goto echo; }
123#line 123 "scanner.c"
124yy7:	yych = *++YYCURSOR;
125	goto yy8;
126yy8:
127#line 115 "scanner.re"
128{ fwrite(s->tok, 1, cursor - s->tok - 1, out); /* -1 so we don't write out the \0 */
129				  if(cursor == s->eof) { RETURN(0); } }
130#line 130 "scanner.c"
131yy9:	yych = *++YYCURSOR;
132	goto yy3;
133yy10:	yych = *++YYCURSOR;
134	goto yy11;
135yy11:
136#line 103 "scanner.re"
137{
138		if (ignore_eoc) {
139		    ignore_eoc = 0;
140		} else {
141		    fwrite(s->tok, 1, cursor - s->tok, out);
142		}
143		s->tok = s->pos = cursor;
144		goto echo;
145	}
146#line 146 "scanner.c"
147yy12:	yych = *++YYCURSOR;
148	if(yych == '!')	goto yy14;
149	goto yy13;
150yy13:	YYCURSOR = YYMARKER;
151	switch(yyaccept){
152	case 0:	goto yy3;
153	}
154yy14:	yych = *++YYCURSOR;
155	if(yych == 'm')	goto yy15;
156	if(yych == 'r')	goto yy16;
157	goto yy13;
158yy15:	yych = *++YYCURSOR;
159	if(yych == 'a')	goto yy21;
160	goto yy13;
161yy16:	yych = *++YYCURSOR;
162	if(yych != 'e')	goto yy13;
163	goto yy17;
164yy17:	yych = *++YYCURSOR;
165	if(yych != '2')	goto yy13;
166	goto yy18;
167yy18:	yych = *++YYCURSOR;
168	if(yych != 'c')	goto yy13;
169	goto yy19;
170yy19:	yych = *++YYCURSOR;
171	goto yy20;
172yy20:
173#line 94 "scanner.re"
174{ fwrite(s->tok, 1, &cursor[-7] - s->tok, out);
175				  s->tok = cursor;
176				  RETURN(1); }
177#line 177 "scanner.c"
178yy21:	yych = *++YYCURSOR;
179	if(yych != 'x')	goto yy13;
180	goto yy22;
181yy22:	yych = *++YYCURSOR;
182	if(yych != ':')	goto yy13;
183	goto yy23;
184yy23:	yych = *++YYCURSOR;
185	if(yych != 'r')	goto yy13;
186	goto yy24;
187yy24:	yych = *++YYCURSOR;
188	if(yych != 'e')	goto yy13;
189	goto yy25;
190yy25:	yych = *++YYCURSOR;
191	if(yych != '2')	goto yy13;
192	goto yy26;
193yy26:	yych = *++YYCURSOR;
194	if(yych != 'c')	goto yy13;
195	goto yy27;
196yy27:	yych = *++YYCURSOR;
197	goto yy28;
198yy28:
199#line 97 "scanner.re"
200{
201		fprintf(out, "#define YYMAXFILL %u\n", maxFill);
202		s->tok = s->pos = cursor;
203		ignore_eoc = 1;
204		goto echo;
205	}
206#line 206 "scanner.c"
207}
208#line 118 "scanner.re"
209
210}
211
212
213int
214Scanner_scan(Scanner *s)
215{
216    unsigned char *cursor = s->cur;
217    unsigned int depth;
218
219scan:
220    s->tchar = cursor - s->pos;
221    s->tline = s->cline;
222    s->tok = cursor;
223
224#line 224 "scanner.c"
225{
226	YYCTYPE yych;
227	unsigned int yyaccept;
228	goto yy29;
229	++YYCURSOR;
230yy29:
231	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
232	yych = *YYCURSOR;
233	if(yych <= '/'){
234		if(yych <= '"'){
235			if(yych <= '\n'){
236				if(yych <= '\b')	goto yy53;
237				if(yych <= '\t')	goto yy47;
238				goto yy49;
239			} else {
240				if(yych == ' ')	goto yy47;
241				if(yych <= '!')	goto yy53;
242				goto yy37;
243			}
244		} else {
245			if(yych <= '*'){
246				if(yych <= '&')	goto yy53;
247				if(yych <= '\'')	goto yy39;
248				if(yych <= ')')	goto yy43;
249				goto yy35;
250			} else {
251				if(yych <= '+')	goto yy44;
252				if(yych <= '-')	goto yy53;
253				if(yych <= '.')	goto yy51;
254				goto yy33;
255			}
256		}
257	} else {
258		if(yych <= '@'){
259			if(yych <= '<'){
260				if(yych == ';')	goto yy43;
261				goto yy53;
262			} else {
263				if(yych <= '=')	goto yy43;
264				if(yych == '?')	goto yy44;
265				goto yy53;
266			}
267		} else {
268			if(yych <= '`'){
269				if(yych <= 'Z')	goto yy45;
270				if(yych <= '[')	goto yy41;
271				if(yych <= '\\')	goto yy43;
272				goto yy53;
273			} else {
274				if(yych <= 'z')	goto yy45;
275				if(yych <= '{')	goto yy31;
276				if(yych <= '|')	goto yy43;
277				goto yy53;
278			}
279		}
280	}
281yy31:	yyaccept = 0;
282	yych = *(YYMARKER = ++YYCURSOR);
283	if(yych <= '/')	goto yy32;
284	if(yych <= '9')	goto yy84;
285	goto yy32;
286yy32:
287#line 133 "scanner.re"
288{ depth = 1;
289				  goto code;
290				}
291#line 291 "scanner.c"
292yy33:	yych = *++YYCURSOR;
293	if(yych == '*')	goto yy82;
294	goto yy34;
295yy34:
296#line 163 "scanner.re"
297{ RETURN(*s->tok); }
298#line 298 "scanner.c"
299yy35:	yych = *++YYCURSOR;
300	if(yych == '/')	goto yy80;
301	goto yy36;
302yy36:
303#line 165 "scanner.re"
304{ yylval.op = *s->tok;
305				  RETURN(CLOSE); }
306#line 306 "scanner.c"
307yy37:	yyaccept = 1;
308	yych = *(YYMARKER = ++YYCURSOR);
309	if(yych != '\n')	goto yy76;
310	goto yy38;
311yy38:
312#line 150 "scanner.re"
313{ Scanner_fatal(s, "unterminated string constant (missing \")"); }
314#line 314 "scanner.c"
315yy39:	yyaccept = 2;
316	yych = *(YYMARKER = ++YYCURSOR);
317	if(yych != '\n')	goto yy71;
318	goto yy40;
319yy40:
320#line 151 "scanner.re"
321{ Scanner_fatal(s, "unterminated string constant (missing ')"); }
322#line 322 "scanner.c"
323yy41:	yyaccept = 3;
324	yych = *(YYMARKER = ++YYCURSOR);
325	if(yych == '\n')	goto yy42;
326	if(yych == '^')	goto yy62;
327	goto yy60;
328yy42:
329#line 161 "scanner.re"
330{ Scanner_fatal(s, "unterminated range (missing ])"); }
331#line 331 "scanner.c"
332yy43:	yych = *++YYCURSOR;
333	goto yy34;
334yy44:	yych = *++YYCURSOR;
335	goto yy36;
336yy45:	yych = *++YYCURSOR;
337	goto yy58;
338yy46:
339#line 180 "scanner.re"
340{ SubStr substr;
341				  s->cur = cursor;
342				  substr = Scanner_token(s);
343				  yylval.symbol = Symbol_find(&substr);
344				  return ID; }
345#line 345 "scanner.c"
346yy47:	yych = *++YYCURSOR;
347	goto yy56;
348yy48:
349#line 186 "scanner.re"
350{ goto scan; }
351#line 351 "scanner.c"
352yy49:	yych = *++YYCURSOR;
353	goto yy50;
354yy50:
355#line 188 "scanner.re"
356{ if(cursor == s->eof) RETURN(0);
357				  s->pos = cursor; s->cline++;
358				  goto scan;
359	    			}
360#line 360 "scanner.c"
361yy51:	yych = *++YYCURSOR;
362	goto yy52;
363yy52:
364#line 193 "scanner.re"
365{ s->cur = cursor;
366				  yylval.regexp = mkDot();
367				  return RANGE;
368				}
369#line 369 "scanner.c"
370yy53:	yych = *++YYCURSOR;
371	goto yy54;
372yy54:
373#line 198 "scanner.re"
374{ fprintf(stderr, "unexpected character: '%c'\n", *s->tok);
375				  goto scan;
376				}
377#line 377 "scanner.c"
378yy55:	++YYCURSOR;
379	if(YYLIMIT == YYCURSOR) YYFILL(1);
380	yych = *YYCURSOR;
381	goto yy56;
382yy56:	if(yych == '\t')	goto yy55;
383	if(yych == ' ')	goto yy55;
384	goto yy48;
385yy57:	++YYCURSOR;
386	if(YYLIMIT == YYCURSOR) YYFILL(1);
387	yych = *YYCURSOR;
388	goto yy58;
389yy58:	if(yych <= '@'){
390		if(yych <= '/')	goto yy46;
391		if(yych <= '9')	goto yy57;
392		goto yy46;
393	} else {
394		if(yych <= 'Z')	goto yy57;
395		if(yych <= '`')	goto yy46;
396		if(yych <= 'z')	goto yy57;
397		goto yy46;
398	}
399yy59:	++YYCURSOR;
400	if(YYLIMIT == YYCURSOR) YYFILL(1);
401	yych = *YYCURSOR;
402	goto yy60;
403yy60:	if(yych <= '['){
404		if(yych != '\n')	goto yy59;
405		goto yy61;
406	} else {
407		if(yych <= '\\')	goto yy64;
408		if(yych <= ']')	goto yy65;
409		goto yy59;
410	}
411yy61:	YYCURSOR = YYMARKER;
412	switch(yyaccept){
413	case 0:	goto yy32;
414	case 1:	goto yy38;
415	case 2:	goto yy40;
416	case 3:	goto yy42;
417	}
418yy62:	++YYCURSOR;
419	if(YYLIMIT == YYCURSOR) YYFILL(1);
420	yych = *YYCURSOR;
421	goto yy63;
422yy63:	if(yych <= '['){
423		if(yych == '\n')	goto yy61;
424		goto yy62;
425	} else {
426		if(yych <= '\\')	goto yy67;
427		if(yych <= ']')	goto yy68;
428		goto yy62;
429	}
430yy64:	++YYCURSOR;
431	if(YYLIMIT == YYCURSOR) YYFILL(1);
432	yych = *YYCURSOR;
433	if(yych == '\n')	goto yy61;
434	goto yy59;
435yy65:	yych = *++YYCURSOR;
436	goto yy66;
437yy66:
438#line 157 "scanner.re"
439{ s->cur = cursor;
440				  yylval.regexp = ranToRE(Scanner_token(s));
441				  return RANGE; }
442#line 442 "scanner.c"
443yy67:	++YYCURSOR;
444	if(YYLIMIT == YYCURSOR) YYFILL(1);
445	yych = *YYCURSOR;
446	if(yych == '\n')	goto yy61;
447	goto yy62;
448yy68:	yych = *++YYCURSOR;
449	goto yy69;
450yy69:
451#line 153 "scanner.re"
452{ s->cur = cursor;
453				  yylval.regexp = invToRE(Scanner_token(s));
454				  return RANGE; }
455#line 455 "scanner.c"
456yy70:	++YYCURSOR;
457	if(YYLIMIT == YYCURSOR) YYFILL(1);
458	yych = *YYCURSOR;
459	goto yy71;
460yy71:	if(yych <= '&'){
461		if(yych == '\n')	goto yy61;
462		goto yy70;
463	} else {
464		if(yych <= '\'')	goto yy73;
465		if(yych != '\\')	goto yy70;
466		goto yy72;
467	}
468yy72:	++YYCURSOR;
469	if(YYLIMIT == YYCURSOR) YYFILL(1);
470	yych = *YYCURSOR;
471	if(yych == '\n')	goto yy61;
472	goto yy70;
473yy73:	yych = *++YYCURSOR;
474	goto yy74;
475yy74:
476#line 146 "scanner.re"
477{ s->cur = cursor;
478				  yylval.regexp = strToCaseInsensitiveRE(Scanner_token(s));
479				  return STRING; }
480#line 480 "scanner.c"
481yy75:	++YYCURSOR;
482	if(YYLIMIT == YYCURSOR) YYFILL(1);
483	yych = *YYCURSOR;
484	goto yy76;
485yy76:	if(yych <= '!'){
486		if(yych == '\n')	goto yy61;
487		goto yy75;
488	} else {
489		if(yych <= '"')	goto yy78;
490		if(yych != '\\')	goto yy75;
491		goto yy77;
492	}
493yy77:	++YYCURSOR;
494	if(YYLIMIT == YYCURSOR) YYFILL(1);
495	yych = *YYCURSOR;
496	if(yych == '\n')	goto yy61;
497	goto yy75;
498yy78:	yych = *++YYCURSOR;
499	goto yy79;
500yy79:
501#line 142 "scanner.re"
502{ s->cur = cursor;
503				  yylval.regexp = strToRE(Scanner_token(s));
504				  return STRING; }
505#line 505 "scanner.c"
506yy80:	yych = *++YYCURSOR;
507	goto yy81;
508yy81:
509#line 139 "scanner.re"
510{ s->tok = cursor;
511				  RETURN(0); }
512#line 512 "scanner.c"
513yy82:	yych = *++YYCURSOR;
514	goto yy83;
515yy83:
516#line 136 "scanner.re"
517{ depth = 1;
518				  goto comment; }
519#line 519 "scanner.c"
520yy84:	++YYCURSOR;
521	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
522	yych = *YYCURSOR;
523	goto yy85;
524yy85:	if(yych <= '/'){
525		if(yych == ',')	goto yy88;
526		goto yy61;
527	} else {
528		if(yych <= '9')	goto yy84;
529		if(yych != '}')	goto yy61;
530		goto yy86;
531	}
532yy86:	yych = *++YYCURSOR;
533	goto yy87;
534yy87:
535#line 168 "scanner.re"
536{ yylval.extop.minsize = atoi((char *)s->tok+1);
537				  yylval.extop.maxsize = atoi((char *)s->tok+1);
538				  RETURN(CLOSESIZE); }
539#line 539 "scanner.c"
540yy88:	yych = *++YYCURSOR;
541	if(yych != '}')	goto yy92;
542	goto yy89;
543yy89:	yych = *++YYCURSOR;
544	goto yy90;
545yy90:
546#line 176 "scanner.re"
547{ yylval.extop.minsize = atoi((char *)s->tok+1);
548				  yylval.extop.maxsize = -1;
549				  RETURN(CLOSESIZE); }
550#line 550 "scanner.c"
551yy91:	++YYCURSOR;
552	if(YYLIMIT == YYCURSOR) YYFILL(1);
553	yych = *YYCURSOR;
554	goto yy92;
555yy92:	if(yych <= '/')	goto yy61;
556	if(yych <= '9')	goto yy91;
557	if(yych != '}')	goto yy61;
558	goto yy93;
559yy93:	yych = *++YYCURSOR;
560	goto yy94;
561yy94:
562#line 172 "scanner.re"
563{ yylval.extop.minsize = atoi((char *)s->tok+1);
564				  yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)s->tok, ',')+1));
565				  RETURN(CLOSESIZE); }
566#line 566 "scanner.c"
567}
568#line 201 "scanner.re"
569
570
571code:
572
573#line 573 "scanner.c"
574{
575	YYCTYPE yych;
576	unsigned int yyaccept;
577	goto yy95;
578	++YYCURSOR;
579yy95:
580	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
581	yych = *YYCURSOR;
582	if(yych <= '&'){
583		if(yych <= '\n'){
584			if(yych <= '\t')	goto yy103;
585			goto yy101;
586		} else {
587			if(yych == '"')	goto yy105;
588			goto yy103;
589		}
590	} else {
591		if(yych <= '{'){
592			if(yych <= '\'')	goto yy106;
593			if(yych <= 'z')	goto yy103;
594			goto yy99;
595		} else {
596			if(yych != '}')	goto yy103;
597			goto yy97;
598		}
599	}
600yy97:	yych = *++YYCURSOR;
601	goto yy98;
602yy98:
603#line 205 "scanner.re"
604{ if(--depth == 0){
605					s->cur = cursor;
606					yylval.token = Token_new(Scanner_token(s), s->tline);
607					return CODE;
608				  }
609				  goto code; }
610#line 610 "scanner.c"
611yy99:	yych = *++YYCURSOR;
612	goto yy100;
613yy100:
614#line 211 "scanner.re"
615{ ++depth;
616				  goto code; }
617#line 617 "scanner.c"
618yy101:	yych = *++YYCURSOR;
619	goto yy102;
620yy102:
621#line 213 "scanner.re"
622{ if(cursor == s->eof) Scanner_fatal(s, "missing '}'");
623				  s->pos = cursor; s->cline++;
624				  goto code;
625				}
626#line 626 "scanner.c"
627yy103:	yych = *++YYCURSOR;
628	goto yy104;
629yy104:
630#line 217 "scanner.re"
631{ goto code; }
632#line 632 "scanner.c"
633yy105:	yyaccept = 0;
634	yych = *(YYMARKER = ++YYCURSOR);
635	if(yych == '\n')	goto yy104;
636	goto yy112;
637yy106:	yyaccept = 0;
638	yych = *(YYMARKER = ++YYCURSOR);
639	if(yych == '\n')	goto yy104;
640	goto yy108;
641yy107:	++YYCURSOR;
642	if(YYLIMIT == YYCURSOR) YYFILL(1);
643	yych = *YYCURSOR;
644	goto yy108;
645yy108:	if(yych <= '&'){
646		if(yych != '\n')	goto yy107;
647		goto yy109;
648	} else {
649		if(yych <= '\'')	goto yy103;
650		if(yych == '\\')	goto yy110;
651		goto yy107;
652	}
653yy109:	YYCURSOR = YYMARKER;
654	switch(yyaccept){
655	case 0:	goto yy104;
656	}
657yy110:	++YYCURSOR;
658	if(YYLIMIT == YYCURSOR) YYFILL(1);
659	yych = *YYCURSOR;
660	if(yych == '\n')	goto yy109;
661	goto yy107;
662yy111:	++YYCURSOR;
663	if(YYLIMIT == YYCURSOR) YYFILL(1);
664	yych = *YYCURSOR;
665	goto yy112;
666yy112:	if(yych <= '!'){
667		if(yych == '\n')	goto yy109;
668		goto yy111;
669	} else {
670		if(yych <= '"')	goto yy103;
671		if(yych != '\\')	goto yy111;
672		goto yy113;
673	}
674yy113:	++YYCURSOR;
675	if(YYLIMIT == YYCURSOR) YYFILL(1);
676	yych = *YYCURSOR;
677	if(yych == '\n')	goto yy109;
678	goto yy111;
679}
680#line 218 "scanner.re"
681
682
683comment:
684
685#line 685 "scanner.c"
686{
687	YYCTYPE yych;
688	goto yy114;
689	++YYCURSOR;
690yy114:
691	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
692	yych = *YYCURSOR;
693	if(yych <= ')'){
694		if(yych == '\n')	goto yy119;
695		goto yy121;
696	} else {
697		if(yych <= '*')	goto yy116;
698		if(yych == '/')	goto yy118;
699		goto yy121;
700	}
701yy116:	yych = *++YYCURSOR;
702	if(yych == '/')	goto yy124;
703	goto yy117;
704yy117:
705#line 232 "scanner.re"
706{ goto comment; }
707#line 707 "scanner.c"
708yy118:	yych = *++YYCURSOR;
709	if(yych == '*')	goto yy122;
710	goto yy117;
711yy119:	yych = *++YYCURSOR;
712	goto yy120;
713yy120:
714#line 228 "scanner.re"
715{ if(cursor == s->eof) RETURN(0);
716				  s->tok = s->pos = cursor; s->cline++;
717				  goto comment;
718				}
719#line 719 "scanner.c"
720yy121:	yych = *++YYCURSOR;
721	goto yy117;
722yy122:	yych = *++YYCURSOR;
723	goto yy123;
724yy123:
725#line 226 "scanner.re"
726{ ++depth;
727				  goto comment; }
728#line 728 "scanner.c"
729yy124:	yych = *++YYCURSOR;
730	goto yy125;
731yy125:
732#line 222 "scanner.re"
733{ if(--depth == 0)
734					goto scan;
735				    else
736					goto comment; }
737#line 737 "scanner.c"
738}
739#line 233 "scanner.re"
740
741}
742
743void
744Scanner_fatal(Scanner *s, const char *msg)
745{
746    fprintf(stderr, "line %d, column %d: %s\n", s->tline, s->tchar + 1, msg);
747    exit(1);
748}
749