Annotation of src/usr.bin/lex/gen.c, Revision 1.1
1.1 ! deraadt 1: /* gen - actual generation (writing) of flex scanners */
! 2:
! 3: /*-
! 4: * Copyright (c) 1990 The Regents of the University of California.
! 5: * All rights reserved.
! 6: *
! 7: * This code is derived from software contributed to Berkeley by
! 8: * Vern Paxson.
! 9: *
! 10: * The United States Government has rights in this work pursuant
! 11: * to contract no. DE-AC03-76SF00098 between the United States
! 12: * Department of Energy and the University of California.
! 13: *
! 14: * Redistribution and use in source and binary forms are permitted provided
! 15: * that: (1) source distributions retain this entire copyright notice and
! 16: * comment, and (2) distributions including binaries display the following
! 17: * acknowledgement: ``This product includes software developed by the
! 18: * University of California, Berkeley and its contributors'' in the
! 19: * documentation or other materials provided with the distribution and in
! 20: * all advertising materials mentioning features or use of this software.
! 21: * Neither the name of the University nor the names of its contributors may
! 22: * be used to endorse or promote products derived from this software without
! 23: * specific prior written permission.
! 24: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
! 25: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
! 26: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
! 27: */
! 28:
! 29: /* $Header: /a/cvsroot/src/usr.bin/lex/gen.c,v 1.10 1995/05/05 05:35:25 jtc Exp $ */
! 30:
! 31: #include "flexdef.h"
! 32:
! 33:
! 34: /* declare functions that have forward references */
! 35:
! 36: void gen_next_state PROTO((int));
! 37: void genecs PROTO((void));
! 38: void indent_put2s PROTO((char [], char []));
! 39: void indent_puts PROTO((char []));
! 40:
! 41:
! 42: static int indent_level = 0; /* each level is 8 spaces */
! 43:
! 44: #define indent_up() (++indent_level)
! 45: #define indent_down() (--indent_level)
! 46: #define set_indent(indent_val) indent_level = indent_val
! 47:
! 48: /* Almost everything is done in terms of arrays starting at 1, so provide
! 49: * a null entry for the zero element of all C arrays. (The exception
! 50: * to this is that the fast table representation generally uses the
! 51: * 0 elements of its arrays, too.)
! 52: */
! 53: static char C_int_decl[] = "static yyconst int %s[%d] =\n { 0,\n";
! 54: static char C_short_decl[] = "static yyconst short int %s[%d] =\n { 0,\n";
! 55: static char C_long_decl[] = "static yyconst long int %s[%d] =\n { 0,\n";
! 56: static char C_state_decl[] =
! 57: "static yyconst yy_state_type %s[%d] =\n { 0,\n";
! 58:
! 59:
! 60: /* Indent to the current level. */
! 61:
! 62: void do_indent()
! 63: {
! 64: register int i = indent_level * 8;
! 65:
! 66: while ( i >= 8 )
! 67: {
! 68: outc( '\t' );
! 69: i -= 8;
! 70: }
! 71:
! 72: while ( i > 0 )
! 73: {
! 74: outc( ' ' );
! 75: --i;
! 76: }
! 77: }
! 78:
! 79:
! 80: /* Generate the code to keep backing-up information. */
! 81:
! 82: void gen_backing_up()
! 83: {
! 84: if ( reject || num_backing_up == 0 )
! 85: return;
! 86:
! 87: if ( fullspd )
! 88: indent_puts( "if ( yy_current_state[-1].yy_nxt )" );
! 89: else
! 90: indent_puts( "if ( yy_accept[yy_current_state] )" );
! 91:
! 92: indent_up();
! 93: indent_puts( "{" );
! 94: indent_puts( "yy_last_accepting_state = yy_current_state;" );
! 95: indent_puts( "yy_last_accepting_cpos = yy_cp;" );
! 96: indent_puts( "}" );
! 97: indent_down();
! 98: }
! 99:
! 100:
! 101: /* Generate the code to perform the backing up. */
! 102:
! 103: void gen_bu_action()
! 104: {
! 105: if ( reject || num_backing_up == 0 )
! 106: return;
! 107:
! 108: set_indent( 3 );
! 109:
! 110: indent_puts( "case 0: /* must back up */" );
! 111: indent_puts( "/* undo the effects of YY_DO_BEFORE_ACTION */" );
! 112: indent_puts( "*yy_cp = yy_hold_char;" );
! 113:
! 114: if ( fullspd || fulltbl )
! 115: indent_puts( "yy_cp = yy_last_accepting_cpos + 1;" );
! 116: else
! 117: /* Backing-up info for compressed tables is taken \after/
! 118: * yy_cp has been incremented for the next state.
! 119: */
! 120: indent_puts( "yy_cp = yy_last_accepting_cpos;" );
! 121:
! 122: indent_puts( "yy_current_state = yy_last_accepting_state;" );
! 123: indent_puts( "goto yy_find_action;" );
! 124: outc( '\n' );
! 125:
! 126: set_indent( 0 );
! 127: }
! 128:
! 129:
! 130: /* genctbl - generates full speed compressed transition table */
! 131:
! 132: void genctbl()
! 133: {
! 134: register int i;
! 135: int end_of_buffer_action = num_rules + 1;
! 136:
! 137: /* Table of verify for transition and offset to next state. */
! 138: out_dec( "static yyconst struct yy_trans_info yy_transition[%d] =\n",
! 139: tblend + numecs + 1 );
! 140: outn( " {" );
! 141:
! 142: /* We want the transition to be represented as the offset to the
! 143: * next state, not the actual state number, which is what it currently
! 144: * is. The offset is base[nxt[i]] - (base of current state)]. That's
! 145: * just the difference between the starting points of the two involved
! 146: * states (to - from).
! 147: *
! 148: * First, though, we need to find some way to put in our end-of-buffer
! 149: * flags and states. We do this by making a state with absolutely no
! 150: * transitions. We put it at the end of the table.
! 151: */
! 152:
! 153: /* We need to have room in nxt/chk for two more slots: One for the
! 154: * action and one for the end-of-buffer transition. We now *assume*
! 155: * that we're guaranteed the only character we'll try to index this
! 156: * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure
! 157: * there's room for jam entries for other characters.
! 158: */
! 159:
! 160: while ( tblend + 2 >= current_max_xpairs )
! 161: expand_nxt_chk();
! 162:
! 163: while ( lastdfa + 1 >= current_max_dfas )
! 164: increase_max_dfas();
! 165:
! 166: base[lastdfa + 1] = tblend + 2;
! 167: nxt[tblend + 1] = end_of_buffer_action;
! 168: chk[tblend + 1] = numecs + 1;
! 169: chk[tblend + 2] = 1; /* anything but EOB */
! 170:
! 171: /* So that "make test" won't show arb. differences. */
! 172: nxt[tblend + 2] = 0;
! 173:
! 174: /* Make sure every state has an end-of-buffer transition and an
! 175: * action #.
! 176: */
! 177: for ( i = 0; i <= lastdfa; ++i )
! 178: {
! 179: int anum = dfaacc[i].dfaacc_state;
! 180: int offset = base[i];
! 181:
! 182: chk[offset] = EOB_POSITION;
! 183: chk[offset - 1] = ACTION_POSITION;
! 184: nxt[offset - 1] = anum; /* action number */
! 185: }
! 186:
! 187: for ( i = 0; i <= tblend; ++i )
! 188: {
! 189: if ( chk[i] == EOB_POSITION )
! 190: transition_struct_out( 0, base[lastdfa + 1] - i );
! 191:
! 192: else if ( chk[i] == ACTION_POSITION )
! 193: transition_struct_out( 0, nxt[i] );
! 194:
! 195: else if ( chk[i] > numecs || chk[i] == 0 )
! 196: transition_struct_out( 0, 0 ); /* unused slot */
! 197:
! 198: else /* verify, transition */
! 199: transition_struct_out( chk[i],
! 200: base[nxt[i]] - (i - chk[i]) );
! 201: }
! 202:
! 203:
! 204: /* Here's the final, end-of-buffer state. */
! 205: transition_struct_out( chk[tblend + 1], nxt[tblend + 1] );
! 206: transition_struct_out( chk[tblend + 2], nxt[tblend + 2] );
! 207:
! 208: outn( " };\n" );
! 209:
! 210: /* Table of pointers to start states. */
! 211: out_dec(
! 212: "static yyconst struct yy_trans_info *yy_start_state_list[%d] =\n",
! 213: lastsc * 2 + 1 );
! 214: outn( " {" ); /* } so vi doesn't get confused */
! 215:
! 216: for ( i = 0; i <= lastsc * 2; ++i )
! 217: out_dec( " &yy_transition[%d],\n", base[i] );
! 218:
! 219: dataend();
! 220:
! 221: if ( useecs )
! 222: genecs();
! 223: }
! 224:
! 225:
! 226: /* Generate equivalence-class tables. */
! 227:
! 228: void genecs()
! 229: {
! 230: register int i, j;
! 231: int numrows;
! 232:
! 233: out_str_dec( C_int_decl, "yy_ec", csize );
! 234:
! 235: for ( i = 1; i < csize; ++i )
! 236: {
! 237: if ( caseins && (i >= 'A') && (i <= 'Z') )
! 238: ecgroup[i] = ecgroup[clower( i )];
! 239:
! 240: ecgroup[i] = ABS( ecgroup[i] );
! 241: mkdata( ecgroup[i] );
! 242: }
! 243:
! 244: dataend();
! 245:
! 246: if ( trace )
! 247: {
! 248: fputs( _( "\n\nEquivalence Classes:\n\n" ), stderr );
! 249:
! 250: numrows = csize / 8;
! 251:
! 252: for ( j = 0; j < numrows; ++j )
! 253: {
! 254: for ( i = j; i < csize; i = i + numrows )
! 255: {
! 256: fprintf( stderr, "%4s = %-2d",
! 257: readable_form( i ), ecgroup[i] );
! 258:
! 259: putc( ' ', stderr );
! 260: }
! 261:
! 262: putc( '\n', stderr );
! 263: }
! 264: }
! 265: }
! 266:
! 267:
! 268: /* Generate the code to find the action number. */
! 269:
! 270: void gen_find_action()
! 271: {
! 272: if ( fullspd )
! 273: indent_puts( "yy_act = yy_current_state[-1].yy_nxt;" );
! 274:
! 275: else if ( fulltbl )
! 276: indent_puts( "yy_act = yy_accept[yy_current_state];" );
! 277:
! 278: else if ( reject )
! 279: {
! 280: indent_puts( "yy_current_state = *--yy_state_ptr;" );
! 281: indent_puts( "yy_lp = yy_accept[yy_current_state];" );
! 282:
! 283: outn(
! 284: "find_rule: /* we branch to this label when backing up */" );
! 285:
! 286: indent_puts(
! 287: "for ( ; ; ) /* until we find what rule we matched */" );
! 288:
! 289: indent_up();
! 290:
! 291: indent_puts( "{" );
! 292:
! 293: indent_puts(
! 294: "if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )" );
! 295: indent_up();
! 296: indent_puts( "{" );
! 297: indent_puts( "yy_act = yy_acclist[yy_lp];" );
! 298:
! 299: if ( variable_trailing_context_rules )
! 300: {
! 301: indent_puts( "if ( yy_act & YY_TRAILING_HEAD_MASK ||" );
! 302: indent_puts( " yy_looking_for_trail_begin )" );
! 303: indent_up();
! 304: indent_puts( "{" );
! 305:
! 306: indent_puts(
! 307: "if ( yy_act == yy_looking_for_trail_begin )" );
! 308: indent_up();
! 309: indent_puts( "{" );
! 310: indent_puts( "yy_looking_for_trail_begin = 0;" );
! 311: indent_puts( "yy_act &= ~YY_TRAILING_HEAD_MASK;" );
! 312: indent_puts( "break;" );
! 313: indent_puts( "}" );
! 314: indent_down();
! 315:
! 316: indent_puts( "}" );
! 317: indent_down();
! 318:
! 319: indent_puts( "else if ( yy_act & YY_TRAILING_MASK )" );
! 320: indent_up();
! 321: indent_puts( "{" );
! 322: indent_puts(
! 323: "yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;" );
! 324: indent_puts(
! 325: "yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;" );
! 326:
! 327: if ( real_reject )
! 328: {
! 329: /* Remember matched text in case we back up
! 330: * due to REJECT.
! 331: */
! 332: indent_puts( "yy_full_match = yy_cp;" );
! 333: indent_puts( "yy_full_state = yy_state_ptr;" );
! 334: indent_puts( "yy_full_lp = yy_lp;" );
! 335: }
! 336:
! 337: indent_puts( "}" );
! 338: indent_down();
! 339:
! 340: indent_puts( "else" );
! 341: indent_up();
! 342: indent_puts( "{" );
! 343: indent_puts( "yy_full_match = yy_cp;" );
! 344: indent_puts( "yy_full_state = yy_state_ptr;" );
! 345: indent_puts( "yy_full_lp = yy_lp;" );
! 346: indent_puts( "break;" );
! 347: indent_puts( "}" );
! 348: indent_down();
! 349:
! 350: indent_puts( "++yy_lp;" );
! 351: indent_puts( "goto find_rule;" );
! 352: }
! 353:
! 354: else
! 355: {
! 356: /* Remember matched text in case we back up due to
! 357: * trailing context plus REJECT.
! 358: */
! 359: indent_up();
! 360: indent_puts( "{" );
! 361: indent_puts( "yy_full_match = yy_cp;" );
! 362: indent_puts( "break;" );
! 363: indent_puts( "}" );
! 364: indent_down();
! 365: }
! 366:
! 367: indent_puts( "}" );
! 368: indent_down();
! 369:
! 370: indent_puts( "--yy_cp;" );
! 371:
! 372: /* We could consolidate the following two lines with those at
! 373: * the beginning, but at the cost of complaints that we're
! 374: * branching inside a loop.
! 375: */
! 376: indent_puts( "yy_current_state = *--yy_state_ptr;" );
! 377: indent_puts( "yy_lp = yy_accept[yy_current_state];" );
! 378:
! 379: indent_puts( "}" );
! 380:
! 381: indent_down();
! 382: }
! 383:
! 384: else
! 385: { /* compressed */
! 386: indent_puts( "yy_act = yy_accept[yy_current_state];" );
! 387:
! 388: if ( interactive && ! reject )
! 389: {
! 390: /* Do the guaranteed-needed backing up to figure out
! 391: * the match.
! 392: */
! 393: indent_puts( "if ( yy_act == 0 )" );
! 394: indent_up();
! 395: indent_puts( "{ /* have to back up */" );
! 396: indent_puts( "yy_cp = yy_last_accepting_cpos;" );
! 397: indent_puts(
! 398: "yy_current_state = yy_last_accepting_state;" );
! 399: indent_puts( "yy_act = yy_accept[yy_current_state];" );
! 400: indent_puts( "}" );
! 401: indent_down();
! 402: }
! 403: }
! 404: }
! 405:
! 406:
! 407: /* genftbl - generate full transition table */
! 408:
! 409: void genftbl()
! 410: {
! 411: register int i;
! 412: int end_of_buffer_action = num_rules + 1;
! 413:
! 414: out_str_dec( long_align ? C_long_decl : C_short_decl,
! 415: "yy_accept", lastdfa + 1 );
! 416:
! 417: dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
! 418:
! 419: for ( i = 1; i <= lastdfa; ++i )
! 420: {
! 421: register int anum = dfaacc[i].dfaacc_state;
! 422:
! 423: mkdata( anum );
! 424:
! 425: if ( trace && anum )
! 426: fprintf( stderr, _( "state # %d accepts: [%d]\n" ),
! 427: i, anum );
! 428: }
! 429:
! 430: dataend();
! 431:
! 432: if ( useecs )
! 433: genecs();
! 434:
! 435: /* Don't have to dump the actual full table entries - they were
! 436: * created on-the-fly.
! 437: */
! 438: }
! 439:
! 440:
! 441: /* Generate the code to find the next compressed-table state. */
! 442:
! 443: void gen_next_compressed_state( char_map )
! 444: char *char_map;
! 445: {
! 446: indent_put2s( "register YY_CHAR yy_c = %s;", char_map );
! 447:
! 448: /* Save the backing-up info \before/ computing the next state
! 449: * because we always compute one more state than needed - we
! 450: * always proceed until we reach a jam state
! 451: */
! 452: gen_backing_up();
! 453:
! 454: indent_puts(
! 455: "while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )" );
! 456: indent_up();
! 457: indent_puts( "{" );
! 458: indent_puts( "yy_current_state = (int) yy_def[yy_current_state];" );
! 459:
! 460: if ( usemecs )
! 461: {
! 462: /* We've arrange it so that templates are never chained
! 463: * to one another. This means we can afford to make a
! 464: * very simple test to see if we need to convert to
! 465: * yy_c's meta-equivalence class without worrying
! 466: * about erroneously looking up the meta-equivalence
! 467: * class twice
! 468: */
! 469: do_indent();
! 470:
! 471: /* lastdfa + 2 is the beginning of the templates */
! 472: out_dec( "if ( yy_current_state >= %d )\n", lastdfa + 2 );
! 473:
! 474: indent_up();
! 475: indent_puts( "yy_c = yy_meta[(unsigned int) yy_c];" );
! 476: indent_down();
! 477: }
! 478:
! 479: indent_puts( "}" );
! 480: indent_down();
! 481:
! 482: indent_puts(
! 483: "yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];" );
! 484: }
! 485:
! 486:
! 487: /* Generate the code to find the next match. */
! 488:
! 489: void gen_next_match()
! 490: {
! 491: /* NOTE - changes in here should be reflected in gen_next_state() and
! 492: * gen_NUL_trans().
! 493: */
! 494: char *char_map = useecs ?
! 495: "yy_ec[YY_SC_TO_UI(*yy_cp)]" :
! 496: "YY_SC_TO_UI(*yy_cp)";
! 497:
! 498: char *char_map_2 = useecs ?
! 499: "yy_ec[YY_SC_TO_UI(*++yy_cp)]" :
! 500: "YY_SC_TO_UI(*++yy_cp)";
! 501:
! 502: if ( fulltbl )
! 503: {
! 504: indent_put2s(
! 505: "while ( (yy_current_state = yy_nxt[yy_current_state][%s]) > 0 )",
! 506: char_map );
! 507:
! 508: indent_up();
! 509:
! 510: if ( num_backing_up > 0 )
! 511: {
! 512: indent_puts( "{" ); /* } for vi */
! 513: gen_backing_up();
! 514: outc( '\n' );
! 515: }
! 516:
! 517: indent_puts( "++yy_cp;" );
! 518:
! 519: if ( num_backing_up > 0 )
! 520: /* { for vi */
! 521: indent_puts( "}" );
! 522:
! 523: indent_down();
! 524:
! 525: outc( '\n' );
! 526: indent_puts( "yy_current_state = -yy_current_state;" );
! 527: }
! 528:
! 529: else if ( fullspd )
! 530: {
! 531: indent_puts( "{" ); /* } for vi */
! 532: indent_puts(
! 533: "register yyconst struct yy_trans_info *yy_trans_info;\n" );
! 534: indent_puts( "register YY_CHAR yy_c;\n" );
! 535: indent_put2s( "for ( yy_c = %s;", char_map );
! 536: indent_puts(
! 537: " (yy_trans_info = &yy_current_state[(unsigned int) yy_c])->" );
! 538: indent_puts( "yy_verify == yy_c;" );
! 539: indent_put2s( " yy_c = %s )", char_map_2 );
! 540:
! 541: indent_up();
! 542:
! 543: if ( num_backing_up > 0 )
! 544: indent_puts( "{" ); /* } for vi */
! 545:
! 546: indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" );
! 547:
! 548: if ( num_backing_up > 0 )
! 549: {
! 550: outc( '\n' );
! 551: gen_backing_up(); /* { for vi */
! 552: indent_puts( "}" );
! 553: }
! 554:
! 555: indent_down(); /* { for vi */
! 556: indent_puts( "}" );
! 557: }
! 558:
! 559: else
! 560: { /* compressed */
! 561: indent_puts( "do" );
! 562:
! 563: indent_up();
! 564: indent_puts( "{" ); /* } for vi */
! 565:
! 566: gen_next_state( false );
! 567:
! 568: indent_puts( "++yy_cp;" );
! 569:
! 570: /* { for vi */
! 571: indent_puts( "}" );
! 572: indent_down();
! 573:
! 574: do_indent();
! 575:
! 576: if ( interactive )
! 577: out_dec( "while ( yy_base[yy_current_state] != %d );\n",
! 578: jambase );
! 579: else
! 580: out_dec( "while ( yy_current_state != %d );\n",
! 581: jamstate );
! 582:
! 583: if ( ! reject && ! interactive )
! 584: {
! 585: /* Do the guaranteed-needed backing up to figure out
! 586: * the match.
! 587: */
! 588: indent_puts( "yy_cp = yy_last_accepting_cpos;" );
! 589: indent_puts(
! 590: "yy_current_state = yy_last_accepting_state;" );
! 591: }
! 592: }
! 593: }
! 594:
! 595:
! 596: /* Generate the code to find the next state. */
! 597:
! 598: void gen_next_state( worry_about_NULs )
! 599: int worry_about_NULs;
! 600: { /* NOTE - changes in here should be reflected in gen_next_match() */
! 601: char char_map[256];
! 602:
! 603: if ( worry_about_NULs && ! nultrans )
! 604: {
! 605: if ( useecs )
! 606: (void) sprintf( char_map,
! 607: "(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)",
! 608: NUL_ec );
! 609: else
! 610: (void) sprintf( char_map,
! 611: "(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)", NUL_ec );
! 612: }
! 613:
! 614: else
! 615: strcpy( char_map, useecs ?
! 616: "yy_ec[YY_SC_TO_UI(*yy_cp)]" : "YY_SC_TO_UI(*yy_cp)" );
! 617:
! 618: if ( worry_about_NULs && nultrans )
! 619: {
! 620: if ( ! fulltbl && ! fullspd )
! 621: /* Compressed tables back up *before* they match. */
! 622: gen_backing_up();
! 623:
! 624: indent_puts( "if ( *yy_cp )" );
! 625: indent_up();
! 626: indent_puts( "{" ); /* } for vi */
! 627: }
! 628:
! 629: if ( fulltbl )
! 630: indent_put2s(
! 631: "yy_current_state = yy_nxt[yy_current_state][%s];",
! 632: char_map );
! 633:
! 634: else if ( fullspd )
! 635: indent_put2s(
! 636: "yy_current_state += yy_current_state[%s].yy_nxt;",
! 637: char_map );
! 638:
! 639: else
! 640: gen_next_compressed_state( char_map );
! 641:
! 642: if ( worry_about_NULs && nultrans )
! 643: {
! 644: /* { for vi */
! 645: indent_puts( "}" );
! 646: indent_down();
! 647: indent_puts( "else" );
! 648: indent_up();
! 649: indent_puts(
! 650: "yy_current_state = yy_NUL_trans[yy_current_state];" );
! 651: indent_down();
! 652: }
! 653:
! 654: if ( fullspd || fulltbl )
! 655: gen_backing_up();
! 656:
! 657: if ( reject )
! 658: indent_puts( "*yy_state_ptr++ = yy_current_state;" );
! 659: }
! 660:
! 661:
! 662: /* Generate the code to make a NUL transition. */
! 663:
! 664: void gen_NUL_trans()
! 665: { /* NOTE - changes in here should be reflected in gen_next_match() */
! 666: /* Only generate a definition for "yy_cp" if we'll generate code
! 667: * that uses it. Otherwise lint and the like complain.
! 668: */
! 669: int need_backing_up = (num_backing_up > 0 && ! reject);
! 670:
! 671: if ( need_backing_up && (! nultrans || fullspd || fulltbl) )
! 672: /* We're going to need yy_cp lying around for the call
! 673: * below to gen_backing_up().
! 674: */
! 675: indent_puts( "register char *yy_cp = yy_c_buf_p;" );
! 676:
! 677: outc( '\n' );
! 678:
! 679: if ( nultrans )
! 680: {
! 681: indent_puts(
! 682: "yy_current_state = yy_NUL_trans[yy_current_state];" );
! 683: indent_puts( "yy_is_jam = (yy_current_state == 0);" );
! 684: }
! 685:
! 686: else if ( fulltbl )
! 687: {
! 688: do_indent();
! 689: out_dec( "yy_current_state = yy_nxt[yy_current_state][%d];\n",
! 690: NUL_ec );
! 691: indent_puts( "yy_is_jam = (yy_current_state <= 0);" );
! 692: }
! 693:
! 694: else if ( fullspd )
! 695: {
! 696: do_indent();
! 697: out_dec( "register int yy_c = %d;\n", NUL_ec );
! 698:
! 699: indent_puts(
! 700: "register yyconst struct yy_trans_info *yy_trans_info;\n" );
! 701: indent_puts(
! 702: "yy_trans_info = &yy_current_state[(unsigned int) yy_c];" );
! 703: indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" );
! 704:
! 705: indent_puts(
! 706: "yy_is_jam = (yy_trans_info->yy_verify != yy_c);" );
! 707: }
! 708:
! 709: else
! 710: {
! 711: char NUL_ec_str[20];
! 712:
! 713: (void) sprintf( NUL_ec_str, "%d", NUL_ec );
! 714: gen_next_compressed_state( NUL_ec_str );
! 715:
! 716: if ( reject )
! 717: indent_puts( "*yy_state_ptr++ = yy_current_state;" );
! 718:
! 719: do_indent();
! 720:
! 721: out_dec( "yy_is_jam = (yy_current_state == %d);\n", jamstate );
! 722: }
! 723:
! 724: /* If we've entered an accepting state, back up; note that
! 725: * compressed tables have *already* done such backing up, so
! 726: * we needn't bother with it again.
! 727: */
! 728: if ( need_backing_up && (fullspd || fulltbl) )
! 729: {
! 730: outc( '\n' );
! 731: indent_puts( "if ( ! yy_is_jam )" );
! 732: indent_up();
! 733: indent_puts( "{" );
! 734: gen_backing_up();
! 735: indent_puts( "}" );
! 736: indent_down();
! 737: }
! 738: }
! 739:
! 740:
! 741: /* Generate the code to find the start state. */
! 742:
! 743: void gen_start_state()
! 744: {
! 745: if ( fullspd )
! 746: {
! 747: if ( bol_needed )
! 748: {
! 749: indent_puts(
! 750: "yy_current_state = yy_start_state_list[yy_start + YY_AT_BOL()];" );
! 751: }
! 752: else
! 753: indent_puts(
! 754: "yy_current_state = yy_start_state_list[yy_start];" );
! 755: }
! 756:
! 757: else
! 758: {
! 759: indent_puts( "yy_current_state = yy_start;" );
! 760:
! 761: if ( bol_needed )
! 762: indent_puts( "yy_current_state += YY_AT_BOL();" );
! 763:
! 764: if ( reject )
! 765: {
! 766: /* Set up for storing up states. */
! 767: indent_puts( "yy_state_ptr = yy_state_buf;" );
! 768: indent_puts( "*yy_state_ptr++ = yy_current_state;" );
! 769: }
! 770: }
! 771: }
! 772:
! 773:
! 774: /* gentabs - generate data statements for the transition tables */
! 775:
! 776: void gentabs()
! 777: {
! 778: int i, j, k, *accset, nacc, *acc_array, total_states;
! 779: int end_of_buffer_action = num_rules + 1;
! 780:
! 781: acc_array = allocate_integer_array( current_max_dfas );
! 782: nummt = 0;
! 783:
! 784: /* The compressed table format jams by entering the "jam state",
! 785: * losing information about the previous state in the process.
! 786: * In order to recover the previous state, we effectively need
! 787: * to keep backing-up information.
! 788: */
! 789: ++num_backing_up;
! 790:
! 791: if ( reject )
! 792: {
! 793: /* Write out accepting list and pointer list.
! 794: *
! 795: * First we generate the "yy_acclist" array. In the process,
! 796: * we compute the indices that will go into the "yy_accept"
! 797: * array, and save the indices in the dfaacc array.
! 798: */
! 799: int EOB_accepting_list[2];
! 800:
! 801: /* Set up accepting structures for the End Of Buffer state. */
! 802: EOB_accepting_list[0] = 0;
! 803: EOB_accepting_list[1] = end_of_buffer_action;
! 804: accsiz[end_of_buffer_state] = 1;
! 805: dfaacc[end_of_buffer_state].dfaacc_set = EOB_accepting_list;
! 806:
! 807: out_str_dec( long_align ? C_long_decl : C_short_decl,
! 808: "yy_acclist", MAX( numas, 1 ) + 1 );
! 809:
! 810: j = 1; /* index into "yy_acclist" array */
! 811:
! 812: for ( i = 1; i <= lastdfa; ++i )
! 813: {
! 814: acc_array[i] = j;
! 815:
! 816: if ( accsiz[i] != 0 )
! 817: {
! 818: accset = dfaacc[i].dfaacc_set;
! 819: nacc = accsiz[i];
! 820:
! 821: if ( trace )
! 822: fprintf( stderr,
! 823: _( "state # %d accepts: " ),
! 824: i );
! 825:
! 826: for ( k = 1; k <= nacc; ++k )
! 827: {
! 828: int accnum = accset[k];
! 829:
! 830: ++j;
! 831:
! 832: if ( variable_trailing_context_rules &&
! 833: ! (accnum & YY_TRAILING_HEAD_MASK) &&
! 834: accnum > 0 && accnum <= num_rules &&
! 835: rule_type[accnum] == RULE_VARIABLE )
! 836: {
! 837: /* Special hack to flag
! 838: * accepting number as part
! 839: * of trailing context rule.
! 840: */
! 841: accnum |= YY_TRAILING_MASK;
! 842: }
! 843:
! 844: mkdata( accnum );
! 845:
! 846: if ( trace )
! 847: {
! 848: fprintf( stderr, "[%d]",
! 849: accset[k] );
! 850:
! 851: if ( k < nacc )
! 852: fputs( ", ", stderr );
! 853: else
! 854: putc( '\n', stderr );
! 855: }
! 856: }
! 857: }
! 858: }
! 859:
! 860: /* add accepting number for the "jam" state */
! 861: acc_array[i] = j;
! 862:
! 863: dataend();
! 864: }
! 865:
! 866: else
! 867: {
! 868: dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
! 869:
! 870: for ( i = 1; i <= lastdfa; ++i )
! 871: acc_array[i] = dfaacc[i].dfaacc_state;
! 872:
! 873: /* add accepting number for jam state */
! 874: acc_array[i] = 0;
! 875: }
! 876:
! 877: /* Spit out "yy_accept" array. If we're doing "reject", it'll be
! 878: * pointers into the "yy_acclist" array. Otherwise it's actual
! 879: * accepting numbers. In either case, we just dump the numbers.
! 880: */
! 881:
! 882: /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays
! 883: * beginning at 0 and for "jam" state.
! 884: */
! 885: k = lastdfa + 2;
! 886:
! 887: if ( reject )
! 888: /* We put a "cap" on the table associating lists of accepting
! 889: * numbers with state numbers. This is needed because we tell
! 890: * where the end of an accepting list is by looking at where
! 891: * the list for the next state starts.
! 892: */
! 893: ++k;
! 894:
! 895: out_str_dec( long_align ? C_long_decl : C_short_decl, "yy_accept", k );
! 896:
! 897: for ( i = 1; i <= lastdfa; ++i )
! 898: {
! 899: mkdata( acc_array[i] );
! 900:
! 901: if ( ! reject && trace && acc_array[i] )
! 902: fprintf( stderr, _( "state # %d accepts: [%d]\n" ),
! 903: i, acc_array[i] );
! 904: }
! 905:
! 906: /* Add entry for "jam" state. */
! 907: mkdata( acc_array[i] );
! 908:
! 909: if ( reject )
! 910: /* Add "cap" for the list. */
! 911: mkdata( acc_array[i] );
! 912:
! 913: dataend();
! 914:
! 915: if ( useecs )
! 916: genecs();
! 917:
! 918: if ( usemecs )
! 919: {
! 920: /* Write out meta-equivalence classes (used to index
! 921: * templates with).
! 922: */
! 923:
! 924: if ( trace )
! 925: fputs( _( "\n\nMeta-Equivalence Classes:\n" ),
! 926: stderr );
! 927:
! 928: out_str_dec( C_int_decl, "yy_meta", numecs + 1 );
! 929:
! 930: for ( i = 1; i <= numecs; ++i )
! 931: {
! 932: if ( trace )
! 933: fprintf( stderr, "%d = %d\n",
! 934: i, ABS( tecbck[i] ) );
! 935:
! 936: mkdata( ABS( tecbck[i] ) );
! 937: }
! 938:
! 939: dataend();
! 940: }
! 941:
! 942: total_states = lastdfa + numtemps;
! 943:
! 944: out_str_dec( (tblend >= MAX_SHORT || long_align) ?
! 945: C_long_decl : C_short_decl,
! 946: "yy_base", total_states + 1 );
! 947:
! 948: for ( i = 1; i <= lastdfa; ++i )
! 949: {
! 950: register int d = def[i];
! 951:
! 952: if ( base[i] == JAMSTATE )
! 953: base[i] = jambase;
! 954:
! 955: if ( d == JAMSTATE )
! 956: def[i] = jamstate;
! 957:
! 958: else if ( d < 0 )
! 959: {
! 960: /* Template reference. */
! 961: ++tmpuses;
! 962: def[i] = lastdfa - d + 1;
! 963: }
! 964:
! 965: mkdata( base[i] );
! 966: }
! 967:
! 968: /* Generate jam state's base index. */
! 969: mkdata( base[i] );
! 970:
! 971: for ( ++i /* skip jam state */; i <= total_states; ++i )
! 972: {
! 973: mkdata( base[i] );
! 974: def[i] = jamstate;
! 975: }
! 976:
! 977: dataend();
! 978:
! 979: out_str_dec( (total_states >= MAX_SHORT || long_align) ?
! 980: C_long_decl : C_short_decl,
! 981: "yy_def", total_states + 1 );
! 982:
! 983: for ( i = 1; i <= total_states; ++i )
! 984: mkdata( def[i] );
! 985:
! 986: dataend();
! 987:
! 988: out_str_dec( (total_states >= MAX_SHORT || long_align) ?
! 989: C_long_decl : C_short_decl,
! 990: "yy_nxt", tblend + 1 );
! 991:
! 992: for ( i = 1; i <= tblend; ++i )
! 993: {
! 994: /* Note, the order of the following test is important.
! 995: * If chk[i] is 0, then nxt[i] is undefined.
! 996: */
! 997: if ( chk[i] == 0 || nxt[i] == 0 )
! 998: nxt[i] = jamstate; /* new state is the JAM state */
! 999:
! 1000: mkdata( nxt[i] );
! 1001: }
! 1002:
! 1003: dataend();
! 1004:
! 1005: out_str_dec( (total_states >= MAX_SHORT || long_align) ?
! 1006: C_long_decl : C_short_decl,
! 1007: "yy_chk", tblend + 1 );
! 1008:
! 1009: for ( i = 1; i <= tblend; ++i )
! 1010: {
! 1011: if ( chk[i] == 0 )
! 1012: ++nummt;
! 1013:
! 1014: mkdata( chk[i] );
! 1015: }
! 1016:
! 1017: dataend();
! 1018: }
! 1019:
! 1020:
! 1021: /* Write out a formatted string (with a secondary string argument) at the
! 1022: * current indentation level, adding a final newline.
! 1023: */
! 1024:
! 1025: void indent_put2s( fmt, arg )
! 1026: char fmt[], arg[];
! 1027: {
! 1028: do_indent();
! 1029: out_str( fmt, arg );
! 1030: outn( "" );
! 1031: }
! 1032:
! 1033:
! 1034: /* Write out a string at the current indentation level, adding a final
! 1035: * newline.
! 1036: */
! 1037:
! 1038: void indent_puts( str )
! 1039: char str[];
! 1040: {
! 1041: do_indent();
! 1042: outn( str );
! 1043: }
! 1044:
! 1045:
! 1046: /* make_tables - generate transition tables and finishes generating output file
! 1047: */
! 1048:
! 1049: void make_tables()
! 1050: {
! 1051: register int i;
! 1052: int did_eof_rule = false;
! 1053:
! 1054: skelout();
! 1055:
! 1056: /* First, take care of YY_DO_BEFORE_ACTION depending on yymore
! 1057: * being used.
! 1058: */
! 1059: set_indent( 1 );
! 1060:
! 1061: if ( yymore_used )
! 1062: {
! 1063: indent_puts( "yytext_ptr -= yy_more_len; \\" );
! 1064: indent_puts( "yyleng = (int) (yy_cp - yytext_ptr); \\" );
! 1065: }
! 1066:
! 1067: else
! 1068: indent_puts( "yyleng = (int) (yy_cp - yy_bp); \\" );
! 1069:
! 1070: /* Now also deal with copying yytext_ptr to yytext if needed. */
! 1071: skelout();
! 1072: if ( yytext_is_array )
! 1073: {
! 1074: indent_puts( "if ( yyleng >= YYLMAX ) \\" );
! 1075: indent_up();
! 1076: indent_puts(
! 1077: "YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\" );
! 1078: indent_down();
! 1079: indent_puts(
! 1080: "yy_flex_strncpy( yytext, yytext_ptr, yyleng + 1 ); \\" );
! 1081: }
! 1082:
! 1083: set_indent( 0 );
! 1084:
! 1085: skelout();
! 1086:
! 1087:
! 1088: out_dec( "#define YY_NUM_RULES %d\n", num_rules );
! 1089: out_dec( "#define YY_END_OF_BUFFER %d\n", num_rules + 1 );
! 1090:
! 1091: if ( fullspd )
! 1092: {
! 1093: /* Need to define the transet type as a size large
! 1094: * enough to hold the biggest offset.
! 1095: */
! 1096: int total_table_size = tblend + numecs + 1;
! 1097: char *trans_offset_type =
! 1098: (total_table_size >= MAX_SHORT || long_align) ?
! 1099: "long" : "short";
! 1100:
! 1101: set_indent( 0 );
! 1102: indent_puts( "struct yy_trans_info" );
! 1103: indent_up();
! 1104: indent_puts( "{" ); /* } for vi */
! 1105:
! 1106: if ( long_align )
! 1107: indent_puts( "long yy_verify;" );
! 1108: else
! 1109: indent_puts( "short yy_verify;" );
! 1110:
! 1111: /* In cases where its sister yy_verify *is* a "yes, there is
! 1112: * a transition", yy_nxt is the offset (in records) to the
! 1113: * next state. In most cases where there is no transition,
! 1114: * the value of yy_nxt is irrelevant. If yy_nxt is the -1th
! 1115: * record of a state, though, then yy_nxt is the action number
! 1116: * for that state.
! 1117: */
! 1118:
! 1119: indent_put2s( "%s yy_nxt;", trans_offset_type );
! 1120: indent_puts( "};" );
! 1121: indent_down();
! 1122: }
! 1123:
! 1124: if ( fullspd )
! 1125: genctbl();
! 1126: else if ( fulltbl )
! 1127: genftbl();
! 1128: else
! 1129: gentabs();
! 1130:
! 1131: /* Definitions for backing up. We don't need them if REJECT
! 1132: * is being used because then we use an alternative backin-up
! 1133: * technique instead.
! 1134: */
! 1135: if ( num_backing_up > 0 && ! reject )
! 1136: {
! 1137: if ( ! C_plus_plus )
! 1138: {
! 1139: indent_puts(
! 1140: "static yy_state_type yy_last_accepting_state;" );
! 1141: indent_puts(
! 1142: "static char *yy_last_accepting_cpos;\n" );
! 1143: }
! 1144: }
! 1145:
! 1146: if ( nultrans )
! 1147: {
! 1148: out_str_dec( C_state_decl, "yy_NUL_trans", lastdfa + 1 );
! 1149:
! 1150: for ( i = 1; i <= lastdfa; ++i )
! 1151: {
! 1152: if ( fullspd )
! 1153: out_dec( " &yy_transition[%d],\n", base[i] );
! 1154: else
! 1155: mkdata( nultrans[i] );
! 1156: }
! 1157:
! 1158: dataend();
! 1159: }
! 1160:
! 1161: if ( ddebug )
! 1162: { /* Spit out table mapping rules to line numbers. */
! 1163: if ( ! C_plus_plus )
! 1164: {
! 1165: indent_puts( "extern int yy_flex_debug;" );
! 1166: indent_puts( "int yy_flex_debug = 1;\n" );
! 1167: }
! 1168:
! 1169: out_str_dec( long_align ? C_long_decl : C_short_decl,
! 1170: "yy_rule_linenum", num_rules );
! 1171: for ( i = 1; i < num_rules; ++i )
! 1172: mkdata( rule_linenum[i] );
! 1173: dataend();
! 1174: }
! 1175:
! 1176: if ( reject )
! 1177: {
! 1178: /* Declare state buffer variables. */
! 1179: if ( ! C_plus_plus )
! 1180: {
! 1181: outn(
! 1182: "static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;" );
! 1183: outn( "static char *yy_full_match;" );
! 1184: outn( "static int yy_lp;" );
! 1185: }
! 1186:
! 1187: if ( variable_trailing_context_rules )
! 1188: {
! 1189: if ( ! C_plus_plus )
! 1190: {
! 1191: outn(
! 1192: "static int yy_looking_for_trail_begin = 0;" );
! 1193: outn( "static int yy_full_lp;" );
! 1194: outn( "static int *yy_full_state;" );
! 1195: }
! 1196:
! 1197: out_hex( "#define YY_TRAILING_MASK 0x%x\n",
! 1198: (unsigned int) YY_TRAILING_MASK );
! 1199: out_hex( "#define YY_TRAILING_HEAD_MASK 0x%x\n",
! 1200: (unsigned int) YY_TRAILING_HEAD_MASK );
! 1201: }
! 1202:
! 1203: outn( "#define REJECT \\" );
! 1204: outn( "{ \\" ); /* } for vi */
! 1205: outn(
! 1206: "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \\" );
! 1207: outn(
! 1208: "yy_cp = yy_full_match; /* restore poss. backed-over text */ \\" );
! 1209:
! 1210: if ( variable_trailing_context_rules )
! 1211: {
! 1212: outn(
! 1213: "yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \\" );
! 1214: outn(
! 1215: "yy_state_ptr = yy_full_state; /* restore orig. state */ \\" );
! 1216: outn(
! 1217: "yy_current_state = *yy_state_ptr; /* restore curr. state */ \\" );
! 1218: }
! 1219:
! 1220: outn( "++yy_lp; \\" );
! 1221: outn( "goto find_rule; \\" );
! 1222: /* { for vi */
! 1223: outn( "}" );
! 1224: }
! 1225:
! 1226: else
! 1227: {
! 1228: outn(
! 1229: "/* The intent behind this definition is that it'll catch" );
! 1230: outn( " * any uses of REJECT which flex missed." );
! 1231: outn( " */" );
! 1232: outn( "#define REJECT reject_used_but_not_detected" );
! 1233: }
! 1234:
! 1235: if ( yymore_used )
! 1236: {
! 1237: if ( ! C_plus_plus )
! 1238: {
! 1239: indent_puts( "static int yy_more_flag = 0;" );
! 1240: indent_puts( "static int yy_more_len = 0;" );
! 1241: }
! 1242:
! 1243: indent_puts( "#define yymore() (yy_more_flag = 1)" );
! 1244: indent_puts( "#define YY_MORE_ADJ yy_more_len" );
! 1245: }
! 1246:
! 1247: else
! 1248: {
! 1249: indent_puts( "#define yymore() yymore_used_but_not_detected" );
! 1250: indent_puts( "#define YY_MORE_ADJ 0" );
! 1251: }
! 1252:
! 1253: if ( ! C_plus_plus )
! 1254: {
! 1255: if ( yytext_is_array )
! 1256: {
! 1257: outn( "#ifndef YYLMAX" );
! 1258: outn( "#define YYLMAX 8192" );
! 1259: outn( "#endif\n" );
! 1260: outn( "char yytext[YYLMAX];" );
! 1261: outn( "char *yytext_ptr;" );
! 1262: }
! 1263:
! 1264: else
! 1265: outn( "char *yytext;" );
! 1266: }
! 1267:
! 1268: out( &action_array[defs1_offset] );
! 1269:
! 1270: line_directive_out( stdout, 0 );
! 1271:
! 1272: skelout();
! 1273:
! 1274: if ( ! C_plus_plus )
! 1275: {
! 1276: if ( use_read )
! 1277: {
! 1278: outn(
! 1279: "\tif ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \\" );
! 1280: outn(
! 1281: "\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" );" );
! 1282: }
! 1283:
! 1284: else
! 1285: {
! 1286: outn(
! 1287: "\tif ( yy_current_buffer->yy_is_interactive ) \\" );
! 1288: outn( "\t\t{ \\" );
! 1289: outn( "\t\tint c = '*', n; \\" );
! 1290: outn( "\t\tfor ( n = 0; n < max_size && \\" );
! 1291: outn( "\t\t\t (c = getc( yyin )) != EOF && c != '\\n'; ++n ) \\" );
! 1292: outn( "\t\t\tbuf[n] = (char) c; \\" );
! 1293: outn( "\t\tif ( c == '\\n' ) \\" );
! 1294: outn( "\t\t\tbuf[n++] = (char) c; \\" );
! 1295: outn( "\t\tif ( c == EOF && ferror( yyin ) ) \\" );
! 1296: outn(
! 1297: "\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\" );
! 1298: outn( "\t\tresult = n; \\" );
! 1299: outn( "\t\t} \\" );
! 1300: outn(
! 1301: "\telse if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \\" );
! 1302: outn( "\t\t && ferror( yyin ) ) \\" );
! 1303: outn(
! 1304: "\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" );" );
! 1305: }
! 1306: }
! 1307:
! 1308: skelout();
! 1309:
! 1310: indent_puts( "#define YY_RULE_SETUP \\" );
! 1311: indent_up();
! 1312: if ( bol_needed )
! 1313: {
! 1314: indent_puts( "if ( yyleng > 0 ) \\" );
! 1315: indent_up();
! 1316: indent_puts( "yy_current_buffer->yy_at_bol = \\" );
! 1317: indent_puts( "\t\t(yytext[yyleng - 1] == '\\n'); \\" );
! 1318: indent_down();
! 1319: }
! 1320: indent_puts( "YY_USER_ACTION" );
! 1321: indent_down();
! 1322:
! 1323: skelout();
! 1324:
! 1325: /* Copy prolog to output file. */
! 1326: out( &action_array[prolog_offset] );
! 1327:
! 1328: line_directive_out( stdout, 0 );
! 1329:
! 1330: skelout();
! 1331:
! 1332: set_indent( 2 );
! 1333:
! 1334: if ( yymore_used )
! 1335: {
! 1336: indent_puts( "yy_more_len = 0;" );
! 1337: indent_puts( "if ( yy_more_flag )" );
! 1338: indent_up();
! 1339: indent_puts( "{" );
! 1340: indent_puts( "yy_more_len = yyleng;" );
! 1341: indent_puts( "yy_more_flag = 0;" );
! 1342: indent_puts( "}" );
! 1343: indent_down();
! 1344: }
! 1345:
! 1346: skelout();
! 1347:
! 1348: gen_start_state();
! 1349:
! 1350: /* Note, don't use any indentation. */
! 1351: outn( "yy_match:" );
! 1352: gen_next_match();
! 1353:
! 1354: skelout();
! 1355: set_indent( 2 );
! 1356: gen_find_action();
! 1357:
! 1358: skelout();
! 1359: if ( do_yylineno )
! 1360: {
! 1361: indent_puts( "if ( yy_act != YY_END_OF_BUFFER )" );
! 1362: indent_up();
! 1363: indent_puts( "{" );
! 1364: indent_puts( "int yyl;" );
! 1365: indent_puts( "for ( yyl = 0; yyl < yyleng; ++yyl )" );
! 1366: indent_up();
! 1367: indent_puts( "if ( yytext[yyl] == '\\n' )" );
! 1368: indent_up();
! 1369: indent_puts( "++yylineno;" );
! 1370: indent_down();
! 1371: indent_down();
! 1372: indent_puts( "}" );
! 1373: indent_down();
! 1374: }
! 1375:
! 1376: skelout();
! 1377: if ( ddebug )
! 1378: {
! 1379: indent_puts( "if ( yy_flex_debug )" );
! 1380: indent_up();
! 1381:
! 1382: indent_puts( "{" );
! 1383: indent_puts( "if ( yy_act == 0 )" );
! 1384: indent_up();
! 1385: indent_puts( C_plus_plus ?
! 1386: "cerr << \"--scanner backing up\\n\";" :
! 1387: "fprintf( stderr, \"--scanner backing up\\n\" );" );
! 1388: indent_down();
! 1389:
! 1390: do_indent();
! 1391: out_dec( "else if ( yy_act < %d )\n", num_rules );
! 1392: indent_up();
! 1393:
! 1394: if ( C_plus_plus )
! 1395: {
! 1396: indent_puts(
! 1397: "cerr << \"--accepting rule at line \" << yy_rule_linenum[yy_act] <<" );
! 1398: indent_puts(
! 1399: " \"(\\\"\" << yytext << \"\\\")\\n\";" );
! 1400: }
! 1401: else
! 1402: {
! 1403: indent_puts(
! 1404: "fprintf( stderr, \"--accepting rule at line %d (\\\"%s\\\")\\n\"," );
! 1405:
! 1406: indent_puts(
! 1407: " yy_rule_linenum[yy_act], yytext );" );
! 1408: }
! 1409:
! 1410: indent_down();
! 1411:
! 1412: do_indent();
! 1413: out_dec( "else if ( yy_act == %d )\n", num_rules );
! 1414: indent_up();
! 1415:
! 1416: if ( C_plus_plus )
! 1417: {
! 1418: indent_puts(
! 1419: "cerr << \"--accepting default rule (\\\"\" << yytext << \"\\\")\\n\";" );
! 1420: }
! 1421: else
! 1422: {
! 1423: indent_puts(
! 1424: "fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\"," );
! 1425: indent_puts( " yytext );" );
! 1426: }
! 1427:
! 1428: indent_down();
! 1429:
! 1430: do_indent();
! 1431: out_dec( "else if ( yy_act == %d )\n", num_rules + 1 );
! 1432: indent_up();
! 1433:
! 1434: indent_puts( C_plus_plus ?
! 1435: "cerr << \"--(end of buffer or a NUL)\\n\";" :
! 1436: "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );" );
! 1437:
! 1438: indent_down();
! 1439:
! 1440: do_indent();
! 1441: outn( "else" );
! 1442: indent_up();
! 1443:
! 1444: if ( C_plus_plus )
! 1445: {
! 1446: indent_puts(
! 1447: "cerr << \"--EOF (start condition \" << YY_START << \")\\n\";" );
! 1448: }
! 1449: else
! 1450: {
! 1451: indent_puts(
! 1452: "fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );" );
! 1453: }
! 1454:
! 1455: indent_down();
! 1456:
! 1457: indent_puts( "}" );
! 1458: indent_down();
! 1459: }
! 1460:
! 1461: /* Copy actions to output file. */
! 1462: skelout();
! 1463: indent_up();
! 1464: gen_bu_action();
! 1465: out( &action_array[action_offset] );
! 1466:
! 1467: line_directive_out( stdout, 0 );
! 1468:
! 1469: /* generate cases for any missing EOF rules */
! 1470: for ( i = 1; i <= lastsc; ++i )
! 1471: if ( ! sceof[i] )
! 1472: {
! 1473: do_indent();
! 1474: out_str( "case YY_STATE_EOF(%s):\n", scname[i] );
! 1475: did_eof_rule = true;
! 1476: }
! 1477:
! 1478: if ( did_eof_rule )
! 1479: {
! 1480: indent_up();
! 1481: indent_puts( "yyterminate();" );
! 1482: indent_down();
! 1483: }
! 1484:
! 1485:
! 1486: /* Generate code for handling NUL's, if needed. */
! 1487:
! 1488: /* First, deal with backing up and setting up yy_cp if the scanner
! 1489: * finds that it should JAM on the NUL.
! 1490: */
! 1491: skelout();
! 1492: set_indent( 4 );
! 1493:
! 1494: if ( fullspd || fulltbl )
! 1495: indent_puts( "yy_cp = yy_c_buf_p;" );
! 1496:
! 1497: else
! 1498: { /* compressed table */
! 1499: if ( ! reject && ! interactive )
! 1500: {
! 1501: /* Do the guaranteed-needed backing up to figure
! 1502: * out the match.
! 1503: */
! 1504: indent_puts( "yy_cp = yy_last_accepting_cpos;" );
! 1505: indent_puts(
! 1506: "yy_current_state = yy_last_accepting_state;" );
! 1507: }
! 1508:
! 1509: else
! 1510: /* Still need to initialize yy_cp, though
! 1511: * yy_current_state was set up by
! 1512: * yy_get_previous_state().
! 1513: */
! 1514: indent_puts( "yy_cp = yy_c_buf_p;" );
! 1515: }
! 1516:
! 1517:
! 1518: /* Generate code for yy_get_previous_state(). */
! 1519: set_indent( 1 );
! 1520: skelout();
! 1521:
! 1522: gen_start_state();
! 1523:
! 1524: set_indent( 2 );
! 1525: skelout();
! 1526: gen_next_state( true );
! 1527:
! 1528: set_indent( 1 );
! 1529: skelout();
! 1530: gen_NUL_trans();
! 1531:
! 1532: skelout();
! 1533: if ( do_yylineno )
! 1534: { /* update yylineno inside of unput() */
! 1535: indent_puts( "if ( c == '\\n' )" );
! 1536: indent_up();
! 1537: indent_puts( "--yylineno;" );
! 1538: indent_down();
! 1539: }
! 1540:
! 1541: skelout();
! 1542: /* Update BOL and yylineno inside of input(). */
! 1543: if ( bol_needed )
! 1544: {
! 1545: indent_puts( "yy_current_buffer->yy_at_bol = (c == '\\n');" );
! 1546: if ( do_yylineno )
! 1547: {
! 1548: indent_puts( "if ( yy_current_buffer->yy_at_bol )" );
! 1549: indent_up();
! 1550: indent_puts( "++yylineno;" );
! 1551: indent_down();
! 1552: }
! 1553: }
! 1554:
! 1555: else if ( do_yylineno )
! 1556: {
! 1557: indent_puts( "if ( c == '\\n' )" );
! 1558: indent_up();
! 1559: indent_puts( "++yylineno;" );
! 1560: indent_down();
! 1561: }
! 1562:
! 1563: skelout();
! 1564:
! 1565: /* Copy remainder of input to output. */
! 1566:
! 1567: line_directive_out( stdout, 1 );
! 1568:
! 1569: if ( sectnum == 3 )
! 1570: (void) flexscan(); /* copy remainder of input to output */
! 1571: }