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