static char sccsid
[] = "@(#)sub1.c 4.2 (Berkeley) %G%";
getl(p
) /* return next line of input, throw away trailing '\n' */
/* returns 0 if eof is had immediately */
while(((c
= gch()) != 0) && c
!= '\n')
if(c
== 0 && s
== t
) return(0);
return(c
>='0' && c
<= '9');
fprintf(errorf
,"\"%s\", line %d: (Error) ",
fptr
> 0 ? sargv
[fptr
] : "<stdin>", yyline
);
if(debug
&& sect
!= ENDSECTION
) {
report
== 1) statistics();
exit(1); /* error return code */
fprintf(errorf
,"\"%s\", line %d: (Warning) ",
fptr
> 0 ? sargv
[fptr
] : "<stdin>", yyline
);
return('a' <= c
&& c
<= 'z' || 'A' <= c
&& c
<= 'Z');
return(index(c
,"abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") >= 0);
return( c
>040 && c
< 0177);
return(index(c
, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:><+*)('&%!-=\"")>=0);
sprintf(fname
, "lex.yy.%c", ratfor
? 'r' : 'c' );
fout
= fopen(fname
, "w");
if(fout
== NULL
) error("Can't open %s",fname
);
if(ratfor
) fprintf( fout
, "#\n");
/* scopy(ptr to str, ptr to str) - copy first arg str to second */
/* returns ptr to second arg */
siconv(t
) /* convert string t, return integer value */
while(!(('0' <= *s
&& *s
<= '9') || *s
== '-') && *s
) s
++;
while('0' <= *s
&& *s
<= '9')
i
= i
* 10 + (*(s
++)-'0');
/* slength(ptr to str) - return integer length of string arg */
/* excludes '\0' terminator */
/* scomp(x,y) - return -1 if x < y,
return 1 if x > y, all lexicographically */
case 'n': c
= '\n'; break;
case 't': c
= '\t'; break;
case 'r': c
= '\r'; break;
case 'b': c
= '\b'; break;
case 'f': c
= 014; break; /* form feed for ascii */
case '\\': c
= '\\'; break;
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
while ((k
= *(*ss
+1)) >= '0' && k
<= '7')
symbol
[i
] ^= 1; /* reverse value */
/* see if ccl is already in our table */
if((symbol
[j
] && cindex
[j
] != i
) ||
(!symbol
[j
] && cindex
[j
] == i
)) break;
if(j
>= NCH
) return; /* already in */
/* m == 1 implies last value of ccount has been used */
if(k
== 0) return; /* is now in as ccount wholly */
/* intersection must be computed */
j
= cindex
[i
]; /* will be non-zero */
if(symbol
[k
]) symbol
[k
] = 0;
case 'n': c
= '\n'; break;
case 'r': c
= '\r'; break;
case 't': c
= '\t'; break;
case 'b': c
= '\b'; break;
case 'f': c
= 014; break; /* form feed for ascii */
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
while('0' <= (d
=gch()) && d
<= '7'){
if(!('0' <= peek
&& peek
<= '7')) break;
cpyact(){ /* copy C action to the next ; or closing } */
register int brac
, c
, mth
;
case '|': if(brac
== 0 && sw
== TRUE
){
if(peek
== '|')gch(); /* eat up an extra '|' */
case '/': /* look for comments */
/* it really is a comment */
if( (c
=gch()) == '/' ) goto loop
;
error( "EOF inside comment" );
case '\'': /* character constant */
case '"': /* character string */
else if( c
==mth
) goto loop
;
error( "Non-terminated string or character constant");
error( "EOF in string or character constant" );
error("Action does not terminate");
break; /* usual character */
if(c
!= ' ' && c
!= '\t' && c
!= '\n') sw
= FALSE
;
peek
= pushptr
> pushc
? *--pushptr
: getc(fin
);
if(peek
== EOF
&& sargc
> 1){
fin
= fopen(sargv
[++fptr
],"r");
error("Cannot open file %s",sargv
[fptr
]);
if(nullstr
[d
] || nullstr
[c
]) nullstr
[tptr
] = TRUE
;
parent
[d
] = parent
[c
] = tptr
;
if(nullstr
[d
] && nullstr
[c
])nullstr
[tptr
] = TRUE
;
parent
[d
] = parent
[c
] = tptr
;
nullstr
[tptr
] = nullstr
[d
];
warning("bad switch mn2 %d %d",a
,d
);
error("Parse tree too big %s",(treesize
== TREESIZE
?"\nTry using %e num":""));
if(slength(d
) == 0) nullstr
[tptr
] = TRUE
;
nullstr
[tptr
] = nullstr
[d
];
warning("bad switch mn1 %d %d",a
,d
);
error("Parse tree too big %s",(treesize
== TREESIZE
?"\nTry using %e num":""));
case RNULLS
: nullstr
[tptr
] = TRUE
; break;
warning("bad switch mn0 %d",a
);
error("Parse tree too big %s",(treesize
== TREESIZE
?"\nTry using %e num":""));
munput(t
,p
) /* implementation dependent */
*pushptr
++ = peek
; /* watch out for this */
else error("Unrecognized munput option %c",t
);
if(pushptr
>= pushc
+TOKENSIZE
)
error("Too many characters pushed");
/* duplicate the subtree whose root is n, return ptr to it */
if(i
< NCH
) return(mn0(i
));
case RCCL
: case RNCCL
: case FINAL
: case S1FINAL
: case S2FINAL
:
case STAR
: case QUEST
: case PLUS
: case CARAT
:
return(mn1(i
,dupl(left
[n
])));
return(mn2(i
,dupl(left
[n
]),right
[n
]));
case BAR
: case RNEWE
: case RCAT
: case DIV
:
return(mn2(i
,dupl(left
[n
]),dupl(right
[n
])));
warning("bad switch dupl %d",n
);
printf("%s\t%s\n",def
[i
],subs
[i
]);
printf("char set changed\n");
printable(ctable
[i
]) ? putchar(ctable
[i
]) : printf("%d",ctable
[i
]);
printf("treedump %d nodes:\n",tptr
);
parent
[t
] ? printf("p=%4d",parent
[t
]) : printf(" ");
printf("/ %d %d",left
[t
],right
[t
]);
printf("| %d %d",left
[t
],right
[t
]);
printf("cat %d %d",left
[t
],right
[t
]);
printf("final %d",left
[t
]);
printf("s1final %d",left
[t
]);
printf("s2final %d",left
[t
]);
printf("new %d %d",left
[t
],right
[t
]);
printf("start %s",sname
[*p
++-1]);
printf(", %s",sname
[*p
++-1]);
printf("unknown %d %d %d",name
[t
],left
[t
],right
[t
]);
if(nullstr
[t
])printf("\t(null poss.)");