Annotation of coherent/b/bin/yacc/y2.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * LALR-1 parser generator
                      3:  *     read in rules
                      4:  *       - read in definitions
                      5:  *       - gobble rules
                      6:  *       - copy anything complicated to the output
                      7:  */
                      8: 
                      9: #include <string.h>
                     10: #include "yacc.h"
                     11: #include "action.h"
                     12: 
                     13: static int phonysemi;  /* allow missing ; aftter } */
                     14: struct sym *defsym(), *elook();
                     15: YYSTYPE yylval;
                     16: struct
                     17: {
                     18:        int     lex;
                     19:        YYSTYPE val;
                     20: } last = {-1};
                     21: 
                     22: readrules()
                     23: {
                     24:        struct sym *saccept, *seof, *serror;
                     25:        int t, t1, t2, nt, asc, pred, tokno, toktyp, c;
                     26:        struct sym *sp;
                     27: 
                     28: 
                     29: #if DGC
                     30:        printf("Read rules\n");
                     31: #endif
                     32:        saccept = defsym("$accept", TNTERM);
                     33:        seof = defsym("$end", TTERM);
                     34:        serror = defsym("error", TTERM);
                     35:        seof->s_val = YYEOFVAL;
                     36:        serror->s_val = YYERRVAL;
                     37: 
                     38:        /* part 1 - read in rules */
                     39:        while( (t = yylex()) != MARK ) {
                     40: #if DGC
                     41:                printf("t = %d\n", t);
                     42: #endif
                     43:                switch( t ) {
                     44: 
                     45:                case EOF:
                     46:                        yyerror(FATAL, "end of file in definition section\n");
                     47:                        break; /* stupid C switch statement */
                     48: 
                     49:                case START:
                     50:                        if( yylex() != IDENT )
                     51:                                yyerror(!FATAL, "bad %start syntax");
                     52:                        else {
                     53:                                defsym(yylval.sptr->s_name,TNTERM);
                     54:                                startsym = yylval.sptr->s_no;
                     55:                        }
                     56:                        break;
                     57: 
                     58:                case UNION:
                     59:                        copyunion();
                     60:                        break;
                     61: 
                     62:                case TOKEN:
                     63:                case LEFT:
                     64:                case RIGHT:
                     65:                case NONASSOC:
                     66:                        asc = t-TOKEN;
                     67:                        if( t!=TOKEN )
                     68:                                pred = predlev++;
                     69:                        else
                     70:                                pred = UNKNOWN;
                     71: 
                     72:                case TYPE:
                     73:                        toktyp = UINT;
                     74:                        while( (t1 = yylex()) == IDENT || t1 == T_IDENT ) {
                     75:                                if( t1==T_IDENT ) {
                     76:                                        toktyp = yylval.sptr->s_no;
                     77:                                        continue;
                     78:                                }
                     79:                                sp = yylval.sptr;
                     80:                                if( (t2 = yylex()) == INTEGER )
                     81:                                        if( t==TYPE )           /*MWC DSC*/
                     82:                                                yyerror(!FATAL, "token value assignment not allowed for %type");
                     83:                                        else
                     84:                                                tokno = yylval.ival;
                     85:                                else {
                     86:                                        backup(t2);
                     87:                                        if( sp->s_name[0]!='\'' )
                     88:                                                tokno = tno++;
                     89:                                        else
                     90:                                                tokno = UNKNOWN;
                     91:                                }
                     92:                                if( t==TYPE && toktyp==UINT )
                     93:                                        yyerror(!FATAL,"Type id needed for %%type");
                     94:                                switch( t ) {
                     95:                                case TOKEN:
                     96:                                case LEFT:
                     97:                                case RIGHT:
                     98:                                case NONASSOC: /* C needs ranges on case */
                     99: 
                    100:                                        deftok(sp, toktyp, asc, pred, tokno);
                    101:                                        break;
                    102: 
                    103:                                case TYPE:
                    104:                                        defnttyp(sp, toktyp);
                    105:                                        break;
                    106:                                }
                    107:                                if( (t2 = yylex()) != COMMA ) backup(t2);
                    108:                        }
                    109:                        backup(t1);
                    110:                        break;
                    111:                default:
                    112:                        yyerror(FATAL, "unexpected symbol in definition section",
                    113:                                t);
                    114:                }
                    115:        }
                    116: 
                    117:        wrtdefs();
                    118:        wrthdr();
                    119: 
                    120:        /* part 2 - read in rules */
                    121:        prdptr [0] = (struct prod *) yalloc (1, PROD_TOTAL_SIZE (3));
                    122:        PROD_EXTRA_INIT (prdptr [0]);
                    123: 
                    124:        prdptr [0]->p_prodno = 0;
                    125:        prdptr [0]->p_prc = prdptr [0]->p_ass = UNKNOWN;
                    126:        prdptr [0]->p_left = -saccept->s_no;
                    127:        PROD_RIGHT (prdptr [0]) [0] = startsym;
                    128:        PROD_RIGHT (prdptr [0]) [1] = seof->s_no;
                    129:        PROD_RIGHT (prdptr [0]) [2] = -1;
                    130: 
                    131:        nprod = 1;
                    132:        while ((phonysemi || ((t = yylex())) == C_IDENT)) {
                    133:                phonysemi = 0;
                    134:                defsym(yylval.sptr->s_name, TNTERM);
                    135:                nt = yylval.sptr->s_no;
                    136:                while( getrule(nt) );
                    137:        }
                    138:        if( t==MARK ) { /* gobble up rest of file */
                    139:                linepos(tabout);
                    140:                while( (c = llgetc()) != EOF )
                    141:                        putc(c, tabout);
                    142:        } else if( t!=EOF )
                    143:                yyerror(FATAL, "bad rule syntax");
                    144:        wrtnames();
                    145:        fclose(defin);
                    146:        fclose(actout);
                    147: }
                    148: 
                    149: /*
                    150:  * lexical input reader
                    151:  *  - copy comments and percent curlies to the output w/o change
                    152:  *  - lookup the list of reserved keywords
                    153:  *  - enter identifiers and character constants in the symbol table
                    154:  *      character constants are special because they start with a apostrophe
                    155:  *      as do internally generated non terminals
                    156:  *  - the "value" of the token read is left in the global variable yylval
                    157:  *    this is either a symbol table pointer or an integer (for NUMBER)
                    158:  */
                    159: yylex()
                    160: {
                    161:        int c, i, lesk;
                    162:        char s[SYMSIZE];
                    163: 
                    164:        if( last.lex != -1 ) {
                    165:                yylval = last.val;
                    166:                lesk = last.lex;
                    167:                last.lex = -1;
                    168:                return( lesk );
                    169:        }
                    170:        last.lex = -1;
                    171: 
                    172: read:
                    173:        while( whitespace( c = llgetc() ) ) ;
                    174:        switch( c ) {
                    175:        case '|':
                    176:                return( VBAR );
                    177: 
                    178:        case ';':
                    179:                return( SEMICOLON );
                    180: 
                    181: 
                    182:        case '/':
                    183:                if( (c = llgetc()) != '*' )
                    184:                        goto error;
                    185:                copycomment("*/", NULL, 0); /* write to the rathole */
                    186:                goto read;
                    187: 
                    188:        case '<':
                    189:                gettype(s);
                    190:                yylval.sptr = defsym(s, TTYPE);
                    191:                return( T_IDENT );
                    192: 
                    193:        case '{':
                    194:                return( LBRAC );
                    195: 
                    196:        case ',':
                    197:                return( COMMA );
                    198: 
                    199:        case '%':
                    200:                if( (c = llgetc()) == '{' ) {
                    201:                        linepos(tabout);
                    202:                        copycomment("%}", tabout, 0);
                    203:                        goto read;
                    204:                } else if( c=='%' )
                    205:                        return( MARK );
                    206:                llungetc(c);
                    207:                getword(s);
                    208:                for( i=0; restab[i].r_name ; i++ )
                    209:                        if( strcmp(s, restab[i].r_name)==0 )
                    210:                                return( restab[i].r_val );
                    211:                yyerror(!FATAL|SKIP, "illegal \"%%keyword\"");
                    212:                goto read;
                    213: 
                    214:        case '\'':
                    215:                c = readchar();
                    216:                if( llgetc() != '\'' ) {
                    217:                        yyerror(!FATAL|SKIP, "bad character constant\n");
                    218:                        goto read;
                    219:                }
                    220:                sprintf(s, "%s", prsym(c));
                    221:                yylval.sptr = defsym(s, TTERM);
                    222:                yylval.sptr->s_val = c;
                    223:                return( IDENT );
                    224: 
                    225:        case EOF:
                    226:                return(EOF);
                    227:        default:
                    228:                if( digit(c) ) {
                    229:                        yylval.ival = readnum(c);
                    230:                        return( INTEGER );
                    231:                } else if( alpha(c) ) {
                    232:                        llungetc(c);
                    233:                        getword(s);
                    234:                        yylval.sptr = defsym(s, UNKNOWN);
                    235:                        while( whitespace(c = llgetc()) );
                    236:                        if( c==':' )
                    237:                                return( C_IDENT );
                    238:                        llungetc(c);
                    239:                        return(IDENT);
                    240:                } else {
                    241:                error:
                    242:                        yyerror(!FATAL|SKIP, "illegal character %c", c);
                    243:                        goto read;
                    244:                }
                    245:        }
                    246: }
                    247: 
                    248: /* read a production (the bi's for a <- b0 .. bn ) until a ';' or '|' */
                    249: 
                    250: getrule(nt)
                    251: int nt;
                    252: {
                    253:        int precused, n, actpres, t;
                    254:        char s[SYMSIZE];
                    255:        register struct prod *pp;
                    256:        register struct sym *sp;
                    257: #ifdef IAPX86  /* workaround cc1 'too many stores' bug */
                    258:        char *tmp;
                    259: #endif
                    260: 
                    261:        nitprod->p_left = -nt;
                    262:        nitprod->p_prc = nitprod->p_ass = UNKNOWN;
                    263:        actpres = n = precused = 0;
                    264:        t = yylex();
                    265:        while( t==PREC || t==IDENT || t==LBRAC ) {
                    266:                switch( t ) {
                    267:                case PREC:
                    268:                        t = yylex();
                    269:                        sp = yylval.sptr;
                    270:                        if( sp->s_genre!=TTERM || sp->s_prc<0 )
                    271:                                yyerror(!FATAL,"bad %prec construct");
                    272:                        else {
                    273:                                nitprod->p_prc = sp->s_prc;
                    274:                                nitprod->p_ass = sp->s_ass;
                    275:                                precused++;
                    276:                        }
                    277:                        break;
                    278: 
                    279:                case IDENT:
                    280:                        sp = yylval.sptr;
                    281:                        if( sp->s_genre == UNKNOWN )
                    282:                                defsym(sp->s_name, TNTERM);
                    283:                        if( sp->s_genre==TTERM && sp->s_ass>UNASSOC &&
                    284:                            !precused ) {
                    285:                                nitprod->p_ass = sp->s_ass;
                    286:                                nitprod->p_prc = sp->s_prc;
                    287:                        }
                    288:                        if( n >= maxprodl-1 )
                    289:                                yyerror(FATAL, "production too long");
                    290:                        PROD_RIGHT (nitprod) [n++] = sp->s_no;
                    291:                        break;
                    292: 
                    293:                case LBRAC:
                    294:                        cpyact(n, ntrmptr[nt-NTBASE]);
                    295:                        if( (t = yylex()) == IDENT ) { /* action inside rule */
                    296:                                pp = (struct prod *) 
                    297:                                        yalloc (1, PROD_TOTAL_SIZE (1));
                    298:                                PROD_EXTRA_INIT (pp);
                    299: 
                    300:                                sprintf(s, "$$%d", nprod);
                    301:                                sp = defsym(s, TNTERM);
                    302:                                pp->p_prodno = nprod;
                    303:                                pp->p_prc = pp->p_ass = UNKNOWN;
                    304:                                pp->p_left = -sp->s_no;
                    305:                                PROD_RIGHT (pp) [0] = -1;
                    306:                                bounded(nprod, maxprod, "productions");
                    307:                                prdptr[nprod++] = pp;
                    308:                                PROD_RIGHT (nitprod) [n++] = sp->s_no;
                    309:                        } else
                    310:                                actpres++;
                    311:                        continue;
                    312:                }
                    313:                t = yylex();
                    314:        }
                    315:        if( !actpres && ntrmptr[nt-NTBASE]->s_type>=0 ) {
                    316:                if( n==0 )
                    317:                        yyerror(!FATAL, "must return value since lhs has type\n");
                    318: #ifndef IAPX86          /* work around 'too many stores bug'. */
                    319:                else
                    320:                        if (elook(PROD_RIGHT (nitprod) [0])->s_type !=
                    321:                            ntrmptr[nt-NTBASE]->s_type )
                    322:                                yyerror(WARNING, "default action may cause type clash");
                    323: #else
                    324:                else {
                    325:                        tmp = elook(PROD_RIGHT (nitprod) [0]);
                    326:                        if (tmp->s_type != ntrmptr[nt-NTBASE]->s_type )
                    327:                                yyerror(WARNING, "default action may cause type clash");
                    328:                }
                    329: #endif         /* cc bug workaround */
                    330:        }
                    331:        if (t == C_IDENT) {
                    332:                phonysemi = 1;
                    333:                t = SEMICOLON;
                    334:        }
                    335:        if (t!=VBAR && t!=SEMICOLON )
                    336:                yyerror(FATAL, "rule terminator not ';' or '|'");
                    337:        bounded(nprod, maxprod, "productions");
                    338:        nitprod->p_prodno = nprod;
                    339:        PROD_RIGHT (nitprod) [n++] = -1;
                    340: 
                    341:        prdptr [nprod] = (struct prod *) yalloc (1, PROD_TOTAL_SIZE (n));
                    342:        * prdptr [nprod] = * nitprod;
                    343:        PROD_EXTRA_INIT (prdptr [nprod]);
                    344: 
                    345:        if (PROD_EXTRA_SIZE (n) > 0)
                    346:                memcpy (prdptr [nprod]->p_ord, nitprod->p_ord,
                    347:                        PROD_EXTRA_SIZE (n));
                    348: 
                    349:        nprod ++;
                    350:        return t == VBAR;
                    351: }
                    352: 
                    353: struct sym *
                    354: defsym(s, typ)
                    355: char *s;
                    356: {
                    357:        register struct sym *sp;
                    358:        register struct genre *gp;                      /* MWC DSC */
                    359:        register i;
                    360:        int start;
                    361: 
                    362:        i = start = hash(s);
                    363:        while( (sp = symtab[i])!=NULL && strcmp(s, sp->s_name) )
                    364:                if( (i = (i+1) % maxsym ) == start )            /* MWC DSC */
                    365:                        yyerror(FATAL, "symbol table overflow");
                    366: 
                    367:        if( sp==NULL ) {
                    368: #if DEBUG
                    369:                printf("defsym: %s new\n", s);
                    370: #endif
                    371:                sp = symtab[i] = (struct sym *)yalloc(1, sizeof *sp);
                    372: #ifdef DAVELIB
                    373:                sprintf(sp->s_name, "%.?s", SYMSIZE-1, s);
                    374: #else
                    375:                sprintf(sp->s_name, "%.*s", SYMSIZE-1, s);
                    376: #endif
                    377:                sp->s_no = -1;
                    378:                sp->s_prc = sp->s_ass = UNKNOWN;
                    379:                sp->s_type = UINT;
                    380:                sp->s_genre = UNKNOWN;
                    381:        }
                    382:        if( typ!=UNKNOWN && sp->s_genre!=typ ) {
                    383:                if( sp->s_genre!=UNKNOWN )
                    384:                        yyerror(FATAL, "internal error - type redefinition");
                    385:                sp->s_genre = typ;
                    386:                if( (sp->s_no = gtab[typ].g_ordno++) >= gtab[typ].g_maxord )
                    387:                        yyerror(FATAL, "too many %s, actual limit %d",
                    388:                                gtab[typ].g_name, gtab[typ].g_maxord);
                    389:                gp = &gtab[typ];
                    390:                (*gp->g_sptr) [ sp->s_no ] = sp;
                    391:                sp->s_no += gp->g_base;
                    392: #if DEBUG
                    393:                printf("defsym: %s %d %d\n", s, typ, sp->s_no);
                    394: #endif
                    395:        }
                    396:        return(sp);
                    397: }
                    398: 
                    399: int hash(s)            /* Could have more scatter on 32-bit int machine */
                    400: register char *s;
                    401: {
                    402:        register unsigned sum;
                    403:        if( (sum = *s) == '\0' )
                    404:                return(0);
                    405:        do {
                    406:                sum += s[0] | s[1]<<8;
                    407:                s += 2;
                    408:        } while( s[-1]!='\0' && s[0]!='\0' );
                    409:        return( sum % maxsym );         /* MWC DSC */
                    410: }
                    411: 
                    412: gettype(s)
                    413: char *s;
                    414: {
                    415:        register c;
                    416: 
                    417:        while( whit2space( c = llgetc() ) )
                    418:                ; /* just for howard */
                    419:        llungetc(c);
                    420:        getword(s);
                    421:        if( llgetc()!='>' ) yyerror(!FATAL|SKIP, "missing '>' in type ref");
                    422: }
                    423: 
                    424: deftok(sp, typ, asc, pred, tokno)
                    425: struct sym *sp;
                    426: int typ, asc, pred, tokno;
                    427: {
                    428:        if( yydebug )
                    429:                fprintf(listout, "deftok(%s) = type %d, ass %d, pred %d, # %d\n",
                    430:                sp->s_name, typ, asc, pred, tokno);
                    431:        if( typ!=UNKNOWN ) sp->s_type = typ;
                    432:        if( asc!=UNKNOWN ) sp->s_ass = asc;
                    433:        if( pred!=UNKNOWN ) sp->s_prc = pred;
                    434:        if( tokno!=UNKNOWN ) sp->s_val = tokno;
                    435:        defsym(sp->s_name, TTERM);
                    436: }
                    437: 
                    438: wrtdefs()
                    439: {
                    440:        register i;
                    441:        register struct sym *sp;
                    442: 
                    443:        for(i=0; i<nterm; i++)  {
                    444:                sp = trmptr[i];
                    445:                if( alpha(sp->s_name[0]) && strcmp(sp->s_name, "error") )
                    446:                        fprintf(fhdr, "#define %s %d\n", sp->s_name,
                    447:                            sp->s_val);
                    448:        }
                    449:        if (ntype==0)
                    450:                fprintf(fhdr, "typedef  int     YYSTYPE;\n");
                    451:        fprintf(fhdr, "#ifdef YYTNAMES\n");
                    452:        fprintf(fhdr, "extern struct yytname\n{\n");
                    453:        fprintf(fhdr, "\tchar\t*tn_name;\n\tint\ttn_val;\n} yytnames[];\n");
                    454:        fprintf(fhdr, "#endif\n");
                    455:        fprintf(fhdr, "extern   YYSTYPE yylval;\n");
                    456:        fclose(fhdr);
                    457: }
                    458: 
                    459: wrthdr()
                    460: {
                    461:        fprintf(tabout, "\n#include \"%s\"\n", ytabh);
                    462:        fprintf(tabout, "#define YYCLEARIN yychar = -1000\n");
                    463:        fprintf(tabout, "#define YYERROK yyerrflag = 0\n");
                    464:        fprintf(tabout, "extern int yychar;\n");
                    465:        fprintf(tabout, "extern short yyerrflag;\n");
                    466:        fprintf(tabout,"#ifndef YYMAXDEPTH\n#define YYMAXDEPTH 150\n");
                    467:        fprintf(tabout,"#endif\n");
                    468:        fprintf(tabout, "YYSTYPE yyval, yylval;\n");
                    469: }
                    470: 
                    471: wrtnames()
                    472: {
                    473:        register i;
                    474:        register char *sp;
                    475: 
                    476:        fprintf(tabout, "#ifdef YYTNAMES\n");
                    477:        fprintf(tabout, "struct yytname yytnames[%d] =\n{\n", nterm+1);
                    478:        for(i=0; i<nterm; i++) {
                    479:                fprintf(tabout, "\t\"");
                    480:                sp = trmptr[i]->s_name;
                    481:                while( *sp ) {
                    482:                        if( *sp=='\\' || *sp=='"' )
                    483:                                putc('\\', tabout);
                    484:                        putc(*sp, tabout);
                    485:                        sp++;
                    486:                }
                    487:                fprintf(tabout, "\", %d, \n", trmptr[i]->s_val);
                    488:        }
                    489:        fprintf(tabout, "\tNULL\n} ;\n");
                    490:        fprintf(tabout, "#endif\n");
                    491: }
                    492: 
                    493: defnttyp(sp, typ)
                    494: struct sym *sp;
                    495: {
                    496:        sp->s_type = typ;
                    497: }
                    498: 
                    499: cpyact(nel, ntp)
                    500: struct sym *ntp;
                    501: {
                    502:        register c, istyp, n;
                    503:        int accolade, sign, c1;
                    504:        char s[SYMSIZE];
                    505:        struct sym *sp;
                    506: 
                    507:        accolade = 1;
                    508:        fprintf(actout, "\ncase %d: {\n", nprod);
                    509:        linepos(actout);
                    510: 
                    511:        do {
                    512:                c = llgetc();
                    513:                switch( c ) {
                    514:                case EOF:
                    515:                        yyerror(FATAL, "end of file in action");
                    516:                        break;
                    517: 
                    518:                case '{':
                    519:                        accolade++;
                    520:                        break;
                    521: 
                    522:                case '}':
                    523:                        accolade--;
                    524:                        break;
                    525: 
                    526:                case '/':
                    527:                        if( (c1 = llgetc()) == '*' ) {
                    528:                                fprintf(actout, "/*");
                    529:                                copycomment("*/", actout, 0);
                    530:                                fprintf(actout, "*/");
                    531:                                continue;
                    532:                        }
                    533:                        llungetc(c1);
                    534:                        break;
                    535: 
                    536:                case '"':
                    537:                        putc('"', actout);
                    538:                        copycomment("\"", actout, 1);
                    539:                        putc('"', actout);
                    540:                        continue;
                    541: 
                    542:                case '\'':
                    543:                        putc('\'', actout);
                    544:                        copycomment("'", actout, 1);
                    545:                        putc('\'', actout);
                    546:                        continue;
                    547: 
                    548:                case '$':
                    549:                        if( istyp = (c = llgetc())=='<' )
                    550:                                gettype(s);
                    551:                        else
                    552:                                llungetc(c);
                    553:                        switch( c = llgetc() ) {
                    554: 
                    555:                        case '$':
                    556:                                if( !istyp && (istyp = ntp->s_type!=UINT) )
                    557:                                        strcpy(s, typeptr[ntp->s_type]->s_name);
                    558:                                fprintf(actout, "yyval");
                    559:                                if( istyp ) 
                    560:                                        fprintf(actout,".%s",s);
                    561:                                break;
                    562:                        case '0':
                    563:                        case '1':
                    564:                        case '2':
                    565:                        case '3':
                    566:                        case '4':
                    567:                        case '5':
                    568:                        case '6':
                    569:                        case '7':
                    570:                        case '8':
                    571:                        case '9':
                    572:                        case '-':
                    573:                                if( sign = c=='-' )
                    574:                                        c = llgetc();
                    575:                                n = readnum(c);
                    576:                                n += -2*sign*n; /* jazzy linear eq. sign switch */
                    577:                                if( n>nel )  {
                    578:                                        yyerror(!FATAL, "illegal $%d construct", n);
                    579:                                        break;
                    580:                                }
                    581: #ifndef IAPX86 /* 'too many stores' workaround */
                    582:                                if( n>0 && !istyp &&
                    583:                                    (sp = elook(PROD_RIGHT (nitprod) [n-1]))-> 
                    584:                                    s_type!=UINT ) {
                    585: #else
                    586:                                sp = elook(PROD_RIGHT (nitprod) [n-1]);
                    587:                                if (n > 0 && !istyp && sp->s_type != UINT) {
                    588: #endif
                    589:                                        sp = typeptr[sp->s_type];
                    590:                                        istyp++;
                    591:                                        strcpy(s, sp->s_name);
                    592:                                }
                    593:                                fprintf(actout,"yypvt[%d]", n-nel);
                    594:                                if( istyp )
                    595:                                        fprintf(actout,".%s",s);
                    596:                                break;
                    597:                        default:
                    598:                                yyerror(!FATAL|SKIP, "illegal construct $%c", c);
                    599:                                break;
                    600:                        }
                    601:                        continue;
                    602:                }
                    603:                putc(c, actout);
                    604:        } while( accolade );
                    605:        fprintf(actout, "break;\n");
                    606: }
                    607: 
                    608: backup(t)
                    609: {
                    610:        last.lex = t;
                    611:        last.val = yylval;
                    612: }
                    613: 
                    614: linepos(f)
                    615: FILE *f;
                    616: {
                    617:        fprintf(f, "\n#line %d \"%s\"\n", yyline, gramy);
                    618: }
                    619: 
                    620: copycomment(s, f,  flag)
                    621: register char *s;
                    622: FILE *f;
                    623: {
                    624:        register c, c1;
                    625: 
                    626:        do {
                    627:                c = llgetc();
                    628:                while( c=='\\' && flag ) {
                    629:                        if( f!=NULL )
                    630:                                fprintf(f, "\\%c", llgetc());
                    631:                        c = llgetc();
                    632:                }
                    633:                if( c==EOF )
                    634:                        yyerror(FATAL, "end of file god knows where");
                    635:                if (c=='\n' && flag)
                    636:                        yyerror(FATAL, "newline in string");
                    637:                if(c!=s[0]){
                    638:                        if(f!=NULL)
                    639:                                putc(c, f);
                    640:                }
                    641:                else if( s[1]!='\0' && (c1 = llgetc()) != s[1] ){
                    642:                        if(f!=NULL)
                    643:                                putc(c, f);
                    644:                        llungetc(c1);
                    645:                }
                    646:        } while( c!=s[0] || (s[1]!='\0' && (c1!=s[1])) );
                    647: }
                    648: 
                    649: getword(s)
                    650: char *s;
                    651: {
                    652:        register char *sp;
                    653:        register c;
                    654: 
                    655:        sp = s;
                    656:        c = llgetc();
                    657:        do {
                    658:                if( sp>=&s[SYMSIZE-1] )
                    659:                        yyerror(FATAL, "symbol too long");
                    660:                *sp++ = c;
                    661:        } while( alphanum(c = llgetc()) );
                    662:        *sp++ = '\0';
                    663:        llungetc(c);
                    664: }
                    665: 
                    666: llgetc()
                    667: {
                    668:        register c;
                    669: 
                    670:        if( (c = getc(defin)) == '\n' )
                    671:                yyline++;
                    672:        return(c);
                    673: }
                    674: 
                    675: llungetc(c)
                    676: register c;
                    677: {
                    678:        if( c=='\n' )
                    679:                yyline--;
                    680:        ungetc(c, defin);
                    681: }
                    682: 
                    683: readchar()
                    684: {
                    685:        register c;
                    686: 
                    687:        if( (c = llgetc()) == '\\' ) {
                    688:                switch( c = llgetc() ) {
                    689:                case 'n':
                    690:                        return( '\n' );
                    691: 
                    692:                case 'r':
                    693:                        return( '\r' );
                    694: 
                    695:                case 't':
                    696:                        return( '\t' );
                    697: 
                    698:                case '\'':
                    699:                        return( '\'' );
                    700: 
                    701:                case 'b':
                    702:                        return( '\b' );
                    703: 
                    704:                case 'f':
                    705:                        return( '\f' );
                    706: 
                    707:                default:
                    708:                        if( c>='0' && c<='7' )
                    709:                                return( readnum(c) );
                    710:                        else
                    711:                                return(c);
                    712:                }
                    713:        }
                    714:        return(c);
                    715: }
                    716: 
                    717: copyunion()
                    718: {
                    719:        register c, accolade;
                    720: 
                    721:        while( whitespace( c = llgetc() ) );
                    722:        if( c!='{' )
                    723:                yyerror(!FATAL,"Bad %union syntax");
                    724:        linepos(fhdr);
                    725:        fprintf(fhdr, "typedef union {");
                    726:        accolade = 1;
                    727: 
                    728:        do {
                    729:                if( (c = llgetc()) == EOF )
                    730:                        yyerror(FATAL, "eof in union declaration");
                    731:                putc(c, fhdr);
                    732:                if( c=='{' ) accolade++;
                    733:                else if( c=='}' ) accolade--;
                    734:                else if( c=='/' ) {
                    735:                        if( (c = llgetc()) == '*' ) {
                    736:                                putc('*', fhdr);
                    737:                                copycomment("*/", fhdr, 0);
                    738:                                fprintf(fhdr, "*/");
                    739:                        } else
                    740:                                llungetc(c);
                    741:                }
                    742:        } while( accolade );
                    743:        fprintf(fhdr, " YYSTYPE;\n");
                    744: }
                    745: 
                    746: readnum(c)
                    747: register c;
                    748: {
                    749:        register n;
                    750: 
                    751:        n = c - '0';
                    752:        while( digit( c=llgetc() ) )
                    753:                n = n*10 + c - '0';
                    754:        llungetc(c);
                    755:        return(n);
                    756: }
                    757: alpha(c)
                    758: {
                    759:        return( (c>='A' && c<='Z') || (c>='a' && c<='z') || c=='_' );
                    760: }
                    761: 
                    762: digit(c)
                    763: {
                    764:        return( c>='0' && c<='9' );
                    765: }
                    766: 
                    767: alphanum(c)
                    768: {
                    769:        return( (c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9')
                    770:            || c=='_' );
                    771: }
                    772: 
                    773: whitespace(c)
                    774: {
                    775:        return( c==' ' || c=='\t' || c=='\f' || c=='\n' );
                    776: }
                    777: 
                    778: whit2space(c)
                    779: {
                    780:        return( c==' ' || c=='\t' || c=='\f' );
                    781: }
                    782: 
                    783: struct sym *
                    784: elook(n)
                    785: register n;
                    786: {
                    787:        if( n>=NTBASE )
                    788:                return( ntrmptr[n-NTBASE] );
                    789:        else
                    790:                return( trmptr[n] );
                    791: }
                    792: 
                    793: min(a,b)
                    794: {
                    795:        return( a<b ? a : b);
                    796: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.