|
|
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.