|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)sub1.c 4.2 (Berkeley) 2/21/85"; ! 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: fprintf(errorf,"\"%s\", line %d: (Error) ", ! 41: fptr > 0 ? sargv[fptr] : "<stdin>", yyline); ! 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: fprintf(errorf,"\"%s\", line %d: (Warning) ", ! 61: fptr > 0 ? sargv[fptr] : "<stdin>", yyline); ! 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: static int hadeof; ! 375: ! 376: if (hadeof) { ! 377: hadeof = 0; ! 378: yyline = 0; ! 379: } ! 380: prev = pres; ! 381: c = pres = peek; ! 382: peek = pushptr > pushc ? *--pushptr : getc(fin); ! 383: if(peek == EOF && sargc > 1){ ! 384: hadeof = 1; ! 385: fclose(fin); ! 386: fin = fopen(sargv[++fptr],"r"); ! 387: if(fin == NULL) { ! 388: yyline = 0; ! 389: error("Cannot open file %s",sargv[fptr]); ! 390: } ! 391: peek = getc(fin); ! 392: sargc--; ! 393: } ! 394: if(c == EOF) { ! 395: eof = TRUE; ! 396: fclose(fin); ! 397: return(0); ! 398: } ! 399: if(c == '\n')yyline++; ! 400: return(c); ! 401: } ! 402: mn2(a,d,c) ! 403: int a,d,c; ! 404: { ! 405: name[tptr] = a; ! 406: left[tptr] = d; ! 407: right[tptr] = c; ! 408: parent[tptr] = 0; ! 409: nullstr[tptr] = 0; ! 410: switch(a){ ! 411: case RSTR: ! 412: parent[d] = tptr; ! 413: break; ! 414: case BAR: ! 415: case RNEWE: ! 416: if(nullstr[d] || nullstr[c]) nullstr[tptr] = TRUE; ! 417: parent[d] = parent[c] = tptr; ! 418: break; ! 419: case RCAT: ! 420: case DIV: ! 421: if(nullstr[d] && nullstr[c])nullstr[tptr] = TRUE; ! 422: parent[d] = parent[c] = tptr; ! 423: break; ! 424: case RSCON: ! 425: parent[d] = tptr; ! 426: nullstr[tptr] = nullstr[d]; ! 427: break; ! 428: # ifdef DEBUG ! 429: default: ! 430: warning("bad switch mn2 %d %d",a,d); ! 431: break; ! 432: # endif ! 433: } ! 434: if(tptr > treesize) ! 435: error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":"")); ! 436: return(tptr++); ! 437: } ! 438: mn1(a,d) ! 439: int a,d; ! 440: { ! 441: name[tptr] = a; ! 442: left[tptr] = d; ! 443: parent[tptr] = 0; ! 444: nullstr[tptr] = 0; ! 445: switch(a){ ! 446: case RCCL: ! 447: case RNCCL: ! 448: if(slength(d) == 0) nullstr[tptr] = TRUE; ! 449: break; ! 450: case STAR: ! 451: case QUEST: ! 452: nullstr[tptr] = TRUE; ! 453: parent[d] = tptr; ! 454: break; ! 455: case PLUS: ! 456: case CARAT: ! 457: nullstr[tptr] = nullstr[d]; ! 458: parent[d] = tptr; ! 459: break; ! 460: case S2FINAL: ! 461: nullstr[tptr] = TRUE; ! 462: break; ! 463: # ifdef DEBUG ! 464: case FINAL: ! 465: case S1FINAL: ! 466: break; ! 467: default: ! 468: warning("bad switch mn1 %d %d",a,d); ! 469: break; ! 470: # endif ! 471: } ! 472: if(tptr > treesize) ! 473: error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":"")); ! 474: return(tptr++); ! 475: } ! 476: mn0(a) ! 477: int a; ! 478: { ! 479: name[tptr] = a; ! 480: parent[tptr] = 0; ! 481: nullstr[tptr] = 0; ! 482: if(a >= NCH) switch(a){ ! 483: case RNULLS: nullstr[tptr] = TRUE; break; ! 484: # ifdef DEBUG ! 485: default: ! 486: warning("bad switch mn0 %d",a); ! 487: break; ! 488: # endif ! 489: } ! 490: if(tptr > treesize) ! 491: error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":"")); ! 492: return(tptr++); ! 493: } ! 494: munput(t,p) /* implementation dependent */ ! 495: char *p; ! 496: int t; { ! 497: register int i,j; ! 498: if(t == 'c'){ ! 499: *pushptr++ = peek; /* watch out for this */ ! 500: peek = p; ! 501: } ! 502: else if(t == 's'){ ! 503: *pushptr++ = peek; ! 504: peek = p[0]; ! 505: i = slength(p); ! 506: for(j = i-1; j>=1; j--) ! 507: *pushptr++ = p[j]; ! 508: } ! 509: # ifdef DEBUG ! 510: else error("Unrecognized munput option %c",t); ! 511: # endif ! 512: if(pushptr >= pushc+TOKENSIZE) ! 513: error("Too many characters pushed"); ! 514: return; ! 515: } ! 516: ! 517: dupl(n) ! 518: int n; { ! 519: /* duplicate the subtree whose root is n, return ptr to it */ ! 520: register int i; ! 521: i = name[n]; ! 522: if(i < NCH) return(mn0(i)); ! 523: switch(i){ ! 524: case RNULLS: ! 525: return(mn0(i)); ! 526: case RCCL: case RNCCL: case FINAL: case S1FINAL: case S2FINAL: ! 527: return(mn1(i,left[n])); ! 528: case STAR: case QUEST: case PLUS: case CARAT: ! 529: return(mn1(i,dupl(left[n]))); ! 530: case RSTR: case RSCON: ! 531: return(mn2(i,dupl(left[n]),right[n])); ! 532: case BAR: case RNEWE: case RCAT: case DIV: ! 533: return(mn2(i,dupl(left[n]),dupl(right[n]))); ! 534: # ifdef DEBUG ! 535: default: ! 536: warning("bad switch dupl %d",n); ! 537: # endif ! 538: } ! 539: return(0); ! 540: } ! 541: # ifdef DEBUG ! 542: allprint(c) ! 543: char c; { ! 544: switch(c){ ! 545: case 014: ! 546: printf("\\f"); ! 547: charc++; ! 548: break; ! 549: case '\n': ! 550: printf("\\n"); ! 551: charc++; ! 552: break; ! 553: case '\t': ! 554: printf("\\t"); ! 555: charc++; ! 556: break; ! 557: case '\b': ! 558: printf("\\b"); ! 559: charc++; ! 560: break; ! 561: case ' ': ! 562: printf("\\\bb"); ! 563: break; ! 564: default: ! 565: if(!printable(c)){ ! 566: printf("\\%-3o",c); ! 567: charc =+ 3; ! 568: } ! 569: else ! 570: putchar(c); ! 571: break; ! 572: } ! 573: charc++; ! 574: return; ! 575: } ! 576: strpt(s) ! 577: char *s; { ! 578: charc = 0; ! 579: while(*s){ ! 580: allprint(*s++); ! 581: if(charc > LINESIZE){ ! 582: charc = 0; ! 583: printf("\n\t"); ! 584: } ! 585: } ! 586: return; ! 587: } ! 588: sect1dump(){ ! 589: register int i; ! 590: printf("Sect 1:\n"); ! 591: if(def[0]){ ! 592: printf("str trans\n"); ! 593: i = -1; ! 594: while(def[++i]) ! 595: printf("%s\t%s\n",def[i],subs[i]); ! 596: } ! 597: if(sname[0]){ ! 598: printf("start names\n"); ! 599: i = -1; ! 600: while(sname[++i]) ! 601: printf("%s\n",sname[i]); ! 602: } ! 603: if(chset == TRUE){ ! 604: printf("char set changed\n"); ! 605: for(i=1;i<NCH;i++){ ! 606: if(i != ctable[i]){ ! 607: allprint(i); ! 608: putchar(' '); ! 609: printable(ctable[i]) ? putchar(ctable[i]) : printf("%d",ctable[i]); ! 610: putchar('\n'); ! 611: } ! 612: } ! 613: } ! 614: } ! 615: sect2dump(){ ! 616: printf("Sect 2:\n"); ! 617: treedump(); ! 618: } ! 619: treedump() ! 620: { ! 621: register int t; ! 622: register char *p; ! 623: printf("treedump %d nodes:\n",tptr); ! 624: for(t=0;t<tptr;t++){ ! 625: printf("%4d ",t); ! 626: parent[t] ? printf("p=%4d",parent[t]) : printf(" "); ! 627: printf(" "); ! 628: if(name[t] < NCH) { ! 629: allprint(name[t]); ! 630: } ! 631: else switch(name[t]){ ! 632: case RSTR: ! 633: printf("%d ",left[t]); ! 634: allprint(right[t]); ! 635: break; ! 636: case RCCL: ! 637: printf("ccl "); ! 638: strpt(left[t]); ! 639: break; ! 640: case RNCCL: ! 641: printf("nccl "); ! 642: strpt(left[t]); ! 643: break; ! 644: case DIV: ! 645: printf("/ %d %d",left[t],right[t]); ! 646: break; ! 647: case BAR: ! 648: printf("| %d %d",left[t],right[t]); ! 649: break; ! 650: case RCAT: ! 651: printf("cat %d %d",left[t],right[t]); ! 652: break; ! 653: case PLUS: ! 654: printf("+ %d",left[t]); ! 655: break; ! 656: case STAR: ! 657: printf("* %d",left[t]); ! 658: break; ! 659: case CARAT: ! 660: printf("^ %d",left[t]); ! 661: break; ! 662: case QUEST: ! 663: printf("? %d",left[t]); ! 664: break; ! 665: case RNULLS: ! 666: printf("nullstring"); ! 667: break; ! 668: case FINAL: ! 669: printf("final %d",left[t]); ! 670: break; ! 671: case S1FINAL: ! 672: printf("s1final %d",left[t]); ! 673: break; ! 674: case S2FINAL: ! 675: printf("s2final %d",left[t]); ! 676: break; ! 677: case RNEWE: ! 678: printf("new %d %d",left[t],right[t]); ! 679: break; ! 680: case RSCON: ! 681: p = right[t]; ! 682: printf("start %s",sname[*p++-1]); ! 683: while(*p) ! 684: printf(", %s",sname[*p++-1]); ! 685: printf(" %d",left[t]); ! 686: break; ! 687: default: ! 688: printf("unknown %d %d %d",name[t],left[t],right[t]); ! 689: break; ! 690: } ! 691: if(nullstr[t])printf("\t(null poss.)"); ! 692: putchar('\n'); ! 693: } ! 694: } ! 695: # endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.