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

unix.superglobalmegacorp.com

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