|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.