[BACK]Return to gen.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / lex

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:        }