Annotation of researchv10no/cmd/lex/y.tab.c, revision 1.1.1.1

1.1       root        1: # define CHAR 257
                      2: # define CCL 258
                      3: # define NCCL 259
                      4: # define STR 260
                      5: # define DELIM 261
                      6: # define SCON 262
                      7: # define ITER 263
                      8: # define NEWE 264
                      9: # define NULLS 265
                     10: # define CAT 266
                     11: 
                     12: # line 11 "parser.y"
                     13: #define YYSTYPE union _yystype_
                     14: union _yystype_
                     15: {
                     16:        int     i;
                     17:        char    *cp;
                     18: };
                     19: # include "ldefs.c"
                     20: #define yyclearin yychar = -1
                     21: #define yyerrok yyerrflag = 0
                     22: extern int yychar;
                     23: extern short yyerrflag;
                     24: #ifndef YYMAXDEPTH
                     25: #define YYMAXDEPTH 150
                     26: #endif
                     27: #ifndef YYSTYPE
                     28: #define YYSTYPE int
                     29: #endif
                     30: YYSTYPE yylval, yyval;
                     31: 
                     32: # line 21 "parser.y"
                     33: int i;
                     34: int j,k;
                     35: int g;
                     36: char *p;
                     37: # define YYERRCODE 256
                     38: 
                     39: # line 217 "parser.y"
                     40: 
                     41: yylex(){
                     42:        register char *p;
                     43:        register int c, i;
                     44:        char  *t, *xp;
                     45:        int n, j, k, x;
                     46:        static int sectbegin;
                     47:        static char token[TOKENSIZE];
                     48:        static int iter;
                     49: 
                     50: # ifdef DEBUG
                     51:        yylval.i = 0;
                     52: # endif
                     53: 
                     54:        if(sect == DEFSECTION) {                /* definitions section */
                     55:                while(!eof) {
                     56:                        if(prev == '\n'){               /* next char is at beginning of line */
                     57:                                getl(p=buf);
                     58:                                switch(*p){
                     59:                                case '%':
                     60:                                        switch(c= *(p+1)){
                     61:                                        case '%':
                     62:                                                lgate();
                     63:                                                if(!ratfor)fprintf(fout,"# ");
                     64:                                                fprintf(fout,"define YYNEWLINE %d\n",ctable['\n']);
                     65:                                                if(!ratfor)fprintf(fout,"yylex(){\nint nstr; extern int yyprevious;\n");
                     66:                                                sectbegin = TRUE;
                     67:                                                i = treesize*(sizeof(*name)+sizeof(*left)+
                     68:                                                        sizeof(*right)+sizeof(*nullstr)+sizeof(*parent))+ALITTLEEXTRA;
                     69:                                                c = (int)myalloc(i,1);
                     70:                                                if(c == 0)
                     71:                                                        error("Too little core for parse tree");
                     72:                                                p = (char *)c;
                     73:                                                cfree((char *)p,i,1);
                     74:                                                name = (int *)myalloc(treesize,sizeof(*name));
                     75:                                                left = (int *)myalloc(treesize,sizeof(*left));
                     76:                                                right = (int *)myalloc(treesize,sizeof(*right));
                     77:                                                nullstr = myalloc(treesize,sizeof(*nullstr));
                     78:                                                parent = (int *)myalloc(treesize,sizeof(*parent));
                     79:                                                if(name == 0 || left == 0 || right == 0 || parent == 0 || nullstr == 0)
                     80:                                                        error("Too little core for parse tree");
                     81:                                                return(freturn(DELIM));
                     82:                                        case 'p': case 'P':     /* has overridden number of positions */
                     83:                                                while(*p && !digit(*p))p++;
                     84:                                                maxpos = siconv(p);
                     85: # ifdef DEBUG
                     86:                                                if (debug) printf("positions (%%p) now %d\n",maxpos);
                     87: # endif
                     88:                                                if(report == 2)report = 1;
                     89:                                                continue;
                     90:                                        case 'n': case 'N':     /* has overridden number of states */
                     91:                                                while(*p && !digit(*p))p++;
                     92:                                                nstates = siconv(p);
                     93: # ifdef DEBUG
                     94:                                                if(debug)printf( " no. states (%%n) now %d\n",nstates);
                     95: # endif
                     96:                                                if(report == 2)report = 1;
                     97:                                                continue;
                     98:                                        case 'e': case 'E':             /* has overridden number of tree nodes */
                     99:                                                while(*p && !digit(*p))p++;
                    100:                                                treesize = siconv(p);
                    101: # ifdef DEBUG
                    102:                                                if (debug) printf("treesize (%%e) now %d\n",treesize);
                    103: # endif
                    104:                                                if(report == 2)report = 1;
                    105:                                                continue;
                    106:                                        case 'o': case 'O':
                    107:                                                while (*p && !digit(*p))p++;
                    108:                                                outsize = siconv(p);
                    109:                                                if (report ==2) report=1;
                    110:                                                continue;
                    111:                                        case 'a': case 'A':             /* has overridden number of transitions */
                    112:                                                while(*p && !digit(*p))p++;
                    113:                                                if(report == 2)report = 1;
                    114:                                                ntrans = siconv(p);
                    115: # ifdef DEBUG
                    116:                                                if (debug)printf("N. trans (%%a) now %d\n",ntrans);
                    117: # endif
                    118:                                                continue;
                    119:                                        case 'k': case 'K': /* overriden packed char classes */
                    120:                                                while (*p && !digit(*p))p++;
                    121:                                                if (report==2) report=1;
                    122:                                                cfree((char *)pchar, pchlen, sizeof(*pchar));
                    123:                                                pchlen = siconv(p);
                    124: # ifdef DEBUG
                    125:                                                if (debug) printf( "Size classes (%%k) now %d\n",pchlen);
                    126: # endif
                    127:                                                pchar=pcptr=myalloc(pchlen, sizeof(*pchar));
                    128:                                                continue;
                    129:                                        case 't': case 'T':     /* character set specifier */
                    130:                                                ZCH = atoi(p+2);
                    131:                                                if (ZCH < NCH) ZCH = NCH;
                    132:                                                if (ZCH > 2*NCH) error("ch table needs redeclaration");
                    133:                                                chset = TRUE;
                    134:                                                for(i = 0; i<ZCH; i++)
                    135:                                                        ctable[i] = 0;
                    136:                                                while(getl(p) && scomp(p,"%T") != 0 && scomp(p,"%t") != 0){
                    137:                                                        if((n = siconv(p)) <= 0 || n > ZCH){
                    138:                                                                warning("Character value %d out of range",n);
                    139:                                                                continue;
                    140:                                                                }
                    141:                                                        while(!space(*p) && *p) p++;
                    142:                                                        while(space(*p)) p++;
                    143:                                                        t = p;
                    144:                                                        while(*t){
                    145:                                                                c = ctrans(&t);
                    146:                                                                if(ctable[c]){
                    147:                                                                        if (printable(c))
                    148:                                                                                warning("Character '%c' used twice",c);
                    149:                                                                        else
                    150:                                                                                warning("Character %o used twice",c);
                    151:                                                                        }
                    152:                                                                else ctable[c] = n;
                    153:                                                                t++;
                    154:                                                                }
                    155:                                                        p = buf;
                    156:                                                        }
                    157:                                                {
                    158:                                                char chused[2*NCH]; int kr;
                    159:                                                for(i=0; i<ZCH; i++)
                    160:                                                        chused[i]=0;
                    161:                                                for(i=0; i<NCH; i++)
                    162:                                                        chused[ctable[i]]=1;
                    163:                                                for(kr=i=1; i<NCH; i++)
                    164:                                                        if (ctable[i]==0)
                    165:                                                                {
                    166:                                                                while (chused[kr] == 0)
                    167:                                                                        kr++;
                    168:                                                                ctable[i]=kr;
                    169:                                                                chused[kr]=1;
                    170:                                                                }
                    171:                                                }
                    172:                                                lgate();
                    173:                                                continue;
                    174:                                        case 'r': case 'R':
                    175:                                                c = 'r';
                    176:                                        case 'c': case 'C':
                    177:                                                if(lgatflg)
                    178:                                                        error("Too late for language specifier");
                    179:                                                ratfor = (c == 'r');
                    180:                                                continue;
                    181:                                        case '{':
                    182:                                                lgate();
                    183:                                                sharpline();
                    184:                                                while(getl(p) && scomp(p,"%}") != 0)
                    185:                                                        fprintf(fout, "%s\n",p);
                    186:                                                if(p[0] == '%') continue;
                    187:                                                error("Premature eof");
                    188:                                        case 's': case 'S':             /* start conditions */
                    189:                                                lgate();
                    190:                                                while(*p && index(*p," \t,") < 0) p++;
                    191:                                                n = TRUE;
                    192:                                                while(n){
                    193:                                                        while(*p && index(*p," \t,") >= 0) p++;
                    194:                                                        t = p;
                    195:                                                        while(*p && index(*p," \t,") < 0)p++;
                    196:                                                        if(!*p) n = FALSE;
                    197:                                                        *p++ = 0;
                    198:                                                        if (*t == 0) continue;
                    199:                                                        i = sptr*2;
                    200:                                                        if(!ratfor)fprintf(fout,"# ");
                    201:                                                        fprintf(fout,"define %s %d\n",t,i);
                    202:                                                        scopy(t,sp);
                    203:                                                        sname[sptr++] = sp;
                    204:                                                        sname[sptr] = 0;        /* required by lookup */
                    205:                                                        if(sptr >= STARTSIZE)
                    206:                                                                error("Too many start conditions");
                    207:                                                        sp += slength(sp) + 1;
                    208:                                                        if(sp >= schar+STARTCHAR)
                    209:                                                                error("Start conditions too long");
                    210:                                                        }
                    211:                                                continue;
                    212:                                        default:
                    213:                                                warning("Invalid request %s",p);
                    214:                                                continue;
                    215:                                                }       /* end of switch after seeing '%' */
                    216:                                case ' ': case '\t':            /* must be code */
                    217:                                        lgate();
                    218:                                        fprintf(fout, "%s\n",p);
                    219:                                        continue;
                    220:                                default:                /* definition */
                    221:                                        while(*p && !space(*p)) p++;
                    222:                                        if(*p == 0)
                    223:                                                continue;
                    224:                                        prev = *p;
                    225:                                        *p = 0;
                    226:                                        bptr = p+1;
                    227:                                        yylval.cp = buf;
                    228:                                        if(digit(buf[0]))
                    229:                                                warning("Substitution strings may not begin with digits");
                    230:                                        return(freturn(STR));
                    231:                                        }
                    232:                                }
                    233:                        /* still sect 1, but prev != '\n' */
                    234:                        else {
                    235:                                p = bptr;
                    236:                                while(*p && space(*p)) p++;
                    237:                                if(*p == 0)
                    238:                                        warning("No translation given - null string assumed");
                    239:                                scopy(p,token);
                    240:                                yylval.cp = token;
                    241:                                prev = '\n';
                    242:                                return(freturn(STR));
                    243:                                }
                    244:                        }
                    245:                /* end of section one processing */
                    246:                }
                    247:        else if(sect == RULESECTION){           /* rules and actions */
                    248:                while(!eof){
                    249:                        switch(c=gch()){
                    250:                        case '\0':
                    251:                                return(freturn(0));
                    252:                        case '\n':
                    253:                                if(prev == '\n') continue;
                    254:                                x = NEWE;
                    255:                                break;
                    256:                        case ' ':
                    257:                        case '\t':
                    258:                                if(sectbegin == TRUE){
                    259:                                        sharpline();
                    260:                                        cpyact();
                    261:                                        while((c=gch()) && c != '\n');
                    262:                                        continue;
                    263:                                        }
                    264:                                if(!funcflag)phead2();
                    265:                                funcflag = TRUE;
                    266:                                if(ratfor)fprintf(fout,"%d\n",30000+casecount);
                    267:                                else fprintf(fout,"case %d:\n",casecount);
                    268:                                sharpline();
                    269:                                if(cpyact()){
                    270:                                        if(ratfor)fprintf(fout,"goto 30997\n");
                    271:                                        else fprintf(fout,"break;\n");
                    272:                                        }
                    273:                                while((c=gch()) && c != '\n');
                    274:                                if(peek == ' ' || peek == '\t' || sectbegin == TRUE){
                    275:                                        warning("Executable statements should occur right after %%");
                    276:                                        continue;
                    277:                                        }
                    278:                                x = NEWE;
                    279:                                break;
                    280:                        case '%':
                    281:                                if(prev != '\n') goto character;
                    282:                                if(peek == '{'){        /* included code */
                    283:                                        sharpline();
                    284:                                        getl(buf);
                    285:                                        while(!eof && getl(buf) && scomp("%}",buf) != 0)
                    286:                                                fprintf(fout,"%s\n",buf);
                    287:                                        continue;
                    288:                                        }
                    289:                                if(peek == '%'){
                    290:                                        c = gch();
                    291:                                        c = gch();
                    292:                                        x = DELIM;
                    293:                                        break;
                    294:                                        }
                    295:                                goto character;
                    296:                        case '|':
                    297:                                if(peek == ' ' || peek == '\t' || peek == '\n'){
                    298:                                        if(ratfor)fprintf(fout,"%d\n",30000+casecount++);
                    299:                                        else fprintf(fout,"case %d:\n",casecount++);
                    300:                                        continue;
                    301:                                        }
                    302:                                x = '|';
                    303:                                break;
                    304:                        case '$':
                    305:                                if(peek == '\n' || peek == ' ' || peek == '\t' || peek == '|' || peek == '/'){
                    306:                                        x = c;
                    307:                                        break;
                    308:                                        }
                    309:                                goto character;
                    310:                        case '^':
                    311:                                if(prev != '\n' && scon != TRUE) goto character;        /* valid only at line begin */
                    312:                                x = c;
                    313:                                break;
                    314:                        case '?':
                    315:                        case '+':
                    316:                        case '.':
                    317:                        case '*':
                    318:                        case '(':
                    319:                        case ')':
                    320:                        case ',':
                    321:                        case '/':
                    322:                                x = c;
                    323:                                break;
                    324:                        case '}':
                    325:                                iter = FALSE;
                    326:                                x = c;
                    327:                                break;
                    328:                        case '{':       /* either iteration or definition */
                    329:                                if(digit(c=gch())){     /* iteration */
                    330:                                        iter = TRUE;
                    331:                                ieval:
                    332:                                        i = 0;
                    333:                                        while(digit(c)){
                    334:                                                token[i++] = c;
                    335:                                                c = gch();
                    336:                                                }
                    337:                                        token[i] = 0;
                    338:                                        yylval.i = siconv(token);
                    339:                                        munput('c',c);
                    340:                                        x = ITER;
                    341:                                        break;
                    342:                                        }
                    343:                                else {          /* definition */
                    344:                                        i = 0;
                    345:                                        while(c && c!='}'){
                    346:                                                token[i++] = c;
                    347:                                                c = gch();
                    348:                                                }
                    349:                                        token[i] = 0;
                    350:                                        i = lookup(token,def);
                    351:                                        if(i < 0)
                    352:                                                warning("Definition %s not found",token);
                    353:                                        else
                    354:                                                munput('s',subs[i]);
                    355:                                        continue;
                    356:                                        }
                    357:                        case '<':               /* start condition ? */
                    358:                                if(prev != '\n')                /* not at line begin, not start */
                    359:                                        goto character;
                    360:                                t = slptr;
                    361:                                do {
                    362:                                        i = 0;
                    363:                                        c = gch();
                    364:                                        while(c != ',' && c && c != '>'){
                    365:                                                token[i++] = c;
                    366:                                                c = gch();
                    367:                                                }
                    368:                                        token[i] = 0;
                    369:                                        if(i == 0)
                    370:                                                goto character;
                    371:                                        i = lookup(token,sname);
                    372:                                        if(i < 0) {
                    373:                                                warning("Undefined start condition %s",token);
                    374:                                                continue;
                    375:                                                }
                    376:                                        *slptr++ = i+1;
                    377:                                        } while(c && c != '>');
                    378:                                *slptr++ = 0;
                    379:                                /* check if previous value re-usable */
                    380:                                for (xp=slist; xp<t; )
                    381:                                        {
                    382:                                        if (strcmp(xp, t)==0)
                    383:                                                break;
                    384:                                        while (*xp++);
                    385:                                        }
                    386:                                if (xp<t)
                    387:                                        {
                    388:                                        /* re-use previous pointer to string */
                    389:                                        slptr=t;
                    390:                                        t=xp;
                    391:                                        }
                    392:                                if(slptr > slist+STARTSIZE)             /* note not packed ! */
                    393:                                        error("Too many start conditions used");
                    394:                                yylval.cp = t;
                    395:                                x = SCON;
                    396:                                break;
                    397:                        case '"':
                    398:                                i = 0;
                    399:                                while((c=gch()) && c != '"' && c != '\n'){
                    400:                                        if(c == '\\') c = usescape(c=gch());
                    401:                                        token[i++] = c;
                    402:                                        if(i > TOKENSIZE){
                    403:                                                warning("String too long");
                    404:                                                i = TOKENSIZE-1;
                    405:                                                break;
                    406:                                                }
                    407:                                        }
                    408:                                if(c == '\n') {
                    409:                                        yyline--;
                    410:                                        warning("Non-terminated string");
                    411:                                        yyline++;
                    412:                                        }
                    413:                                token[i] = 0;
                    414:                                if(i == 0)x = NULLS;
                    415:                                else if(i == 1){
                    416:                                        yylval.i = token[0];
                    417:                                        x = CHAR;
                    418:                                        }
                    419:                                else {
                    420:                                        yylval.cp = token;
                    421:                                        x = STR;
                    422:                                        }
                    423:                                break;
                    424:                        case '[':
                    425:                                for(i=1;i<NCH;i++) symbol[i] = 0;
                    426:                                x = CCL;
                    427:                                if((c = gch()) == '^'){
                    428:                                        x = NCCL;
                    429:                                        c = gch();
                    430:                                        }
                    431:                                while(c != ']' && c){
                    432:                                        if(c == '\\') c = usescape(c=gch());
                    433:                                        symbol[c] = 1;
                    434:                                        j = c;
                    435:                                        if((c=gch()) == '-' && peek != ']'){            /* range specified */
                    436:                                                c = gch();
                    437:                                                if(c == '\\') c = usescape(c=gch());
                    438:                                                k = c;
                    439:                                                if(j > k) {
                    440:                                                        n = j;
                    441:                                                        j = k;
                    442:                                                        k = n;
                    443:                                                        }
                    444:                                                if(!(('A' <= j && k <= 'Z') ||
                    445:                                                     ('a' <= j && k <= 'z') ||
                    446:                                                     ('0' <= j && k <= '9')))
                    447:                                                        warning("Non-portable Character Class");
                    448:                                                for(n=j+1;n<=k;n++)
                    449:                                                        symbol[n] = 1;          /* implementation dependent */
                    450:                                                c = gch();
                    451:                                                }
                    452:                                        }
                    453:                                /* try to pack ccl's */
                    454:                                i = 0;
                    455:                                for(j=0;j<NCH;j++)
                    456:                                        if(symbol[j])token[i++] = j;
                    457:                                token[i] = 0;
                    458:                                p = ccptr;
                    459:                                if(optim){
                    460:                                        p = ccl;
                    461:                                        while(p <ccptr && scomp(token,p) != 0)p++;
                    462:                                        }
                    463:                                if(p < ccptr)   /* found it */
                    464:                                        yylval.cp = p;
                    465:                                else {
                    466:                                        yylval.cp = ccptr;
                    467:                                        scopy(token,ccptr);
                    468:                                        ccptr += slength(token) + 1;
                    469:                                        if(ccptr >= ccl+CCLSIZE)
                    470:                                                error("Too many large character classes");
                    471:                                        }
                    472:                                cclinter(x==CCL);
                    473:                                break;
                    474:                        case '\\':
                    475:                                c = usescape(c=gch());
                    476:                        default:
                    477:                        character:
                    478:                                if(iter){       /* second part of an iteration */
                    479:                                        iter = FALSE;
                    480:                                        if('0' <= c && c <= '9')
                    481:                                                goto ieval;
                    482:                                        }
                    483:                                if(alpha(peek)){
                    484:                                        i = 0;
                    485:                                        yylval.cp = token;
                    486:                                        token[i++] = c;
                    487:                                        while(alpha(peek))
                    488:                                                token[i++] = gch();
                    489:                                        if(peek == '?' || peek == '*' || peek == '+')
                    490:                                                munput('c',token[--i]);
                    491:                                        token[i] = 0;
                    492:                                        if(i == 1){
                    493:                                                yylval.i = token[0];
                    494:                                                x = CHAR;
                    495:                                                }
                    496:                                        else x = STR;
                    497:                                        }
                    498:                                else {
                    499:                                        yylval.i = c;
                    500:                                        x = CHAR;
                    501:                                        }
                    502:                                }
                    503:                        scon = FALSE;
                    504:                        if(x == SCON)scon = TRUE;
                    505:                        sectbegin = FALSE;
                    506:                        return(freturn(x));
                    507:                        }
                    508:                }
                    509:        /* section three */
                    510:        ptail();
                    511: # ifdef DEBUG
                    512:        if(debug)
                    513:                fprintf(fout,"\n/*this comes from section three - debug */\n");
                    514: # endif
                    515:        sharpline();
                    516:        while(getl(buf) && !eof)
                    517:                fprintf(fout,"%s\n",buf);
                    518:        return(freturn(0));
                    519:        }
                    520: /* end of yylex */
                    521: # ifdef DEBUG
                    522: freturn(i)
                    523:   int i; {
                    524:        if(yydebug) {
                    525:                printf("now return ");
                    526:                if(i < NCH) allprint(i);
                    527:                else printf("%d",i);
                    528:                printf("   yylval = ");
                    529:                switch(i){
                    530:                        case STR: case CCL: case NCCL:
                    531:                                strpt(yylval.cp);
                    532:                                break;
                    533:                        case CHAR:
                    534:                                allprint(yylval.i);
                    535:                                break;
                    536:                        default:
                    537:                                printf("%d",yylval.i);
                    538:                                break;
                    539:                        }
                    540:                putchar('\n');
                    541:                }
                    542:        return(i);
                    543:        }
                    544: # endif
                    545: short yyexca[] ={
                    546: -1, 0,
                    547:        260, 8,
                    548:        261, 8,
                    549:        -2, 0,
                    550: -1, 1,
                    551:        0, -1,
                    552:        -2, 0,
                    553: -1, 5,
                    554:        0, 6,
                    555:        -2, 0,
                    556: -1, 8,
                    557:        0, 6,
                    558:        -2, 0,
                    559:        };
                    560: # define YYNPROD 33
                    561: # define YYLAST 291
                    562: short yyact[]={
                    563: 
                    564:   34,  45,  35,  23,  21,  43,  27,  28,   4,  34,
                    565:   16,  32,  41,  21,  46,  27,  28,  10,  34,  16,
                    566:   32,   8,  21,   9,  27,  28,  25,  29,  16,   6,
                    567:    7,   3,  24,  34,  27,  28,  29,  21,  11,  27,
                    568:   28,   2,   5,  16,   1,  29,  21,   0,  27,  28,
                    569:    0,   0,  16,   0,   0,  29,  21,   0,  20,   0,
                    570:   29,   0,  16,   0,   0,  21,   0,  20,   0,  29,
                    571:    0,  16,   0,   0,  31,   0,  20,   0,   0,   0,
                    572:   12,   0,   0,  12,   0,   0,   0,   0,  30,   0,
                    573:    0,  20,   0,  42,  36,  37,  38,  30,   0,   0,
                    574:    0,   0,   0,   0,   0,  39,  30,  40,   0,   0,
                    575:   20,   0,   0,   0,   0,   0,   0,   0,   0,  20,
                    576:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    577:    0,   0,   0,   0,   0,   0,   0,   0,   0,  44,
                    578:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    579:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    580:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    581:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    582:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    583:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    584:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    585:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    586:    0,  14,  17,  18,  15,   0,  19,  33,   0,  22,
                    587:   14,  17,  18,  15,   0,  19,  33,  26,  22,  14,
                    588:   17,  18,  15,   0,   0,  33,   0,  22,   0,   0,
                    589:    0,   0,   0,   0,  14,  17,  18,  15,   0,   0,
                    590:   33,   0,  22,  14,  17,  18,  15,   0,   0,  33,
                    591:    0,  22,  13,  14,  17,  18,  15,   7,  19,   0,
                    592:    0,  22,  14,  17,  18,  15,   0,  19,   0,   0,
                    593:   22 };
                    594: short yypact[]={
                    595: 
                    596: -248,-1000,-1000,-231,-1000,  16,-257,-1000,  16,-1000,
                    597: -1000,-1000, -27,-262,-1000,-1000,-1000,-1000,-1000,  25,
                    598:   25,  25,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
                    599:   25,  -8,  25, -32,-1000,-1000, -18,   6, -36,  -3,
                    600:  -18,-124,-1000,-1000,-111,-1000,-1000 };
                    601: short yypgo[]={
                    602: 
                    603:    0,  44,  41,  31,  38,  21,  23,  17,  74 };
                    604: short yyr1[]={
                    605: 
                    606:    0,   1,   2,   2,   2,   6,   6,   3,   3,   4,
                    607:    5,   5,   7,   7,   8,   8,   8,   8,   8,   8,
                    608:    8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
                    609:    8,   8,   8 };
                    610: short yyr2[]={
                    611: 
                    612:    0,   1,   4,   3,   1,   1,   0,   3,   0,   1,
                    613:    2,   1,   2,   2,   1,   1,   1,   1,   1,   2,
                    614:    2,   2,   3,   2,   3,   5,   3,   4,   2,   2,
                    615:    2,   3,   1 };
                    616: short yychk[]={
                    617: 
                    618: -1000,  -1,  -2,  -3, 256,  -4, 260, 261,  -5,  -6,
                    619:   -7,  -4,  -8, 256, 257, 260,  46, 258, 259, 262,
                    620:   94,  40, 265, 260,  -6,  -7, 264,  42,  43,  63,
                    621:  124,  -8,  47, 263,  36, 264,  -8,  -8,  -8,  -8,
                    622:   -8,  44, 125,  41, 263, 125, 125 };
                    623: short yydef[]={
                    624: 
                    625:   -2,  -2,   1,   0,   4,  -2,   0,   9,  -2,   3,
                    626:   11,   5,   0,   0,  14,  15,  16,  17,  18,   0,
                    627:    0,   0,  32,   7,   2,  10,  12,  19,  20,  21,
                    628:    0,  23,   0,   0,  30,  13,  28,  29,   0,  22,
                    629:   24,   0,  26,  31,   0,  27,  25 };
                    630: # ifdef YYDEBUG
                    631: # include "y.debug"
                    632: # endif
                    633: 
                    634: # define YYFLAG -1000
                    635: # define YYERROR goto yyerrlab
                    636: # define YYACCEPT return(0)
                    637: # define YYABORT return(1)
                    638: 
                    639: /*     parser for yacc output  */
                    640: 
                    641: #ifdef YYDEBUG
                    642: int yydebug = 0; /* 1 for debugging */
                    643: #endif
                    644: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
                    645: int yychar = -1; /* current input token number */
                    646: int yynerrs = 0;  /* number of errors */
                    647: short yyerrflag = 0;  /* error recovery flag */
                    648: 
                    649: yyparse()
                    650: {      short yys[YYMAXDEPTH];
                    651:        int yyj, yym;
                    652:        register YYSTYPE *yypvt;
                    653:        register int yystate, yyn;
                    654:        register short *yyps;
                    655:        register YYSTYPE *yypv;
                    656:        register short *yyxi;
                    657: 
                    658:        yystate = 0;
                    659:        yychar = -1;
                    660:        yynerrs = 0;
                    661:        yyerrflag = 0;
                    662:        yyps= &yys[-1];
                    663:        yypv= &yyv[-1];
                    664: 
                    665: yystack:    /* put a state and value onto the stack */
                    666: #ifdef YYDEBUG
                    667:        if(yydebug >= 3)
                    668:                if(yychar < 0 || yytoknames[yychar] == 0)
                    669:                        printf("char %d in %s", yychar, yystates[yystate]);
                    670:                else
                    671:                        printf("%s in %s", yytoknames[yychar], yystates[yystate]);
                    672: #endif
                    673:        if( ++yyps >= &yys[YYMAXDEPTH] ) { 
                    674:                yyerror( "yacc stack overflow" ); 
                    675:                return(1); 
                    676:        }
                    677:        *yyps = yystate;
                    678:        ++yypv;
                    679:        *yypv = yyval;
                    680: yynewstate:
                    681:        yyn = yypact[yystate];
                    682:        if(yyn <= YYFLAG) goto yydefault; /* simple state */
                    683:        if(yychar<0) {
                    684:                yychar = yylex();
                    685: #ifdef YYDEBUG
                    686:                if(yydebug >= 2) {
                    687:                        if(yychar <= 0)
                    688:                                printf("lex EOF\n");
                    689:                        else if(yytoknames[yychar])
                    690:                                printf("lex %s\n", yytoknames[yychar]);
                    691:                        else
                    692:                                printf("lex (%c)\n", yychar);
                    693:                }
                    694: #endif
                    695:                if(yychar < 0)
                    696:                        yychar = 0;
                    697:        }
                    698:        if((yyn += yychar) < 0 || yyn >= YYLAST)
                    699:                goto yydefault;
                    700:        if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
                    701:                yychar = -1;
                    702:                yyval = yylval;
                    703:                yystate = yyn;
                    704:                if( yyerrflag > 0 ) --yyerrflag;
                    705:                goto yystack;
                    706:        }
                    707: yydefault:
                    708:        /* default state action */
                    709:        if( (yyn=yydef[yystate]) == -2 ) {
                    710:                if(yychar < 0) {
                    711:                        yychar = yylex();
                    712: #ifdef YYDEBUG
                    713:                        if(yydebug >= 2)
                    714:                                if(yychar < 0)
                    715:                                        printf("lex EOF\n");
                    716:                                else
                    717:                                        printf("lex %s\n", yytoknames[yychar]);
                    718: #endif
                    719:                        if(yychar < 0)
                    720:                                yychar = 0;
                    721:                }
                    722:                /* look through exception table */
                    723:                for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
                    724:                        yyxi += 2 ) ; /* VOID */
                    725:                while( *(yyxi+=2) >= 0 ){
                    726:                        if( *yyxi == yychar ) break;
                    727:                }
                    728:                if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
                    729:        }
                    730:        if( yyn == 0 ){ /* error */
                    731:                /* error ... attempt to resume parsing */
                    732:                switch( yyerrflag ){
                    733:                case 0:   /* brand new error */
                    734: #ifdef YYDEBUG
                    735:                        yyerror("syntax error\n%s", yystates[yystate]);
                    736:                        if(yytoknames[yychar])
                    737:                                yyerror("saw %s\n", yytoknames[yychar]);
                    738:                        else if(yychar >= ' ' && yychar < '\177')
                    739:                                yyerror("saw `%c'\n", yychar);
                    740:                        else if(yychar == 0)
                    741:                                yyerror("saw EOF\n");
                    742:                        else
                    743:                                yyerror("saw char 0%o\n", yychar);
                    744: #else
                    745:                        yyerror( "syntax error" );
                    746: #endif
                    747: yyerrlab:
                    748:                        ++yynerrs;
                    749:                case 1:
                    750:                case 2: /* incompletely recovered error ... try again */
                    751:                        yyerrflag = 3;
                    752:                        /* find a state where "error" is a legal shift action */
                    753:                        while ( yyps >= yys ) {
                    754:                                yyn = yypact[*yyps] + YYERRCODE;
                    755:                                if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
                    756:                                        yystate = yyact[yyn];  /* simulate a shift of "error" */
                    757:                                        goto yystack;
                    758:                                }
                    759:                                yyn = yypact[*yyps];
                    760:                                /* the current yyps has no shift onn "error", pop stack */
                    761: #ifdef YYDEBUG
                    762:                                if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
                    763: #endif
                    764:                                --yyps;
                    765:                                --yypv;
                    766:                        }
                    767:                        /* there is no state on the stack with an error shift ... abort */
                    768: yyabort:
                    769:                        return(1);
                    770:                case 3:  /* no shift yet; clobber input char */
                    771: #ifdef YYDEBUG
                    772:                        if( yydebug ) {
                    773:                                printf("error recovery discards ");
                    774:                                if(yytoknames[yychar])
                    775:                                        printf("%s\n", yytoknames[yychar]);
                    776:                                else if(yychar >= ' ' && yychar < '\177')
                    777:                                        printf("`%c'\n", yychar);
                    778:                                else if(yychar == 0)
                    779:                                        printf("EOF\n");
                    780:                                else
                    781:                                        printf("char 0%o\n", yychar);
                    782:                        }
                    783: #endif
                    784:                        if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
                    785:                        yychar = -1;
                    786:                        goto yynewstate;   /* try again in the same state */
                    787:                }
                    788:        }
                    789:        /* reduction by production yyn */
                    790: #ifdef YYDEBUG
                    791:        if(yydebug) {   char *s;
                    792:                printf("reduce %d in:\n\t", yyn);
                    793:                for(s = yystates[yystate]; *s; s++) {
                    794:                        putchar(*s);
                    795:                        if(*s == '\n' && *(s+1))
                    796:                                putchar('\t');
                    797:                }
                    798:        }
                    799: #endif
                    800:        yyps -= yyr2[yyn];
                    801:        yypvt = yypv;
                    802:        yypv -= yyr2[yyn];
                    803:        yyval = yypv[1];
                    804:        yym=yyn;
                    805:        /* consult goto table to find next state */
                    806:        yyn = yyr1[yyn];
                    807:        yyj = yypgo[yyn] + *yyps + 1;
                    808:        if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
                    809:        switch(yym){
                    810:                
                    811: case 1:
                    812: # line 27 "parser.y"
                    813: {      
                    814: # ifdef DEBUG
                    815:                if(debug) sect2dump();
                    816: # endif
                    817:        } break;
                    818: case 3:
                    819: # line 35 "parser.y"
                    820: {
                    821:                if(!funcflag)phead2();
                    822:                funcflag = TRUE;
                    823:        } break;
                    824: case 4:
                    825: # line 40 "parser.y"
                    826: {
                    827: # ifdef DEBUG
                    828:                if(debug) {
                    829:                        sect1dump();
                    830:                        sect2dump();
                    831:                        }
                    832: # endif
                    833:                } break;
                    834: case 7:
                    835: # line 51 "parser.y"
                    836: {      scopy(yypvt[-1],dp);
                    837:                def[dptr] = dp;
                    838:                dp += slength(yypvt[-1]) + 1;
                    839:                scopy(yypvt[-0],dp);
                    840:                subs[dptr++] = dp;
                    841:                if(dptr >= DEFSIZE)
                    842:                        error("Too many definitions");
                    843:                dp += slength(yypvt[-0]) + 1;
                    844:                if(dp >= dchar+DEFCHAR)
                    845:                        error("Definitions too long");
                    846:                subs[dptr]=def[dptr]=0; /* for lookup - require ending null */
                    847:        } break;
                    848: case 9:
                    849: # line 66 "parser.y"
                    850: {
                    851: # ifdef DEBUG
                    852:                if(sect == DEFSECTION && debug) sect1dump();
                    853: # endif
                    854:                sect++;
                    855:                } break;
                    856: case 10:
                    857: # line 74 "parser.y"
                    858: {      yyval.i = mn2(RNEWE,yypvt[-1].i,yypvt[-0].i);
                    859:                } break;
                    860: case 11:
                    861: # line 77 "parser.y"
                    862: {      yyval.i = yypvt[-0].i;} break;
                    863: case 12:
                    864: # line 80 "parser.y"
                    865: {
                    866:                if(divflg == TRUE)
                    867:                        i = mn1(S1FINAL,casecount);
                    868:                else i = mn1(FINAL,casecount);
                    869:                yyval.i = mn2(RCAT,yypvt[-1].i,i);
                    870:                divflg = FALSE;
                    871:                casecount++;
                    872:                } break;
                    873: case 13:
                    874: # line 89 "parser.y"
                    875: {
                    876: # ifdef DEBUG
                    877:                if(debug) sect2dump();
                    878: # endif
                    879:                } break;
                    880: case 14:
                    881: # line 95 "parser.y"
                    882: {      yyval.i = mn0(yypvt[-0].i); } break;
                    883: case 15:
                    884: # line 97 "parser.y"
                    885: {
                    886:                p = yypvt[-0].cp;
                    887:                i = mn0(*p++);
                    888:                while(*p)
                    889:                        i = mn2(RSTR,i,*p++);
                    890:                yyval.i = i;
                    891:                } break;
                    892: case 16:
                    893: # line 105 "parser.y"
                    894: {      symbol['\n'] = 0;
                    895:                if(psave == FALSE){
                    896:                        p = ccptr;
                    897:                        psave = ccptr;
                    898:                        for(i=1;i<'\n';i++){
                    899:                                symbol[i] = 1;
                    900:                                *ccptr++ = i;
                    901:                                }
                    902:                        for(i='\n'+1;i<NCH;i++){
                    903:                                symbol[i] = 1;
                    904:                                *ccptr++ = i;
                    905:                                }
                    906:                        *ccptr++ = 0;
                    907:                        if(ccptr > ccl+CCLSIZE)
                    908:                                error("Too many large character classes");
                    909:                        }
                    910:                else
                    911:                        p = psave;
                    912:                yyval.i = mn1(RCCL,p);
                    913:                cclinter(1);
                    914:                } break;
                    915: case 17:
                    916: # line 127 "parser.y"
                    917: {      yyval.i = mn1(RCCL,yypvt[-0].i); } break;
                    918: case 18:
                    919: # line 129 "parser.y"
                    920: {      yyval.i = mn1(RNCCL,yypvt[-0].i); } break;
                    921: case 19:
                    922: # line 131 "parser.y"
                    923: {      yyval.i = mn1(STAR,yypvt[-1].i); } break;
                    924: case 20:
                    925: # line 133 "parser.y"
                    926: {      yyval.i = mn1(PLUS,yypvt[-1].i); } break;
                    927: case 21:
                    928: # line 135 "parser.y"
                    929: {      yyval.i = mn1(QUEST,yypvt[-1].i); } break;
                    930: case 22:
                    931: # line 137 "parser.y"
                    932: {      yyval.i = mn2(BAR,yypvt[-2].i,yypvt[-0].i); } break;
                    933: case 23:
                    934: # line 139 "parser.y"
                    935: {      yyval.i = mn2(RCAT,yypvt[-1].i,yypvt[-0].i); } break;
                    936: case 24:
                    937: # line 141 "parser.y"
                    938: {      if(!divflg){
                    939:                        j = mn1(S2FINAL,-casecount);
                    940:                        i = mn2(RCAT,yypvt[-2].i,j);
                    941:                        yyval.i = mn2(DIV,i,yypvt[-0].i);
                    942:                        }
                    943:                else {
                    944:                        yyval.i = mn2(RCAT,yypvt[-2].i,yypvt[-0].i);
                    945:                        warning("Extra slash removed");
                    946:                        }
                    947:                divflg = TRUE;
                    948:                } break;
                    949: case 25:
                    950: # line 153 "parser.y"
                    951: {      if(yypvt[-3].i > yypvt[-1].i){
                    952:                        i = yypvt[-3].i;
                    953:                        yypvt[-3].i = yypvt[-1].i;
                    954:                        yypvt[-1].i = i;
                    955:                        }
                    956:                if(yypvt[-1].i <= 0)
                    957:                        warning("Iteration range must be positive");
                    958:                else {
                    959:                        j = yypvt[-4].i;
                    960:                        for(k = 2; k<=yypvt[-3].i;k++)
                    961:                                j = mn2(RCAT,j,dupl(yypvt[-4].i));
                    962:                        for(i = yypvt[-3].i+1; i<=yypvt[-1].i; i++){
                    963:                                g = dupl(yypvt[-4].i);
                    964:                                for(k=2;k<=i;k++)
                    965:                                        g = mn2(RCAT,g,dupl(yypvt[-4].i));
                    966:                                j = mn2(BAR,j,g);
                    967:                                }
                    968:                        yyval.i = j;
                    969:                        }
                    970:        } break;
                    971: case 26:
                    972: # line 174 "parser.y"
                    973: {
                    974:                if(yypvt[-1].i < 0)warning("Can't have negative iteration");
                    975:                else if(yypvt[-1].i == 0) yyval.i = mn0(RNULLS);
                    976:                else {
                    977:                        j = yypvt[-2].i;
                    978:                        for(k=2;k<=yypvt[-1].i;k++)
                    979:                                j = mn2(RCAT,j,dupl(yypvt[-2].i));
                    980:                        yyval.i = j;
                    981:                        }
                    982:                } break;
                    983: case 27:
                    984: # line 185 "parser.y"
                    985: {
                    986:                                /* from n to infinity */
                    987:                if(yypvt[-2].i < 0)warning("Can't have negative iteration");
                    988:                else if(yypvt[-2].i == 0) yyval.i = mn1(STAR,yypvt[-3].i);
                    989:                else if(yypvt[-2].i == 1)yyval.i = mn1(PLUS,yypvt[-3].i);
                    990:                else {          /* >= 2 iterations minimum */
                    991:                        j = yypvt[-3].i;
                    992:                        for(k=2;k<yypvt[-2].i;k++)
                    993:                                j = mn2(RCAT,j,dupl(yypvt[-3].i));
                    994:                        k = mn1(PLUS,dupl(yypvt[-3].i));
                    995:                        yyval.i = mn2(RCAT,j,k);
                    996:                        }
                    997:                } break;
                    998: case 28:
                    999: # line 199 "parser.y"
                   1000: {      yyval.i = mn2(RSCON,yypvt[-0].i,yypvt[-1].i); } break;
                   1001: case 29:
                   1002: # line 201 "parser.y"
                   1003: {      yyval.i = mn1(CARAT,yypvt[-0].i); } break;
                   1004: case 30:
                   1005: # line 203 "parser.y"
                   1006: {      i = mn0('\n');
                   1007:                if(!divflg){
                   1008:                        j = mn1(S2FINAL,-casecount);
                   1009:                        k = mn2(RCAT,yypvt[-1].i,j);
                   1010:                        yyval.i = mn2(DIV,k,i);
                   1011:                        }
                   1012:                else yyval.i = mn2(RCAT,yypvt[-1].i,i);
                   1013:                divflg = TRUE;
                   1014:                } break;
                   1015: case 31:
                   1016: # line 213 "parser.y"
                   1017: {      yyval.i = yypvt[-1].i; } break;
                   1018: case 32:
                   1019: # line 215 "parser.y"
                   1020: {      yyval.i = mn0(RNULLS); } break;
                   1021:        }
                   1022:        goto yystack;  /* stack new state and value */
                   1023: }

unix.superglobalmegacorp.com

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