|
|
1.1 ! root 1: # include "ldefs.c" ! 2: ! 3: sharpline() /* print a #line lineno "filename" */ ! 4: { ! 5: fprintf(fout, "\n#line %d \"%s\"\n", yyline, infile); ! 6: } ! 7: ! 8: char * ! 9: getl(p) /* return next line of input, throw away trailing '\n' */ ! 10: /* returns 0 if eof is had immediately */ ! 11: char *p; ! 12: { ! 13: register int c; ! 14: register char *s, *t; ! 15: t = s = p; ! 16: while(((c = gch()) != 0) && c != '\n') ! 17: *t++ = c; ! 18: *t = 0; ! 19: if(c == 0 && s == t) return((char *)0); ! 20: prev = '\n'; ! 21: pres = '\n'; ! 22: return(s); ! 23: } ! 24: space(ch) ! 25: { ! 26: switch(ch) ! 27: { ! 28: case ' ': ! 29: case '\t': ! 30: case '\n': ! 31: return(1); ! 32: } ! 33: return(0); ! 34: } ! 35: ! 36: digit(c) ! 37: { ! 38: return(c>='0' && c <= '9'); ! 39: } ! 40: error(s,p,d) ! 41: { ! 42: if(!eof)fprintf(errorf,"%d: ",yyline); ! 43: fprintf(errorf,"(Error) "); ! 44: fprintf(errorf,s,p,d); ! 45: putc('\n',errorf); ! 46: # ifdef DEBUG ! 47: if(debug && sect != ENDSECTION) { ! 48: sect1dump(); ! 49: sect2dump(); ! 50: } ! 51: # endif ! 52: if( ! 53: # ifdef DEBUG ! 54: debug || ! 55: # endif ! 56: report == 1) statistics(); ! 57: exit(1); /* error return code */ ! 58: } ! 59: ! 60: warning(s,p,d) ! 61: { ! 62: if(!eof)fprintf(errorf,"%d: ",yyline); ! 63: fprintf(errorf,"(Warning) "); ! 64: fprintf(errorf,s,p,d); ! 65: putc('\n',errorf); ! 66: fflush(errorf); ! 67: fflush(fout); ! 68: fflush(stdout); ! 69: } ! 70: index(a,s) ! 71: char *s; ! 72: { ! 73: register int k; ! 74: for(k=0; s[k]; k++) ! 75: if (s[k]== a) ! 76: return(k); ! 77: return(-1); ! 78: } ! 79: ! 80: alpha(c) ! 81: int c; { ! 82: # ifdef ASCII ! 83: return('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z'); ! 84: # endif ! 85: # ifdef EBCDIC ! 86: return(index(c,"abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") >= 0); ! 87: # endif ! 88: } ! 89: printable(c) ! 90: { ! 91: # ifdef ASCII ! 92: return( c>040 && c < 0177); ! 93: # endif ! 94: # ifdef EBCDIC ! 95: return(index(c, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:><+*)('&%!-=\"")>=0); ! 96: # endif ! 97: } ! 98: lgate() ! 99: { ! 100: char fname[20]; ! 101: if (lgatflg) return; ! 102: lgatflg=1; ! 103: if(fout == NULL){ ! 104: sprintf(fname, "lex.yy.%c", ratfor ? 'r' : 'c' ); ! 105: fout = fopen(fname, "w"); ! 106: } ! 107: if(fout == NULL) error("Can't open %s",fname); ! 108: if(ratfor) fprintf( fout, "#\n"); ! 109: phead1(); ! 110: } ! 111: /* scopy(ptr to str, ptr to str) - copy first arg str to second */ ! 112: /* returns ptr to second arg */ ! 113: scopy(s,t) ! 114: char *s, *t; { ! 115: register char *i; ! 116: i = t; ! 117: while(*i++ = *s++); ! 118: return; ! 119: } ! 120: siconv(t) /* convert string t, return integer value */ ! 121: char *t; { ! 122: register int i,sw; ! 123: register char *s; ! 124: s = t; ! 125: while(!(('0' <= *s && *s <= '9') || *s == '-') && *s) s++; ! 126: sw = 0; ! 127: if(*s == '-'){ /* neg */ ! 128: sw = 1; ! 129: s++; ! 130: } ! 131: i = 0; ! 132: while('0' <= *s && *s <= '9') ! 133: i = i * 10 + (*(s++)-'0'); ! 134: return(sw ? -i : i); ! 135: } ! 136: /* slength(ptr to str) - return integer length of string arg */ ! 137: /* excludes '\0' terminator */ ! 138: slength(s) ! 139: char *s; { ! 140: register int n; ! 141: register char *t; ! 142: t = s; ! 143: for (n = 0; *t++; n++); ! 144: return(n); ! 145: } ! 146: /* scomp(x,y) - return -1 if x < y, ! 147: 0 if x == y, ! 148: return 1 if x > y, all lexicographically */ ! 149: scomp(x,y) ! 150: char *x,*y; { ! 151: register char *a,*d; ! 152: a = x; ! 153: d = y; ! 154: while(*a || *d){ ! 155: if(*a > *d) ! 156: return(1); /* greater */ ! 157: if(*a < *d) ! 158: return(-1); /* less */ ! 159: a++; ! 160: d++; ! 161: } ! 162: return(0); /* equal */ ! 163: } ! 164: ctrans(ss) ! 165: char **ss; ! 166: { ! 167: register int c, k; ! 168: if ((c = **ss) != '\\') ! 169: return(c); ! 170: switch(c= *++*ss) ! 171: { ! 172: case 'n': c = '\n'; break; ! 173: case 't': c = '\t'; break; ! 174: case 'r': c = '\r'; break; ! 175: case 'b': c = '\b'; break; ! 176: case 'f': c = 014; break; /* form feed for ascii */ ! 177: case '\\': c = '\\'; break; ! 178: case '0': case '1': case '2': case '3': ! 179: case '4': case '5': case '6': case '7': ! 180: c -= '0'; ! 181: while ((k = *(*ss+1)) >= '0' && k <= '7') ! 182: { ! 183: c = c*8 + k - '0'; ! 184: (*ss)++; ! 185: } ! 186: break; ! 187: } ! 188: return(c); ! 189: } ! 190: cclinter(sw) ! 191: int sw; { ! 192: /* sw = 1 ==> ccl */ ! 193: register int i, j, k; ! 194: int m; ! 195: if(!sw){ /* is NCCL */ ! 196: for(i=1;i<NCH;i++) ! 197: symbol[i] ^= 1; /* reverse value */ ! 198: } ! 199: for(i=1;i<NCH;i++) ! 200: if(symbol[i]) break; ! 201: if(i >= NCH) return; ! 202: i = cindex[i]; ! 203: /* see if ccl is already in our table */ ! 204: j = 0; ! 205: if(i){ ! 206: for(j=1;j<NCH;j++){ ! 207: if((symbol[j] && cindex[j] != i) || ! 208: (!symbol[j] && cindex[j] == i)) break; ! 209: } ! 210: } ! 211: if(j >= NCH) return; /* already in */ ! 212: m = 0; ! 213: k = 0; ! 214: for(i=1;i<NCH;i++) ! 215: if(symbol[i]){ ! 216: if(!cindex[i]){ ! 217: cindex[i] = ccount; ! 218: symbol[i] = 0; ! 219: m = 1; ! 220: } ! 221: else k = 1; ! 222: } ! 223: /* m == 1 implies last value of ccount has been used */ ! 224: if(m)ccount++; ! 225: if(k == 0) return; /* is now in as ccount wholly */ ! 226: /* intersection must be computed */ ! 227: for(i=1;i<NCH;i++){ ! 228: if(symbol[i]){ ! 229: m = 0; ! 230: j = cindex[i]; /* will be non-zero */ ! 231: for(k=1;k<NCH;k++){ ! 232: if(cindex[k] == j){ ! 233: if(symbol[k]) symbol[k] = 0; ! 234: else { ! 235: cindex[k] = ccount; ! 236: m = 1; ! 237: } ! 238: } ! 239: } ! 240: if(m)ccount++; ! 241: } ! 242: } ! 243: return; ! 244: } ! 245: usescape(c) ! 246: int c; { ! 247: register char d; ! 248: switch(c){ ! 249: case 'n': c = '\n'; break; ! 250: case 'r': c = '\r'; break; ! 251: case 't': c = '\t'; break; ! 252: case 'b': c = '\b'; break; ! 253: case 'f': c = 014; break; /* form feed for ascii */ ! 254: case '0': case '1': case '2': case '3': ! 255: case '4': case '5': case '6': case '7': ! 256: c -= '0'; ! 257: while('0' <= (d=gch()) && d <= '7'){ ! 258: c = c * 8 + (d-'0'); ! 259: if(!('0' <= peek && peek <= '7')) break; ! 260: } ! 261: break; ! 262: } ! 263: return(c); ! 264: } ! 265: lookup(s,t) ! 266: char *s; ! 267: char **t; { ! 268: register int i; ! 269: i = 0; ! 270: while(*t){ ! 271: if(scomp(s,*t) == 0) ! 272: return(i); ! 273: i++; ! 274: t++; ! 275: } ! 276: return(-1); ! 277: } ! 278: cpyact(){ /* copy C action to the next ; or closing } */ ! 279: register int brac, c, mth; ! 280: int savline, sw; ! 281: ! 282: brac = 0; ! 283: sw = TRUE; ! 284: ! 285: while(!eof){ ! 286: c = gch(); ! 287: swt: ! 288: switch( c ){ ! 289: ! 290: case '|': if(brac == 0 && sw == TRUE){ ! 291: if(peek == '|')gch(); /* eat up an extra '|' */ ! 292: return(0); ! 293: } ! 294: break; ! 295: ! 296: case ';': ! 297: if( brac == 0 ){ ! 298: putc(c,fout); ! 299: putc('\n',fout); ! 300: return(1); ! 301: } ! 302: break; ! 303: ! 304: case '{': ! 305: brac++; ! 306: savline=yyline; ! 307: break; ! 308: ! 309: case '}': ! 310: brac--; ! 311: if( brac == 0 ){ ! 312: putc(c,fout); ! 313: putc('\n',fout); ! 314: return(1); ! 315: } ! 316: break; ! 317: ! 318: case '/': /* look for comments */ ! 319: putc(c,fout); ! 320: c = gch(); ! 321: if( c != '*' ) goto swt; ! 322: ! 323: /* it really is a comment */ ! 324: ! 325: putc(c,fout); ! 326: savline=yyline; ! 327: while( c=gch() ){ ! 328: if( c=='*' ){ ! 329: putc(c,fout); ! 330: if( (c=gch()) == '/' ) goto loop; ! 331: } ! 332: putc(c,fout); ! 333: } ! 334: yyline=savline; ! 335: error( "EOF inside comment" ); ! 336: ! 337: case '\'': /* character constant */ ! 338: mth = '\''; ! 339: goto string; ! 340: ! 341: case '"': /* character string */ ! 342: mth = '"'; ! 343: ! 344: string: ! 345: ! 346: putc(c,fout); ! 347: while( c=gch() ){ ! 348: if( c=='\\' ){ ! 349: putc(c,fout); ! 350: c=gch(); ! 351: } ! 352: else if( c==mth ) goto loop; ! 353: putc(c,fout); ! 354: if (c == '\n') ! 355: { ! 356: yyline--; ! 357: error( "Non-terminated string or character constant"); ! 358: } ! 359: } ! 360: error( "EOF in string or character constant" ); ! 361: ! 362: case '\0': ! 363: yyline = savline; ! 364: error("Action does not terminate"); ! 365: default: ! 366: break; /* usual character */ ! 367: } ! 368: loop: ! 369: if(c != ' ' && c != '\t' && c != '\n') sw = FALSE; ! 370: putc(c,fout); ! 371: } ! 372: error("Premature EOF"); ! 373: } ! 374: gch(){ ! 375: register int c; ! 376: prev = pres; ! 377: c = pres = peek; ! 378: peek = pushptr > pushc ? *--pushptr : getc(fin); ! 379: if(peek == EOF && sargc > 1){ ! 380: fclose(fin); ! 381: fin = fopen(sargv[++fptr],"r"); ! 382: infile = sargv[fptr]; ! 383: if(fin == NULL) ! 384: error("Cannot open file %s",sargv[fptr]); ! 385: peek = getc(fin); ! 386: sargc--; ! 387: sargv++; ! 388: } ! 389: if(c == EOF) { ! 390: eof = TRUE; ! 391: fclose(fin); ! 392: return(0); ! 393: } ! 394: if(c == '\n')yyline++; ! 395: return(c); ! 396: } ! 397: mn2(a,d,c) ! 398: int a,d,c; ! 399: { ! 400: name[tptr] = a; ! 401: left[tptr] = d; ! 402: right[tptr] = c; ! 403: parent[tptr] = 0; ! 404: nullstr[tptr] = 0; ! 405: switch(a){ ! 406: case RSTR: ! 407: parent[d] = tptr; ! 408: break; ! 409: case BAR: ! 410: case RNEWE: ! 411: if(nullstr[d] || nullstr[c]) nullstr[tptr] = TRUE; ! 412: parent[d] = parent[c] = tptr; ! 413: break; ! 414: case RCAT: ! 415: case DIV: ! 416: if(nullstr[d] && nullstr[c])nullstr[tptr] = TRUE; ! 417: parent[d] = parent[c] = tptr; ! 418: break; ! 419: case RSCON: ! 420: parent[d] = tptr; ! 421: nullstr[tptr] = nullstr[d]; ! 422: break; ! 423: # ifdef DEBUG ! 424: default: ! 425: warning("bad switch mn2 %d %d",a,d); ! 426: break; ! 427: # endif ! 428: } ! 429: if(tptr > treesize) ! 430: error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":"")); ! 431: return(tptr++); ! 432: } ! 433: mn1(a,d) ! 434: int a,d; ! 435: { ! 436: name[tptr] = a; ! 437: left[tptr] = d; ! 438: parent[tptr] = 0; ! 439: nullstr[tptr] = 0; ! 440: switch(a){ ! 441: case RCCL: ! 442: case RNCCL: ! 443: if(slength(d) == 0) nullstr[tptr] = TRUE; ! 444: break; ! 445: case STAR: ! 446: case QUEST: ! 447: nullstr[tptr] = TRUE; ! 448: parent[d] = tptr; ! 449: break; ! 450: case PLUS: ! 451: case CARAT: ! 452: nullstr[tptr] = nullstr[d]; ! 453: parent[d] = tptr; ! 454: break; ! 455: case S2FINAL: ! 456: nullstr[tptr] = TRUE; ! 457: break; ! 458: # ifdef DEBUG ! 459: case FINAL: ! 460: case S1FINAL: ! 461: break; ! 462: default: ! 463: warning("bad switch mn1 %d %d",a,d); ! 464: break; ! 465: # endif ! 466: } ! 467: if(tptr > treesize) ! 468: error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":"")); ! 469: return(tptr++); ! 470: } ! 471: mn0(a) ! 472: int a; ! 473: { ! 474: name[tptr] = a; ! 475: parent[tptr] = 0; ! 476: nullstr[tptr] = 0; ! 477: if(a >= NCH) switch(a){ ! 478: case RNULLS: nullstr[tptr] = TRUE; break; ! 479: # ifdef DEBUG ! 480: default: ! 481: warning("bad switch mn0 %d",a); ! 482: break; ! 483: # endif ! 484: } ! 485: if(tptr > treesize) ! 486: error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":"")); ! 487: return(tptr++); ! 488: } ! 489: munput(t,p) /* implementation dependent */ ! 490: char *p; ! 491: int t; { ! 492: register int i,j; ! 493: if(t == 'c'){ ! 494: *pushptr++ = peek; /* watch out for this */ ! 495: peek = (int)p; ! 496: } ! 497: else if(t == 's'){ ! 498: *pushptr++ = peek; ! 499: peek = p[0]; ! 500: i = slength(p); ! 501: for(j = i-1; j>=1; j--) ! 502: *pushptr++ = p[j]; ! 503: } ! 504: # ifdef DEBUG ! 505: else error("Unrecognized munput option %c",t); ! 506: # endif ! 507: if(pushptr >= pushc+TOKENSIZE) ! 508: error("Too many characters pushed"); ! 509: return; ! 510: } ! 511: ! 512: dupl(n) ! 513: int n; { ! 514: /* duplicate the subtree whose root is n, return ptr to it */ ! 515: register int i; ! 516: i = name[n]; ! 517: if(i < NCH) return(mn0(i)); ! 518: switch(i){ ! 519: case RNULLS: ! 520: return(mn0(i)); ! 521: case RCCL: case RNCCL: case FINAL: case S1FINAL: case S2FINAL: ! 522: return(mn1(i,left[n])); ! 523: case STAR: case QUEST: case PLUS: case CARAT: ! 524: return(mn1(i,dupl(left[n]))); ! 525: case RSTR: case RSCON: ! 526: return(mn2(i,dupl(left[n]),right[n])); ! 527: case BAR: case RNEWE: case RCAT: case DIV: ! 528: return(mn2(i,dupl(left[n]),dupl(right[n]))); ! 529: # ifdef DEBUG ! 530: default: ! 531: warning("bad switch dupl %d",n); ! 532: # endif ! 533: } ! 534: return(0); ! 535: } ! 536: # ifdef DEBUG ! 537: allprint(c) ! 538: char c; { ! 539: switch(c){ ! 540: case 014: ! 541: printf("\\f"); ! 542: charc++; ! 543: break; ! 544: case '\n': ! 545: printf("\\n"); ! 546: charc++; ! 547: break; ! 548: case '\t': ! 549: printf("\\t"); ! 550: charc++; ! 551: break; ! 552: case '\b': ! 553: printf("\\b"); ! 554: charc++; ! 555: break; ! 556: case ' ': ! 557: printf("\\\bb"); ! 558: break; ! 559: default: ! 560: if(!printable(c)){ ! 561: printf("\\%-3o",c); ! 562: charc += 3; ! 563: } ! 564: else ! 565: putchar(c); ! 566: break; ! 567: } ! 568: charc++; ! 569: return; ! 570: } ! 571: strpt(s) ! 572: char *s; { ! 573: charc = 0; ! 574: while(*s){ ! 575: allprint(*s++); ! 576: if(charc > LINESIZE){ ! 577: charc = 0; ! 578: printf("\n\t"); ! 579: } ! 580: } ! 581: return; ! 582: } ! 583: sect1dump(){ ! 584: register int i; ! 585: printf("Sect 1:\n"); ! 586: if(def[0]){ ! 587: printf("str trans\n"); ! 588: i = -1; ! 589: while(def[++i]) ! 590: printf("%s\t%s\n",def[i],subs[i]); ! 591: } ! 592: if(sname[0]){ ! 593: printf("start names\n"); ! 594: i = -1; ! 595: while(sname[++i]) ! 596: printf("%s\n",sname[i]); ! 597: } ! 598: if(chset == TRUE){ ! 599: printf("char set changed\n"); ! 600: for(i=1;i<NCH;i++){ ! 601: if(i != ctable[i]){ ! 602: allprint(i); ! 603: putchar(' '); ! 604: printable(ctable[i]) ? putchar(ctable[i]) : printf("%d",ctable[i]); ! 605: putchar('\n'); ! 606: } ! 607: } ! 608: } ! 609: } ! 610: sect2dump(){ ! 611: printf("Sect 2:\n"); ! 612: treedump(); ! 613: } ! 614: treedump() ! 615: { ! 616: register int t; ! 617: register char *p; ! 618: printf("treedump %d nodes:\n",tptr); ! 619: for(t=0;t<tptr;t++){ ! 620: printf("%4d ",t); ! 621: parent[t] ? printf("p=%4d",parent[t]) : printf(" "); ! 622: printf(" "); ! 623: if(name[t] < NCH) { ! 624: allprint(name[t]); ! 625: } ! 626: else switch(name[t]){ ! 627: case RSTR: ! 628: printf("%d ",left[t]); ! 629: allprint(right[t]); ! 630: break; ! 631: case RCCL: ! 632: printf("ccl "); ! 633: strpt(left[t]); ! 634: break; ! 635: case RNCCL: ! 636: printf("nccl "); ! 637: strpt(left[t]); ! 638: break; ! 639: case DIV: ! 640: printf("/ %d %d",left[t],right[t]); ! 641: break; ! 642: case BAR: ! 643: printf("| %d %d",left[t],right[t]); ! 644: break; ! 645: case RCAT: ! 646: printf("cat %d %d",left[t],right[t]); ! 647: break; ! 648: case PLUS: ! 649: printf("+ %d",left[t]); ! 650: break; ! 651: case STAR: ! 652: printf("* %d",left[t]); ! 653: break; ! 654: case CARAT: ! 655: printf("^ %d",left[t]); ! 656: break; ! 657: case QUEST: ! 658: printf("? %d",left[t]); ! 659: break; ! 660: case RNULLS: ! 661: printf("nullstring"); ! 662: break; ! 663: case FINAL: ! 664: printf("final %d",left[t]); ! 665: break; ! 666: case S1FINAL: ! 667: printf("s1final %d",left[t]); ! 668: break; ! 669: case S2FINAL: ! 670: printf("s2final %d",left[t]); ! 671: break; ! 672: case RNEWE: ! 673: printf("new %d %d",left[t],right[t]); ! 674: break; ! 675: case RSCON: ! 676: p = (char *)right[t]; ! 677: printf("start %s",sname[*p++-1]); ! 678: while(*p) ! 679: printf(", %s",sname[*p++-1]); ! 680: printf(" %d",left[t]); ! 681: break; ! 682: default: ! 683: printf("unknown %d %d %d",name[t],left[t],right[t]); ! 684: break; ! 685: } ! 686: if(nullstr[t])printf("\t(null poss.)"); ! 687: putchar('\n'); ! 688: } ! 689: } ! 690: # endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.