Home | History | Annotate | Download | only in re2c
      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 "tools/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 
     25 static unsigned char *fill(Scanner*, unsigned char*);
     26 
     27 void
     28 Scanner_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 
     37 static unsigned char *
     38 fill(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) + 1);
     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 
     74 int
     75 Scanner_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;
     85 echo:
     86 
     87 #line 87 "scanner.c"
     88 {
     89 	YYCTYPE yych;
     90 	unsigned int yyaccept;
     91 	goto yy0;
     92 	++YYCURSOR;
     93 yy0:
     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 	}
    105 yy2:	yyaccept = 0;
    106 	yych = *(YYMARKER = ++YYCURSOR);
    107 	if(yych == '*')	goto yy12;
    108 	goto yy3;
    109 yy3:
    110 #line 117 "scanner.re"
    111 { goto echo; }
    112 #line 112 "scanner.c"
    113 yy4:	yych = *++YYCURSOR;
    114 	if(yych == '/')	goto yy10;
    115 	goto yy3;
    116 yy5:	yych = *++YYCURSOR;
    117 	goto yy6;
    118 yy6:
    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"
    124 yy7:	yych = *++YYCURSOR;
    125 	goto yy8;
    126 yy8:
    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"
    131 yy9:	yych = *++YYCURSOR;
    132 	goto yy3;
    133 yy10:	yych = *++YYCURSOR;
    134 	goto yy11;
    135 yy11:
    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"
    147 yy12:	yych = *++YYCURSOR;
    148 	if(yych == '!')	goto yy14;
    149 	goto yy13;
    150 yy13:	YYCURSOR = YYMARKER;
    151 	switch(yyaccept){
    152 	case 0:	goto yy3;
    153 	}
    154 yy14:	yych = *++YYCURSOR;
    155 	if(yych == 'm')	goto yy15;
    156 	if(yych == 'r')	goto yy16;
    157 	goto yy13;
    158 yy15:	yych = *++YYCURSOR;
    159 	if(yych == 'a')	goto yy21;
    160 	goto yy13;
    161 yy16:	yych = *++YYCURSOR;
    162 	if(yych != 'e')	goto yy13;
    163 	goto yy17;
    164 yy17:	yych = *++YYCURSOR;
    165 	if(yych != '2')	goto yy13;
    166 	goto yy18;
    167 yy18:	yych = *++YYCURSOR;
    168 	if(yych != 'c')	goto yy13;
    169 	goto yy19;
    170 yy19:	yych = *++YYCURSOR;
    171 	goto yy20;
    172 yy20:
    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"
    178 yy21:	yych = *++YYCURSOR;
    179 	if(yych != 'x')	goto yy13;
    180 	goto yy22;
    181 yy22:	yych = *++YYCURSOR;
    182 	if(yych != ':')	goto yy13;
    183 	goto yy23;
    184 yy23:	yych = *++YYCURSOR;
    185 	if(yych != 'r')	goto yy13;
    186 	goto yy24;
    187 yy24:	yych = *++YYCURSOR;
    188 	if(yych != 'e')	goto yy13;
    189 	goto yy25;
    190 yy25:	yych = *++YYCURSOR;
    191 	if(yych != '2')	goto yy13;
    192 	goto yy26;
    193 yy26:	yych = *++YYCURSOR;
    194 	if(yych != 'c')	goto yy13;
    195 	goto yy27;
    196 yy27:	yych = *++YYCURSOR;
    197 	goto yy28;
    198 yy28:
    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 
    213 int
    214 Scanner_scan(Scanner *s)
    215 {
    216     unsigned char *cursor = s->cur;
    217     unsigned int depth;
    218 
    219 scan:
    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;
    230 yy29:
    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 	}
    281 yy31:	yyaccept = 0;
    282 	yych = *(YYMARKER = ++YYCURSOR);
    283 	if(yych <= '/')	goto yy32;
    284 	if(yych <= '9')	goto yy84;
    285 	goto yy32;
    286 yy32:
    287 #line 133 "scanner.re"
    288 { depth = 1;
    289 				  goto code;
    290 				}
    291 #line 291 "scanner.c"
    292 yy33:	yych = *++YYCURSOR;
    293 	if(yych == '*')	goto yy82;
    294 	goto yy34;
    295 yy34:
    296 #line 163 "scanner.re"
    297 { RETURN(*s->tok); }
    298 #line 298 "scanner.c"
    299 yy35:	yych = *++YYCURSOR;
    300 	if(yych == '/')	goto yy80;
    301 	goto yy36;
    302 yy36:
    303 #line 165 "scanner.re"
    304 { yylval.op = *s->tok;
    305 				  RETURN(CLOSE); }
    306 #line 306 "scanner.c"
    307 yy37:	yyaccept = 1;
    308 	yych = *(YYMARKER = ++YYCURSOR);
    309 	if(yych != '\n')	goto yy76;
    310 	goto yy38;
    311 yy38:
    312 #line 150 "scanner.re"
    313 { Scanner_fatal(s, "unterminated string constant (missing \")"); }
    314 #line 314 "scanner.c"
    315 yy39:	yyaccept = 2;
    316 	yych = *(YYMARKER = ++YYCURSOR);
    317 	if(yych != '\n')	goto yy71;
    318 	goto yy40;
    319 yy40:
    320 #line 151 "scanner.re"
    321 { Scanner_fatal(s, "unterminated string constant (missing ')"); }
    322 #line 322 "scanner.c"
    323 yy41:	yyaccept = 3;
    324 	yych = *(YYMARKER = ++YYCURSOR);
    325 	if(yych == '\n')	goto yy42;
    326 	if(yych == '^')	goto yy62;
    327 	goto yy60;
    328 yy42:
    329 #line 161 "scanner.re"
    330 { Scanner_fatal(s, "unterminated range (missing ])"); }
    331 #line 331 "scanner.c"
    332 yy43:	yych = *++YYCURSOR;
    333 	goto yy34;
    334 yy44:	yych = *++YYCURSOR;
    335 	goto yy36;
    336 yy45:	yych = *++YYCURSOR;
    337 	goto yy58;
    338 yy46:
    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"
    346 yy47:	yych = *++YYCURSOR;
    347 	goto yy56;
    348 yy48:
    349 #line 186 "scanner.re"
    350 { goto scan; }
    351 #line 351 "scanner.c"
    352 yy49:	yych = *++YYCURSOR;
    353 	goto yy50;
    354 yy50:
    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"
    361 yy51:	yych = *++YYCURSOR;
    362 	goto yy52;
    363 yy52:
    364 #line 193 "scanner.re"
    365 { s->cur = cursor;
    366 				  yylval.regexp = mkDot();
    367 				  return RANGE;
    368 				}
    369 #line 369 "scanner.c"
    370 yy53:	yych = *++YYCURSOR;
    371 	goto yy54;
    372 yy54:
    373 #line 198 "scanner.re"
    374 { fprintf(stderr, "unexpected character: '%c'\n", *s->tok);
    375 				  goto scan;
    376 				}
    377 #line 377 "scanner.c"
    378 yy55:	++YYCURSOR;
    379 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    380 	yych = *YYCURSOR;
    381 	goto yy56;
    382 yy56:	if(yych == '\t')	goto yy55;
    383 	if(yych == ' ')	goto yy55;
    384 	goto yy48;
    385 yy57:	++YYCURSOR;
    386 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    387 	yych = *YYCURSOR;
    388 	goto yy58;
    389 yy58:	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 	}
    399 yy59:	++YYCURSOR;
    400 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    401 	yych = *YYCURSOR;
    402 	goto yy60;
    403 yy60:	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 	}
    411 yy61:	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 	}
    418 yy62:	++YYCURSOR;
    419 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    420 	yych = *YYCURSOR;
    421 	goto yy63;
    422 yy63:	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 	}
    430 yy64:	++YYCURSOR;
    431 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    432 	yych = *YYCURSOR;
    433 	if(yych == '\n')	goto yy61;
    434 	goto yy59;
    435 yy65:	yych = *++YYCURSOR;
    436 	goto yy66;
    437 yy66:
    438 #line 157 "scanner.re"
    439 { s->cur = cursor;
    440 				  yylval.regexp = ranToRE(Scanner_token(s));
    441 				  return RANGE; }
    442 #line 442 "scanner.c"
    443 yy67:	++YYCURSOR;
    444 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    445 	yych = *YYCURSOR;
    446 	if(yych == '\n')	goto yy61;
    447 	goto yy62;
    448 yy68:	yych = *++YYCURSOR;
    449 	goto yy69;
    450 yy69:
    451 #line 153 "scanner.re"
    452 { s->cur = cursor;
    453 				  yylval.regexp = invToRE(Scanner_token(s));
    454 				  return RANGE; }
    455 #line 455 "scanner.c"
    456 yy70:	++YYCURSOR;
    457 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    458 	yych = *YYCURSOR;
    459 	goto yy71;
    460 yy71:	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 	}
    468 yy72:	++YYCURSOR;
    469 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    470 	yych = *YYCURSOR;
    471 	if(yych == '\n')	goto yy61;
    472 	goto yy70;
    473 yy73:	yych = *++YYCURSOR;
    474 	goto yy74;
    475 yy74:
    476 #line 146 "scanner.re"
    477 { s->cur = cursor;
    478 				  yylval.regexp = strToCaseInsensitiveRE(Scanner_token(s));
    479 				  return STRING; }
    480 #line 480 "scanner.c"
    481 yy75:	++YYCURSOR;
    482 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    483 	yych = *YYCURSOR;
    484 	goto yy76;
    485 yy76:	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 	}
    493 yy77:	++YYCURSOR;
    494 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    495 	yych = *YYCURSOR;
    496 	if(yych == '\n')	goto yy61;
    497 	goto yy75;
    498 yy78:	yych = *++YYCURSOR;
    499 	goto yy79;
    500 yy79:
    501 #line 142 "scanner.re"
    502 { s->cur = cursor;
    503 				  yylval.regexp = strToRE(Scanner_token(s));
    504 				  return STRING; }
    505 #line 505 "scanner.c"
    506 yy80:	yych = *++YYCURSOR;
    507 	goto yy81;
    508 yy81:
    509 #line 139 "scanner.re"
    510 { s->tok = cursor;
    511 				  RETURN(0); }
    512 #line 512 "scanner.c"
    513 yy82:	yych = *++YYCURSOR;
    514 	goto yy83;
    515 yy83:
    516 #line 136 "scanner.re"
    517 { depth = 1;
    518 				  goto comment; }
    519 #line 519 "scanner.c"
    520 yy84:	++YYCURSOR;
    521 	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
    522 	yych = *YYCURSOR;
    523 	goto yy85;
    524 yy85:	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 	}
    532 yy86:	yych = *++YYCURSOR;
    533 	goto yy87;
    534 yy87:
    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"
    540 yy88:	yych = *++YYCURSOR;
    541 	if(yych != '}')	goto yy92;
    542 	goto yy89;
    543 yy89:	yych = *++YYCURSOR;
    544 	goto yy90;
    545 yy90:
    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"
    551 yy91:	++YYCURSOR;
    552 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    553 	yych = *YYCURSOR;
    554 	goto yy92;
    555 yy92:	if(yych <= '/')	goto yy61;
    556 	if(yych <= '9')	goto yy91;
    557 	if(yych != '}')	goto yy61;
    558 	goto yy93;
    559 yy93:	yych = *++YYCURSOR;
    560 	goto yy94;
    561 yy94:
    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 
    571 code:
    572 
    573 #line 573 "scanner.c"
    574 {
    575 	YYCTYPE yych;
    576 	unsigned int yyaccept;
    577 	goto yy95;
    578 	++YYCURSOR;
    579 yy95:
    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 	}
    600 yy97:	yych = *++YYCURSOR;
    601 	goto yy98;
    602 yy98:
    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"
    611 yy99:	yych = *++YYCURSOR;
    612 	goto yy100;
    613 yy100:
    614 #line 211 "scanner.re"
    615 { ++depth;
    616 				  goto code; }
    617 #line 617 "scanner.c"
    618 yy101:	yych = *++YYCURSOR;
    619 	goto yy102;
    620 yy102:
    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"
    627 yy103:	yych = *++YYCURSOR;
    628 	goto yy104;
    629 yy104:
    630 #line 217 "scanner.re"
    631 { goto code; }
    632 #line 632 "scanner.c"
    633 yy105:	yyaccept = 0;
    634 	yych = *(YYMARKER = ++YYCURSOR);
    635 	if(yych == '\n')	goto yy104;
    636 	goto yy112;
    637 yy106:	yyaccept = 0;
    638 	yych = *(YYMARKER = ++YYCURSOR);
    639 	if(yych == '\n')	goto yy104;
    640 	goto yy108;
    641 yy107:	++YYCURSOR;
    642 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    643 	yych = *YYCURSOR;
    644 	goto yy108;
    645 yy108:	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 	}
    653 yy109:	YYCURSOR = YYMARKER;
    654 	switch(yyaccept){
    655 	case 0:	goto yy104;
    656 	}
    657 yy110:	++YYCURSOR;
    658 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    659 	yych = *YYCURSOR;
    660 	if(yych == '\n')	goto yy109;
    661 	goto yy107;
    662 yy111:	++YYCURSOR;
    663 	if(YYLIMIT == YYCURSOR) YYFILL(1);
    664 	yych = *YYCURSOR;
    665 	goto yy112;
    666 yy112:	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 	}
    674 yy113:	++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 
    683 comment:
    684 
    685 #line 685 "scanner.c"
    686 {
    687 	YYCTYPE yych;
    688 	goto yy114;
    689 	++YYCURSOR;
    690 yy114:
    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 	}
    701 yy116:	yych = *++YYCURSOR;
    702 	if(yych == '/')	goto yy124;
    703 	goto yy117;
    704 yy117:
    705 #line 232 "scanner.re"
    706 { goto comment; }
    707 #line 707 "scanner.c"
    708 yy118:	yych = *++YYCURSOR;
    709 	if(yych == '*')	goto yy122;
    710 	goto yy117;
    711 yy119:	yych = *++YYCURSOR;
    712 	goto yy120;
    713 yy120:
    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"
    720 yy121:	yych = *++YYCURSOR;
    721 	goto yy117;
    722 yy122:	yych = *++YYCURSOR;
    723 	goto yy123;
    724 yy123:
    725 #line 226 "scanner.re"
    726 { ++depth;
    727 				  goto comment; }
    728 #line 728 "scanner.c"
    729 yy124:	yych = *++YYCURSOR;
    730 	goto yy125;
    731 yy125:
    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 
    743 void
    744 Scanner_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