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