Annotation of 42BSD/usr.bin/y.tab.c, revision 1.1.1.1

1.1       root        1: # define CHAR 257
                      2: # define DOT 258
                      3: # define CCL 259
                      4: # define NCCL 260
                      5: # define OR 261
                      6: # define CAT 262
                      7: # define STAR 263
                      8: # define PLUS 264
                      9: # define QUEST 265
                     10: 
                     11: # line 16 "egrep.y"
                     12: static char *sccsid = "@(#)egrep.y     4.3 (Berkeley) 3/13/83";
                     13: #include <stdio.h>
                     14: 
                     15: #define MAXLIN 350
                     16: #define MAXPOS 4000
                     17: #define NCHARS 128
                     18: #define NSTATES 128
                     19: #define FINAL -1
                     20: char gotofn[NSTATES][NCHARS];
                     21: int state[NSTATES];
                     22: char out[NSTATES];
                     23: int line = 1;
                     24: int name[MAXLIN];
                     25: int left[MAXLIN];
                     26: int right[MAXLIN];
                     27: int parent[MAXLIN];
                     28: int foll[MAXLIN];
                     29: int positions[MAXPOS];
                     30: char chars[MAXLIN];
                     31: int nxtpos;
                     32: int nxtchar = 0;
                     33: int tmpstat[MAXLIN];
                     34: int initstat[MAXLIN];
                     35: int xstate;
                     36: int count;
                     37: int icount;
                     38: char *input;
                     39: FILE *exprfile;
                     40: 
                     41: long   lnum;
                     42: int    bflag;
                     43: int    cflag;
                     44: int    fflag;
                     45: int    lflag;
                     46: int    nflag;
                     47: int    hflag   = 1;
                     48: int    sflag;
                     49: int    vflag;
                     50: int    retcode = 0;
                     51: int    nfile;
                     52: int    blkno;
                     53: long   tln;
                     54: int    nsucc;
                     55: 
                     56: int    f;
                     57: char   *fname;
                     58: #define yyclearin yychar = -1
                     59: #define yyerrok yyerrflag = 0
                     60: extern int yychar;
                     61: extern short yyerrflag;
                     62: #ifndef YYMAXDEPTH
                     63: #define YYMAXDEPTH 150
                     64: #endif
                     65: #ifndef YYSTYPE
                     66: #define YYSTYPE int
                     67: #endif
                     68: YYSTYPE yylval, yyval;
                     69: # define YYERRCODE 256
                     70: 
                     71: # line 108 "egrep.y"
                     72: 
                     73: yyerror(s) {
                     74:        fprintf(stderr, "egrep: %s\n", s);
                     75:        exit(2);
                     76: }
                     77: 
                     78: yylex() {
                     79:        extern int yylval;
                     80:        int cclcnt, x;
                     81:        register char c, d;
                     82:        switch(c = nextch()) {
                     83:                case '$':
                     84:                case '^': c = '\n';
                     85:                        goto defchar;
                     86:                case '|': return (OR);
                     87:                case '*': return (STAR);
                     88:                case '+': return (PLUS);
                     89:                case '?': return (QUEST);
                     90:                case '(': return (c);
                     91:                case ')': return (c);
                     92:                case '.': return (DOT);
                     93:                case '\0': return (0);
                     94:                case '\n': return (OR);
                     95:                case '[': 
                     96:                        x = CCL;
                     97:                        cclcnt = 0;
                     98:                        count = nxtchar++;
                     99:                        if ((c = nextch()) == '^') {
                    100:                                x = NCCL;
                    101:                                c = nextch();
                    102:                        }
                    103:                        do {
                    104:                                if (c == '\0') synerror();
                    105:                                if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
                    106:                                        if ((d = nextch()) != 0) {
                    107:                                                c = chars[nxtchar-1];
                    108:                                                while (c < d) {
                    109:                                                        if (nxtchar >= MAXLIN) overflo();
                    110:                                                        chars[nxtchar++] = ++c;
                    111:                                                        cclcnt++;
                    112:                                                }
                    113:                                                continue;
                    114:                                        }
                    115:                                }
                    116:                                if (nxtchar >= MAXLIN) overflo();
                    117:                                chars[nxtchar++] = c;
                    118:                                cclcnt++;
                    119:                        } while ((c = nextch()) != ']');
                    120:                        chars[count] = cclcnt;
                    121:                        return (x);
                    122:                case '\\':
                    123:                        if ((c = nextch()) == '\0') synerror();
                    124:                defchar:
                    125:                default: yylval = c; return (CHAR);
                    126:        }
                    127: }
                    128: nextch() {
                    129:        register char c;
                    130:        if (fflag) {
                    131:                if ((c = getc(exprfile)) == EOF) {
                    132:                        fclose(exprfile);
                    133:                        return(0);
                    134:                }
                    135:        }
                    136:        else c = *input++;
                    137:        return(c);
                    138: }
                    139: 
                    140: synerror() {
                    141:        fprintf(stderr, "egrep: syntax error\n");
                    142:        exit(2);
                    143: }
                    144: 
                    145: enter(x) int x; {
                    146:        if(line >= MAXLIN) overflo();
                    147:        name[line] = x;
                    148:        left[line] = 0;
                    149:        right[line] = 0;
                    150:        return(line++);
                    151: }
                    152: 
                    153: cclenter(x) int x; {
                    154:        register linno;
                    155:        linno = enter(x);
                    156:        right[linno] = count;
                    157:        return (linno);
                    158: }
                    159: 
                    160: node(x, l, r) {
                    161:        if(line >= MAXLIN) overflo();
                    162:        name[line] = x;
                    163:        left[line] = l;
                    164:        right[line] = r;
                    165:        parent[l] = line;
                    166:        parent[r] = line;
                    167:        return(line++);
                    168: }
                    169: 
                    170: unary(x, d) {
                    171:        if(line >= MAXLIN) overflo();
                    172:        name[line] = x;
                    173:        left[line] = d;
                    174:        right[line] = 0;
                    175:        parent[d] = line;
                    176:        return(line++);
                    177: }
                    178: overflo() {
                    179:        fprintf(stderr, "egrep: regular expression too long\n");
                    180:        exit(2);
                    181: }
                    182: 
                    183: cfoll(v) {
                    184:        register i;
                    185:        if (left[v] == 0) {
                    186:                count = 0;
                    187:                for (i=1; i<=line; i++) tmpstat[i] = 0;
                    188:                follow(v);
                    189:                add(foll, v);
                    190:        }
                    191:        else if (right[v] == 0) cfoll(left[v]);
                    192:        else {
                    193:                cfoll(left[v]);
                    194:                cfoll(right[v]);
                    195:        }
                    196: }
                    197: cgotofn() {
                    198:        register c, i, k;
                    199:        int n, s;
                    200:        char symbol[NCHARS];
                    201:        int j, nc, pc, pos;
                    202:        int curpos, num;
                    203:        int number, newpos;
                    204:        count = 0;
                    205:        for (n=3; n<=line; n++) tmpstat[n] = 0;
                    206:        if (cstate(line-1)==0) {
                    207:                tmpstat[line] = 1;
                    208:                count++;
                    209:                out[0] = 1;
                    210:        }
                    211:        for (n=3; n<=line; n++) initstat[n] = tmpstat[n];
                    212:        count--;                /*leave out position 1 */
                    213:        icount = count;
                    214:        tmpstat[1] = 0;
                    215:        add(state, 0);
                    216:        n = 0;
                    217:        for (s=0; s<=n; s++)  {
                    218:                if (out[s] == 1) continue;
                    219:                for (i=0; i<NCHARS; i++) symbol[i] = 0;
                    220:                num = positions[state[s]];
                    221:                count = icount;
                    222:                for (i=3; i<=line; i++) tmpstat[i] = initstat[i];
                    223:                pos = state[s] + 1;
                    224:                for (i=0; i<num; i++) {
                    225:                        curpos = positions[pos];
                    226:                        if ((c = name[curpos]) >= 0) {
                    227:                                if (c < NCHARS) symbol[c] = 1;
                    228:                                else if (c == DOT) {
                    229:                                        for (k=0; k<NCHARS; k++)
                    230:                                                if (k!='\n') symbol[k] = 1;
                    231:                                }
                    232:                                else if (c == CCL) {
                    233:                                        nc = chars[right[curpos]];
                    234:                                        pc = right[curpos] + 1;
                    235:                                        for (k=0; k<nc; k++) symbol[chars[pc++]] = 1;
                    236:                                }
                    237:                                else if (c == NCCL) {
                    238:                                        nc = chars[right[curpos]];
                    239:                                        for (j = 0; j < NCHARS; j++) {
                    240:                                                pc = right[curpos] + 1;
                    241:                                                for (k = 0; k < nc; k++)
                    242:                                                        if (j==chars[pc++]) goto cont;
                    243:                                                if (j!='\n') symbol[j] = 1;
                    244:                                                cont:;
                    245:                                        }
                    246:                                }
                    247:                                else printf("something's funny\n");
                    248:                        }
                    249:                        pos++;
                    250:                }
                    251:                for (c=0; c<NCHARS; c++) {
                    252:                        if (symbol[c] == 1) { /* nextstate(s,c) */
                    253:                                count = icount;
                    254:                                for (i=3; i <= line; i++) tmpstat[i] = initstat[i];
                    255:                                pos = state[s] + 1;
                    256:                                for (i=0; i<num; i++) {
                    257:                                        curpos = positions[pos];
                    258:                                        if ((k = name[curpos]) >= 0)
                    259:                                                if (
                    260:                                                        (k == c)
                    261:                                                        | (k == DOT)
                    262:                                                        | (k == CCL && member(c, right[curpos], 1))
                    263:                                                        | (k == NCCL && member(c, right[curpos], 0))
                    264:                                                ) {
                    265:                                                        number = positions[foll[curpos]];
                    266:                                                        newpos = foll[curpos] + 1;
                    267:                                                        for (k=0; k<number; k++) {
                    268:                                                                if (tmpstat[positions[newpos]] != 1) {
                    269:                                                                        tmpstat[positions[newpos]] = 1;
                    270:                                                                        count++;
                    271:                                                                }
                    272:                                                                newpos++;
                    273:                                                        }
                    274:                                                }
                    275:                                        pos++;
                    276:                                } /* end nextstate */
                    277:                                if (notin(n)) {
                    278:                                        if (n >= NSTATES) overflo();
                    279:                                        add(state, ++n);
                    280:                                        if (tmpstat[line] == 1) out[n] = 1;
                    281:                                        gotofn[s][c] = n;
                    282:                                }
                    283:                                else {
                    284:                                        gotofn[s][c] = xstate;
                    285:                                }
                    286:                        }
                    287:                }
                    288:        }
                    289: }
                    290: 
                    291: cstate(v) {
                    292:        register b;
                    293:        if (left[v] == 0) {
                    294:                if (tmpstat[v] != 1) {
                    295:                        tmpstat[v] = 1;
                    296:                        count++;
                    297:                }
                    298:                return(1);
                    299:        }
                    300:        else if (right[v] == 0) {
                    301:                if (cstate(left[v]) == 0) return (0);
                    302:                else if (name[v] == PLUS) return (1);
                    303:                else return (0);
                    304:        }
                    305:        else if (name[v] == CAT) {
                    306:                if (cstate(left[v]) == 0 && cstate(right[v]) == 0) return (0);
                    307:                else return (1);
                    308:        }
                    309:        else { /* name[v] == OR */
                    310:                b = cstate(right[v]);
                    311:                if (cstate(left[v]) == 0 || b == 0) return (0);
                    312:                else return (1);
                    313:        }
                    314: }
                    315: 
                    316: 
                    317: member(symb, set, torf) {
                    318:        register i, num, pos;
                    319:        num = chars[set];
                    320:        pos = set + 1;
                    321:        for (i=0; i<num; i++)
                    322:                if (symb == chars[pos++]) return (torf);
                    323:        return (!torf);
                    324: }
                    325: 
                    326: notin(n) {
                    327:        register i, j, pos;
                    328:        for (i=0; i<=n; i++) {
                    329:                if (positions[state[i]] == count) {
                    330:                        pos = state[i] + 1;
                    331:                        for (j=0; j < count; j++)
                    332:                                if (tmpstat[positions[pos++]] != 1) goto nxt;
                    333:                        xstate = i;
                    334:                        return (0);
                    335:                }
                    336:                nxt: ;
                    337:        }
                    338:        return (1);
                    339: }
                    340: 
                    341: add(array, n) int *array; {
                    342:        register i;
                    343:        if (nxtpos + count > MAXPOS) overflo();
                    344:        array[n] = nxtpos;
                    345:        positions[nxtpos++] = count;
                    346:        for (i=3; i <= line; i++) {
                    347:                if (tmpstat[i] == 1) {
                    348:                        positions[nxtpos++] = i;
                    349:                }
                    350:        }
                    351: }
                    352: 
                    353: follow(v) int v; {
                    354:        int p;
                    355:        if (v == line) return;
                    356:        p = parent[v];
                    357:        switch(name[p]) {
                    358:                case STAR:
                    359:                case PLUS:      cstate(v);
                    360:                                follow(p);
                    361:                                return;
                    362: 
                    363:                case OR:
                    364:                case QUEST:     follow(p);
                    365:                                return;
                    366: 
                    367:                case CAT:       if (v == left[p]) {
                    368:                                        if (cstate(right[p]) == 0) {
                    369:                                                follow(p);
                    370:                                                return;
                    371:                                        }
                    372:                                }
                    373:                                else follow(p);
                    374:                                return;
                    375:                case FINAL:     if (tmpstat[line] != 1) {
                    376:                                        tmpstat[line] = 1;
                    377:                                        count++;
                    378:                                }
                    379:                                return;
                    380:        }
                    381: }
                    382: 
                    383: 
                    384: main(argc, argv)
                    385: char **argv;
                    386: {
                    387:        while (--argc > 0 && (++argv)[0][0]=='-')
                    388:                switch (argv[0][1]) {
                    389: 
                    390:                case 's':
                    391:                        sflag++;
                    392:                        continue;
                    393: 
                    394:                case 'h':
                    395:                        hflag = 0;
                    396:                        continue;
                    397: 
                    398:                case 'b':
                    399:                        bflag++;
                    400:                        continue;
                    401: 
                    402:                case 'c':
                    403:                        cflag++;
                    404:                        continue;
                    405: 
                    406:                case 'e':
                    407:                        argc--;
                    408:                        argv++;
                    409:                        goto out;
                    410: 
                    411:                case 'f':
                    412:                        fflag++;
                    413:                        continue;
                    414: 
                    415:                case 'l':
                    416:                        lflag++;
                    417:                        continue;
                    418: 
                    419:                case 'n':
                    420:                        nflag++;
                    421:                        continue;
                    422: 
                    423:                case 'v':
                    424:                        vflag++;
                    425:                        continue;
                    426: 
                    427:                default:
                    428:                        fprintf(stderr, "egrep: unknown flag\n");
                    429:                        continue;
                    430:                }
                    431: out:
                    432:        if (argc<=0)
                    433:                exit(2);
                    434:        if (fflag) {
                    435:                fname = *argv;
                    436:                exprfile = fopen(fname, "r");
                    437:                if (exprfile == (FILE *)NULL) {
                    438:                        fprintf(stderr, "egrep: can't open %s\n", fname);
                    439:                        exit(2);
                    440:                }
                    441:        }
                    442:        else input = *argv;
                    443:        argc--;
                    444:        argv++;
                    445: 
                    446:        yyparse();
                    447: 
                    448:        cfoll(line-1);
                    449:        cgotofn();
                    450:        nfile = argc;
                    451:        if (argc<=0) {
                    452:                if (lflag) exit(1);
                    453:                execute(0);
                    454:        }
                    455:        else while (--argc >= 0) {
                    456:                execute(*argv);
                    457:                argv++;
                    458:        }
                    459:        exit(retcode != 0 ? retcode : nsucc == 0);
                    460: }
                    461: 
                    462: execute(file)
                    463: char *file;
                    464: {
                    465:        register char *p;
                    466:        register cstat;
                    467:        register ccount;
                    468:        char buf[1024];
                    469:        char *nlp;
                    470:        int istat;
                    471:        if (file) {
                    472:                if ((f = open(file, 0)) < 0) {
                    473:                        fprintf(stderr, "egrep: can't open %s\n", file);
                    474:                        retcode = 2;
                    475:                        return;
                    476:                }
                    477:        }
                    478:        else f = 0;
                    479:        ccount = 0;
                    480:        lnum = 1;
                    481:        tln = 0;
                    482:        blkno = 0;
                    483:        p = buf;
                    484:        nlp = p;
                    485:        if ((ccount = read(f,p,512))<=0) goto done;
                    486:        istat = cstat = gotofn[0]['\n'];
                    487:        if (out[cstat]) goto found;
                    488:        for (;;) {
                    489:                cstat = gotofn[cstat][*p&0377]; /* all input chars made positive */
                    490:                if (out[cstat]) {
                    491:                found:  for(;;) {
                    492:                                if (*p++ == '\n') {
                    493:                                        if (vflag == 0) {
                    494:                                succeed:        nsucc = 1;
                    495:                                                if (cflag) tln++;
                    496:                                                else if (sflag)
                    497:                                                        ;       /* ugh */
                    498:                                                else if (lflag) {
                    499:                                                        printf("%s\n", file);
                    500:                                                        close(f);
                    501:                                                        return;
                    502:                                                }
                    503:                                                else {
                    504:                                                        if (nfile > 1 && hflag) printf("%s:", file);
                    505:                                                        if (bflag) printf("%d:", blkno);
                    506:                                                        if (nflag) printf("%ld:", lnum);
                    507:                                                        if (p <= nlp) {
                    508:                                                                while (nlp < &buf[1024]) putchar(*nlp++);
                    509:                                                                nlp = buf;
                    510:                                                        }
                    511:                                                        while (nlp < p) putchar(*nlp++);
                    512:                                                }
                    513:                                        }
                    514:                                        lnum++;
                    515:                                        nlp = p;
                    516:                                        if ((out[(cstat=istat)]) == 0) goto brk2;
                    517:                                }
                    518:                                cfound:
                    519:                                if (--ccount <= 0) {
                    520:                                        if (p <= &buf[512]) {
                    521:                                                if ((ccount = read(f, p, 512)) <= 0) goto done;
                    522:                                        }
                    523:                                        else if (p == &buf[1024]) {
                    524:                                                p = buf;
                    525:                                                if ((ccount = read(f, p, 512)) <= 0) goto done;
                    526:                                        }
                    527:                                        else {
                    528:                                                if ((ccount = read(f, p, &buf[1024]-p)) <= 0) goto done;
                    529:                                        }
                    530:                                        blkno++;
                    531:                                }
                    532:                        }
                    533:                }
                    534:                if (*p++ == '\n') {
                    535:                        if (vflag) goto succeed;
                    536:                        else {
                    537:                                lnum++;
                    538:                                nlp = p;
                    539:                                if (out[(cstat=istat)]) goto cfound;
                    540:                        }
                    541:                }
                    542:                brk2:
                    543:                if (--ccount <= 0) {
                    544:                        if (p <= &buf[512]) {
                    545:                                if ((ccount = read(f, p, 512)) <= 0) break;
                    546:                        }
                    547:                        else if (p == &buf[1024]) {
                    548:                                p = buf;
                    549:                                if ((ccount = read(f, p, 512)) <= 0) break;
                    550:                        }
                    551:                        else {
                    552:                                if ((ccount = read(f, p, &buf[1024] - p)) <= 0) break;
                    553:                        }
                    554:                        blkno++;
                    555:                }
                    556:        }
                    557: done:  close(f);
                    558:        if (cflag) {
                    559:                if (nfile > 1)
                    560:                        printf("%s:", file);
                    561:                printf("%ld\n", tln);
                    562:        }
                    563: }
                    564: short yyexca[] ={
                    565: -1, 1,
                    566:        0, -1,
                    567:        -2, 0,
                    568:        };
                    569: # define YYNPROD 18
                    570: # define YYLAST 261
                    571: short yyact[]={
                    572: 
                    573:   10,  22,   4,  14,  11,   2,   1,   5,   0,   0,
                    574:   10,  15,  16,  17,  18,   0,  19,  20,   3,   0,
                    575:   10,   0,   0,  12,   0,  20,   0,  20,   0,   0,
                    576:   10,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    577:   10,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    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,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    587:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    588:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    589:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    590:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    591:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    592:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    593:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    594:    0,   0,   0,   0,   0,   0,  11,   6,   7,   8,
                    595:    9,  21,   0,  15,  16,  17,  11,   6,   7,   8,
                    596:    9,  23,   0,  15,  16,  17,  11,   6,   7,   8,
                    597:    9,  13,   0,  15,  16,  17,  11,   6,   7,   8,
                    598:    9,   0,   0,  15,  16,  17,  11,   6,   7,   8,
                    599:    9 };
                    600: short yypact[]={
                    601: 
                    602: -259,-1000,-1000,   0,-1000, -20,-1000,-1000,-1000,-1000,
                    603:    0,-1000,   0,   0,-252,-1000,-1000,-1000, -40, -30,
                    604:  -10,   0,-1000,   0 };
                    605: short yypgo[]={
                    606: 
                    607:    0,   6,   5,  18,   3 };
                    608: short yyr1[]={
                    609: 
                    610:    0,   1,   2,   2,   2,   2,   3,   4,   4,   4,
                    611:    4,   4,   4,   4,   4,   4,   4,   4 };
                    612: short yyr2[]={
                    613: 
                    614:    0,   1,   2,   4,   3,   3,   0,   1,   1,   1,
                    615:    1,   3,   2,   2,   2,   2,   3,   1 };
                    616: short yychk[]={
                    617: 
                    618: -1000,  -1,  -2,  -3, 261,  -4, 257, 258, 259, 260,
                    619:   40, 256,  -3, 261,  -4, 263, 264, 265,  -4,  -4,
                    620:   -4, 261,  41, 261 };
                    621: short yydef[]={
                    622: 
                    623:    6,  -2,   1,   0,   6,   2,   7,   8,   9,  10,
                    624:    0,  17,   0,   5,  12,  13,  14,  15,   0,   4,
                    625:   11,   0,  16,   3 };
                    626: #ifndef lint
                    627: static char yaccpar_sccsid[] = "@(#)yaccpar    4.1     (Berkeley)      2/11/83";
                    628: #endif not lint
                    629: 
                    630: #
                    631: # define YYFLAG -1000
                    632: # define YYERROR goto yyerrlab
                    633: # define YYACCEPT return(0)
                    634: # define YYABORT return(1)
                    635: 
                    636: /*     parser for yacc output  */
                    637: 
                    638: #ifdef YYDEBUG
                    639: int yydebug = 0; /* 1 for debugging */
                    640: #endif
                    641: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
                    642: int yychar = -1; /* current input token number */
                    643: int yynerrs = 0;  /* number of errors */
                    644: short yyerrflag = 0;  /* error recovery flag */
                    645: 
                    646: yyparse() {
                    647: 
                    648:        short yys[YYMAXDEPTH];
                    649:        short yyj, yym;
                    650:        register YYSTYPE *yypvt;
                    651:        register short yystate, *yyps, yyn;
                    652:        register YYSTYPE *yypv;
                    653:        register short *yyxi;
                    654: 
                    655:        yystate = 0;
                    656:        yychar = -1;
                    657:        yynerrs = 0;
                    658:        yyerrflag = 0;
                    659:        yyps= &yys[-1];
                    660:        yypv= &yyv[-1];
                    661: 
                    662:  yystack:    /* put a state and value onto the stack */
                    663: 
                    664: #ifdef YYDEBUG
                    665:        if( yydebug  ) printf( "state %d, char 0%o\n", yystate, yychar );
                    666: #endif
                    667:                if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
                    668:                *yyps = yystate;
                    669:                ++yypv;
                    670:                *yypv = yyval;
                    671: 
                    672:  yynewstate:
                    673: 
                    674:        yyn = yypact[yystate];
                    675: 
                    676:        if( yyn<= YYFLAG ) goto yydefault; /* simple state */
                    677: 
                    678:        if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
                    679:        if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
                    680: 
                    681:        if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
                    682:                yychar = -1;
                    683:                yyval = yylval;
                    684:                yystate = yyn;
                    685:                if( yyerrflag > 0 ) --yyerrflag;
                    686:                goto yystack;
                    687:                }
                    688: 
                    689:  yydefault:
                    690:        /* default state action */
                    691: 
                    692:        if( (yyn=yydef[yystate]) == -2 ) {
                    693:                if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
                    694:                /* look through exception table */
                    695: 
                    696:                for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
                    697: 
                    698:                while( *(yyxi+=2) >= 0 ){
                    699:                        if( *yyxi == yychar ) break;
                    700:                        }
                    701:                if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
                    702:                }
                    703: 
                    704:        if( yyn == 0 ){ /* error */
                    705:                /* error ... attempt to resume parsing */
                    706: 
                    707:                switch( yyerrflag ){
                    708: 
                    709:                case 0:   /* brand new error */
                    710: 
                    711:                        yyerror( "syntax error" );
                    712:                yyerrlab:
                    713:                        ++yynerrs;
                    714: 
                    715:                case 1:
                    716:                case 2: /* incompletely recovered error ... try again */
                    717: 
                    718:                        yyerrflag = 3;
                    719: 
                    720:                        /* find a state where "error" is a legal shift action */
                    721: 
                    722:                        while ( yyps >= yys ) {
                    723:                           yyn = yypact[*yyps] + YYERRCODE;
                    724:                           if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
                    725:                              yystate = yyact[yyn];  /* simulate a shift of "error" */
                    726:                              goto yystack;
                    727:                              }
                    728:                           yyn = yypact[*yyps];
                    729: 
                    730:                           /* the current yyps has no shift onn "error", pop stack */
                    731: 
                    732: #ifdef YYDEBUG
                    733:                           if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
                    734: #endif
                    735:                           --yyps;
                    736:                           --yypv;
                    737:                           }
                    738: 
                    739:                        /* there is no state on the stack with an error shift ... abort */
                    740: 
                    741:        yyabort:
                    742:                        return(1);
                    743: 
                    744: 
                    745:                case 3:  /* no shift yet; clobber input char */
                    746: 
                    747: #ifdef YYDEBUG
                    748:                        if( yydebug ) printf( "error recovery discards char %d\n", yychar );
                    749: #endif
                    750: 
                    751:                        if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
                    752:                        yychar = -1;
                    753:                        goto yynewstate;   /* try again in the same state */
                    754: 
                    755:                        }
                    756: 
                    757:                }
                    758: 
                    759:        /* reduction by production yyn */
                    760: 
                    761: #ifdef YYDEBUG
                    762:                if( yydebug ) printf("reduce %d\n",yyn);
                    763: #endif
                    764:                yyps -= yyr2[yyn];
                    765:                yypvt = yypv;
                    766:                yypv -= yyr2[yyn];
                    767:                yyval = yypv[1];
                    768:                yym=yyn;
                    769:                        /* consult goto table to find next state */
                    770:                yyn = yyr1[yyn];
                    771:                yyj = yypgo[yyn] + *yyps + 1;
                    772:                if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
                    773:                switch(yym){
                    774:                        
                    775: case 1:
                    776: # line 66 "egrep.y"
                    777: { unary(FINAL, yypvt[-0]);
                    778:                  line--;
                    779:                } break;
                    780: case 2:
                    781: # line 71 "egrep.y"
                    782: { yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
                    783: case 3:
                    784: # line 73 "egrep.y"
                    785: { yyval = node(CAT, yypvt[-2], yypvt[-1]); } break;
                    786: case 4:
                    787: # line 75 "egrep.y"
                    788: { yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
                    789: case 5:
                    790: # line 77 "egrep.y"
                    791: { yyval = node(CAT, yypvt[-2], yypvt[-1]); } break;
                    792: case 6:
                    793: # line 80 "egrep.y"
                    794: { yyval = enter(DOT);
                    795:                   yyval = unary(STAR, yyval); } break;
                    796: case 7:
                    797: # line 84 "egrep.y"
                    798: { yyval = enter(yypvt[-0]); } break;
                    799: case 8:
                    800: # line 86 "egrep.y"
                    801: { yyval = enter(DOT); } break;
                    802: case 9:
                    803: # line 88 "egrep.y"
                    804: { yyval = cclenter(CCL); } break;
                    805: case 10:
                    806: # line 90 "egrep.y"
                    807: { yyval = cclenter(NCCL); } break;
                    808: case 11:
                    809: # line 94 "egrep.y"
                    810: { yyval = node(OR, yypvt[-2], yypvt[-0]); } break;
                    811: case 12:
                    812: # line 96 "egrep.y"
                    813: { yyval = node(CAT, yypvt[-1], yypvt[-0]); } break;
                    814: case 13:
                    815: # line 98 "egrep.y"
                    816: { yyval = unary(STAR, yypvt[-1]); } break;
                    817: case 14:
                    818: # line 100 "egrep.y"
                    819: { yyval = unary(PLUS, yypvt[-1]); } break;
                    820: case 15:
                    821: # line 102 "egrep.y"
                    822: { yyval = unary(QUEST, yypvt[-1]); } break;
                    823: case 16:
                    824: # line 104 "egrep.y"
                    825: { yyval = yypvt[-1]; } break;
                    826:                }
                    827:                goto yystack;  /* stack new state and value */
                    828: 
                    829:        }

unix.superglobalmegacorp.com

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