4.3BSD-UWisc/src/usr.bin/bc/y.tab.c
# line 2 "bc.y"
static char *sccsid = "@(#)bc.y 4.3 (Berkeley) 85/11/28";
int *getout();
# define UMINUS 257
# define LETTER 258
# define DIGIT 259
# define SQRT 260
# define LENGTH 261
# define _IF 262
# define FFF 263
# define EQ 264
# define _WHILE 265
# define _FOR 266
# define NE 267
# define LE 268
# define GE 269
# define INCR 270
# define DECR 271
# define _RETURN 272
# define _BREAK 273
# define _DEFINE 274
# define BASE 275
# define OBASE 276
# define SCALE 277
# define EQPL 278
# define EQMI 279
# define EQMUL 280
# define EQDIV 281
# define EQREM 282
# define EQEXP 283
# define _AUTO 284
# define DOT 285
# define QSTR 286
# line 19 "bc.y"
#include <stdio.h>
int in;
char cary[1000], *cp = { cary };
char string[1000], *str = {string};
int crs = '0';
int rcrs = '0'; /* reset crs */
int bindx = 0;
int lev = 0;
int ln;
char *ss;
int bstack[10] = { 0 };
char *numb[15] = {
" 0", " 1", " 2", " 3", " 4", " 5",
" 6", " 7", " 8", " 9", " 10", " 11",
" 12", " 13", " 14" };
int *pre, *post;
#define yyclearin yychar = -1
#define yyerrok yyerrflag = 0
extern int yychar;
extern short yyerrflag;
#ifndef YYMAXDEPTH
#define YYMAXDEPTH 150
#endif
#ifndef YYSTYPE
#define YYSTYPE int
#endif
YYSTYPE yylval, yyval;
# define YYERRCODE 256
# line 328 "bc.y"
# define error 256
int peekc = -1;
int sargc;
int ifile;
char **sargv;
char funtab[52] = {
01,0,02,0,03,0,04,0,05,0,06,0,07,0,010,0,011,0,012,0,013,0,014,0,015,0,016,0,017,0,
020,0,021,0,022,0,023,0,024,0,025,0,026,0,027,0,030,0,031,0,032,0 };
char atab[52] = {
0241,0,0242,0,0243,0,0244,0,0245,0,0246,0,0247,0,0250,0,0251,0,0252,0,0253,0,
0254,0,0255,0,0256,0,0257,0,0260,0,0261,0,0262,0,0263,0,0264,0,0265,0,0266,0,
0267,0,0270,0,0271,0,0272,0};
char *letr[26] = {
"a","b","c","d","e","f","g","h","i","j",
"k","l","m","n","o","p","q","r","s","t",
"u","v","w","x","y","z" } ;
char *dot = { "." };
yylex(){
int c, ch;
restart:
c = getch();
peekc = -1;
while( c == ' ' || c == '\t' ) c = getch();
if(c == '\\'){
getch();
goto restart;
}
if( c<= 'z' && c >= 'a' ) {
/* look ahead to look for reserved words */
peekc = getch();
if( peekc >= 'a' && peekc <= 'z' ){ /* must be reserved word */
if( c=='i' && peekc=='f' ){ c=_IF; goto skip; }
if( c=='w' && peekc=='h' ){ c=_WHILE; goto skip; }
if( c=='f' && peekc=='o' ){ c=_FOR; goto skip; }
if( c=='s' && peekc=='q' ){ c=SQRT; goto skip; }
if( c=='r' && peekc=='e' ){ c=_RETURN; goto skip; }
if( c=='b' && peekc=='r' ){ c=_BREAK; goto skip; }
if( c=='d' && peekc=='e' ){ c=_DEFINE; goto skip; }
if( c=='s' && peekc=='c' ){ c= SCALE; goto skip; }
if( c=='b' && peekc=='a' ){ c=BASE; goto skip; }
if( c=='i' && peekc == 'b'){ c=BASE; goto skip; }
if( c=='o' && peekc=='b' ){ c=OBASE; goto skip; }
if( c=='d' && peekc=='i' ){ c=FFF; goto skip; }
if( c=='a' && peekc=='u' ){ c=_AUTO; goto skip; }
if( c == 'l' && peekc=='e'){ c=LENGTH; goto skip; }
if( c == 'q' && peekc == 'u'){getout();}
/* could not be found */
return( error );
skip: /* skip over rest of word */
peekc = -1;
while( (ch = getch()) >= 'a' && ch <= 'z' );
peekc = ch;
return( c );
}
/* usual case; just one single letter */
yylval = letr[c-'a'];
return( LETTER );
}
if( c>= '0' && c <= '9' || c>= 'A' && c<= 'F' ){
yylval = c;
return( DIGIT );
}
switch( c ){
case '.': return( DOT );
case '=':
switch( peekc = getch() ){
case '=': c=EQ; goto gotit;
case '+': c=EQPL; goto gotit;
case '-': c=EQMI; goto gotit;
case '*': c=EQMUL; goto gotit;
case '/': c=EQDIV; goto gotit;
case '%': c=EQREM; goto gotit;
case '^': c=EQEXP; goto gotit;
default: return( '=' );
gotit: peekc = -1; return(c);
}
case '+': return( cpeek( '+', INCR, cpeek( '=', EQPL, '+') ) );
case '-': return( cpeek( '-', DECR, cpeek( '=', EQMI, '-') ) );
case '<': return( cpeek( '=', LE, '<' ) );
case '>': return( cpeek( '=', GE, '>' ) );
case '!': return( cpeek( '=', NE, '!' ) );
case '/':
if((peekc = getch()) == '*'){
peekc = -1;
while((getch() != '*') || ((peekc = getch()) != '/'));
peekc = -1;
goto restart;
}
else if (peekc == '=') {
c=EQDIV;
goto gotit;
}
else return(c);
case '*':
return( cpeek( '=', EQMUL, '*' ) );
case '%':
return( cpeek( '=', EQREM, '%' ) );
case '^':
return( cpeek( '=', EQEXP, '^' ) );
case '"':
yylval = str;
while((c=getch()) != '"'){*str++ = c;
if(str >= &string[999]){yyerror("string space exceeded");
getout();
}
}
*str++ = '\0';
return(QSTR);
default: return( c );
}
}
cpeek( c, yes, no ){
if( (peekc=getch()) != c ) return( no );
else {
peekc = -1;
return( yes );
}
}
getch(){
int ch;
loop:
ch = (peekc < 0) ? getc(in) : peekc;
peekc = -1;
if(ch != EOF)return(ch);
if(++ifile > sargc){
if(ifile >= sargc+2)getout();
in = stdin;
ln = 0;
goto loop;
}
fclose(in);
if((in = fopen(sargv[ifile],"r")) != NULL){
ln = 0;
ss = sargv[ifile];
goto loop;
}
yyerror("cannot open input file");
}
# define b_sp_max 3000
int b_space [ b_sp_max ];
int * b_sp_nxt = { b_space };
int bdebug = 0;
bundle(a){
int i, *p, *q;
p = &a;
i = *p++;
q = b_sp_nxt;
if( bdebug ) printf("bundle %d elements at %o\n",i, q );
while(i-- > 0){
if( b_sp_nxt >= & b_space[b_sp_max] ) yyerror( "bundling space exceeded" );
* b_sp_nxt++ = *p++;
}
* b_sp_nxt++ = 0;
yyval = q;
return( q );
}
routput(p) int *p; {
if( bdebug ) printf("routput(%o)\n", p );
if( p >= &b_space[0] && p < &b_space[b_sp_max]){
/* part of a bundle */
while( *p != 0 ) routput( *p++ );
}
else printf( p ); /* character string */
}
output( p ) int *p; {
routput( p );
b_sp_nxt = & b_space[0];
printf( "\n" );
fflush(stdout);
cp = cary;
crs = rcrs;
}
conout( p, s ) int *p; char *s; {
printf("[");
routput( p );
printf("]s%s\n", s );
fflush(stdout);
lev--;
}
yyerror( s ) char *s; {
if(ifile > sargc)ss="teletype";
printf("c[%s on line %d, %s]pc\n", s ,ln+1,ss);
fflush(stdout);
cp = cary;
crs = rcrs;
bindx = 0;
lev = 0;
b_sp_nxt = &b_space[0];
}
pp( s ) char *s; {
/* puts the relevant stuff on pre and post for the letter s */
bundle(3, "S", s, pre );
pre = yyval;
bundle(4, post, "L", s, "s." );
post = yyval;
}
tp( s ) char *s; { /* same as pp, but for temps */
bundle(3, "0S", s, pre );
pre = yyval;
bundle(4, post, "L", s, "s." );
post = yyval;
}
yyinit(argc,argv) int argc; char *argv[];{
signal( 2, (int(*)())1 ); /* ignore all interrupts */
sargv=argv;
sargc= -- argc;
if(sargc == 0)in=stdin;
else if((in = fopen(sargv[1],"r")) == NULL) {
yyerror("cannot open input file");
in = stdin;
}
ifile = 1;
ln = 0;
ss = sargv[1];
}
int *getout(){
printf("q");
fflush(stdout);
exit();
}
int *
getf(p) char *p;{
return(&funtab[2*(*p -0141)]);
}
int *
geta(p) char *p;{
return(&atab[2*(*p - 0141)]);
}
main(argc, argv)
char **argv;
{
int p[2];
if (argc > 1 && *argv[1] == '-') {
if((argv[1][1] == 'd')||(argv[1][1] == 'c')){
yyinit(--argc, ++argv);
yyparse();
exit();
}
if(argv[1][1] != 'l'){
printf("unrecognizable argument\n");
fflush(stdout);
exit();
}
argv[1] = "/usr/lib/lib.b";
}
pipe(p);
if (fork()==0) {
close(1);
dup(p[1]);
close(p[0]);
close(p[1]);
yyinit(argc, argv);
yyparse();
exit();
}
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
execl("/bin/dc", "dc", "-", 0);
execl("/usr/bin/dc", "dc", "-", 0);
}
short yyexca[] ={
-1, 1,
0, -1,
59, 7,
10, 7,
-2, 0,
};
# define YYNPROD 121
# define YYLAST 768
short yyact[]={
26, 92, 31, 98, 38, 20, 142, 88, 77, 76,
84, 43, 126, 71, 129, 33, 41, 39, 113, 40,
34, 42, 150, 27, 90, 91, 89, 86, 87, 85,
44, 34, 23, 26, 164, 152, 165, 43, 20, 144,
143, 210, 41, 39, 43, 40, 101, 42, 43, 41,
39, 131, 40, 41, 42, 31, 27, 93, 42, 208,
34, 162, 34, 193, 127, 160, 26, 37, 44, 35,
154, 20, 99, 155, 132, 100, 128, 97, 96, 94,
35, 57, 30, 12, 111, 73, 18, 26, 31, 27,
17, 214, 20, 184, 44, 36, 222, 3, 1, 0,
203, 44, 74, 75, 0, 44, 0, 26, 117, 35,
27, 35, 20, 0, 0, 0, 12, 0, 0, 18,
0, 31, 0, 0, 0, 145, 0, 26, 112, 0,
27, 43, 20, 0, 0, 213, 41, 39, 0, 40,
191, 42, 31, 161, 0, 72, 125, 2, 26, 12,
27, 0, 18, 20, 0, 0, 50, 0, 0, 0,
0, 0, 31, 185, 0, 0, 32, 0, 151, 0,
62, 27, 0, 83, 190, 192, 0, 134, 0, 0,
0, 0, 31, 0, 0, 26, 0, 202, 44, 0,
20, 136, 0, 83, 0, 0, 50, 0, 204, 0,
0, 0, 0, 31, 43, 0, 0, 156, 27, 41,
39, 0, 40, 83, 42, 0, 14, 134, 6, 32,
28, 25, 15, 13, 0, 16, 29, 221, 0, 50,
21, 22, 8, 7, 83, 10, 11, 9, 163, 0,
31, 166, 168, 167, 205, 24, 5, 133, 0, 14,
45, 6, 32, 28, 25, 15, 13, 0, 16, 29,
62, 44, 0, 21, 22, 8, 7, 19, 10, 11,
9, 83, 159, 215, 217, 211, 0, 0, 24, 5,
46, 58, 14, 223, 6, 32, 28, 25, 15, 13,
224, 16, 29, 0, 0, 186, 21, 22, 8, 7,
0, 10, 11, 9, 0, 79, 32, 28, 25, 140,
0, 24, 5, 0, 0, 138, 0, 21, 22, 0,
0, 0, 81, 82, 80, 79, 32, 28, 25, 67,
0, 0, 24, 0, 0, 63, 0, 21, 22, 209,
0, 0, 81, 82, 80, 115, 32, 28, 25, 0,
0, 0, 24, 0, 216, 0, 218, 21, 22, 0,
0, 0, 81, 82, 80, 0, 79, 32, 28, 25,
0, 0, 24, 0, 0, 0, 0, 0, 21, 22,
0, 0, 0, 81, 82, 80, 48, 49, 0, 0,
0, 0, 0, 24, 51, 52, 53, 54, 55, 56,
60, 61, 0, 115, 32, 28, 25, 0, 51, 52,
53, 54, 55, 56, 0, 21, 22, 0, 0, 0,
81, 82, 80, 43, 0, 0, 48, 49, 41, 39,
24, 40, 0, 42, 51, 52, 53, 54, 55, 56,
135, 0, 0, 0, 0, 0, 0, 47, 0, 0,
59, 64, 68, 0, 0, 0, 0, 0, 0, 48,
49, 0, 0, 0, 0, 0, 0, 51, 52, 53,
54, 55, 56, 0, 0, 0, 0, 0, 0, 201,
44, 0, 0, 0, 188, 189, 0, 0, 0, 0,
60, 61, 51, 52, 53, 54, 55, 56, 51, 52,
53, 54, 55, 56, 188, 189, 0, 0, 0, 0,
0, 0, 51, 52, 53, 54, 55, 56, 69, 70,
0, 137, 139, 141, 65, 66, 51, 52, 53, 54,
55, 56, 51, 52, 53, 54, 55, 56, 69, 70,
4, 0, 0, 0, 65, 66, 51, 52, 53, 54,
55, 56, 51, 52, 53, 54, 55, 56, 0, 0,
0, 78, 0, 0, 0, 0, 0, 95, 43, 0,
0, 0, 0, 41, 39, 0, 40, 0, 42, 0,
102, 103, 104, 105, 106, 107, 108, 109, 110, 0,
183, 114, 0, 0, 187, 0, 0, 0, 116, 118,
119, 0, 0, 120, 121, 122, 0, 43, 123, 124,
0, 182, 41, 39, 43, 40, 130, 42, 181, 41,
39, 0, 40, 0, 42, 44, 43, 0, 0, 0,
158, 41, 39, 0, 40, 146, 42, 148, 149, 0,
0, 43, 212, 0, 0, 157, 41, 39, 0, 40,
0, 42, 0, 0, 0, 43, 0, 0, 0, 0,
41, 39, 0, 40, 44, 42, 0, 0, 0, 130,
0, 44, 169, 0, 170, 171, 172, 173, 174, 175,
176, 177, 178, 44, 179, 180, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 114, 170, 44, 0,
0, 130, 0, 194, 195, 196, 197, 198, 199, 200,
43, 153, 44, 0, 147, 41, 39, 0, 40, 0,
42, 0, 0, 0, 0, 0, 0, 206, 207, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 219, 220, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 44 };
short yypact[]={
-1000, -7, 50,-254, 167,-1000, 189,-1000, 41, 220,
274, 268, 26,-1000,-1000,-1000,-1000,-1000,-249,-250,
108,-248,-251,-284, -93, 39, 108,-1000, 38, 37,
-256,-1000,-1000,-1000,-1000,-1000, 31,-1000, -45, 108,
108, 108, 108, 108, 108, 108, 108, 108,-1000,-1000,
87,-1000,-1000,-1000,-1000,-1000,-1000, 67, 108, 108,
-1000,-1000, 108, 108, 108,-1000,-1000, 108, 108,-1000,
-1000, 21,-1000,-1000, 36, 108, -10, 34,-1000, 156,
130, 254, 248,-252, -51,-1000,-1000,-1000, -52,-1000,
-1000,-1000, -93,-1000, 108, 673, 108, 108,-1000,-101,
-254, -58, 11, 11, -64, -64, -64, -64, 167, 618,
167, 29,-1000,-1000, 167, 116, 604,-1000, 167, 167,
589, 167, 167, 167, 167,-1000, 26, 25, 108, 2,
-26, 108,-1000, 108, 108, 108, 108, 108, 108, 108,
108, 108,-1000, 108, 108,-1000, 577,-1000, 570, 531,
50,-1000,-1000, 234,-1000, 145, 47,-1000,-1000,-1000,
108, 22, 108, 108, 108, 108, 108, 108, 108, 167,
386, 167, 167, 167, 167, 167, 167, 167, 167, 94,
7,-1000,-1000,-1000, -40,-1000, 108, 108,-1000,-1000,
-1000,-1000, 18, 26, 0, 167, 167, 167, 167, 167,
167, 214,-1000,-1000, 10,-254, 167, 167, 26,-1000,
26, 108, 108,-1000, 52,-1000,-1000,-1000,-1000, 167,
167,-1000,-254,-1000,-1000 };
short yypgo[]={
0, 98, 145, 12, 97, 95, 93, 13, 91, 540,
440, 85, 64, 14, 90, 84, 32, 18, 82, 67 };
short yyr1[]={
0, 1, 1, 1, 6, 6, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
10, 10, 10, 10, 10, 10, 14, 12, 7, 7,
3, 3, 13, 13, 13, 13, 13, 13, 13, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 15, 15, 17, 17, 16, 18,
18, 18, 11, 4, 5, 5, 5, 8, 8, 19,
19 };
short yyr2[]={
0, 0, 3, 8, 1, 4, 1, 0, 1, 3,
6, 3, 6, 1, 4, 3, 1, 3, 3, 3,
3, 3, 3, 3, 1, 1, 7, 7, 8, 4,
1, 1, 1, 1, 1, 1, 4, 0, 1, 3,
1, 1, 3, 3, 3, 3, 3, 3, 1, 3,
3, 2, 3, 3, 3, 3, 4, 2, 2, 2,
2, 5, 5, 5, 5, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 4, 3, 1,
2, 3, 2, 1, 1, 3, 3, 6, 6, 4,
4, 3, 1, 4, 2, 3, 3, 3, 3, 3,
3, 1, 1, 1, 1, 3, 1, 3, 1, 1,
1, 2, 0, 3, 0, 1, 3, 1, 3, 1,
3 };
short yychk[]={
-1000, -1, -2, -4, -9, 286, 258, 273, 272, 277,
275, 276, 123, 263, 256, 262, 265, -14, 126, 274,
45, 270, 271, -16, 285, 261, 40, 63, 260, 266,
-18, 95, 259, -3, 10, 59, -5, -19, 258, 43,
45, 42, 47, 37, 94, 61, 91, -10, 270, 271,
40, 278, 279, 280, 281, 282, 283, 40, 61, -10,
270, 271, 40, 61, -10, 270, 271, 61, -10, 270,
271, -7, -2, -11, -11, -11, 258, 258, -9, 258,
277, 275, 276, 126, 258, 277, 275, 276, 258, 277,
275, 276, 285, -16, 40, -9, 40, 40, 259, 41,
44, 91, -9, -9, -9, -9, -9, -9, -9, -9,
-9, -15, 41, -17, -9, 258, -9, 41, -9, -9,
-9, -9, -9, -9, -9, 125, -3, -12, 40, -13,
-9, 61, 40, 91, 61, -10, 61, -10, 61, -10,
61, -10, 258, 91, 91, -16, -9, 41, -9, -9,
123, -19, 93, 93, 41, 44, 91, 41, 41, -2,
40, -13, 59, 264, 60, 62, 267, 269, 268, -9,
-9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
-9, 41, 41, 59, -6, -3, 61, -10, 270, 271,
-17, 93, -13, 41, -9, -9, -9, -9, -9, -9,
-9, 93, 93, 93, -7, 284, -9, -9, 41, -2,
41, 61, -10, 125, -8, -19, -2, -12, -2, -9,
-9, -3, 44, -12, -19 };
short yydef[]={
1, -2, 0, 114, 6, 8, 84, 13, 16, 101,
102, 103, 7, 24, 25, 112, 112, 112, 0, 0,
0, 0, 0, 79, 83, 0, 0, 92, 0, 0,
108, 109, 110, 2, 40, 41, 0, 115, 119, 0,
0, 0, 0, 0, 0, 0, 0, 0, 57, 60,
0, 30, 31, 32, 33, 34, 35, 0, 0, 0,
65, 67, 0, 0, 0, 69, 71, 0, 0, 73,
75, 0, 38, 37, 0, 0, 94, 0, 51, 84,
101, 102, 103, 0, 58, 66, 70, 74, 59, 68,
72, 76, 82, 80, 0, 0, 0, 0, 111, 0,
0, 0, 49, 50, 52, 53, 54, 55, 9, 0,
11, 0, 78, 104, 106, 84, 0, 15, 17, 18,
0, 19, 20, 21, 22, 23, 7, 0, 0, 0,
48, 0, 113, 0, 0, 0, 0, 0, 0, 0,
0, 0, 94, 0, 0, 81, 0, 91, 0, 0,
0, 116, 120, 56, 77, 0, 0, 14, 90, 39,
0, 0, 0, 0, 0, 0, 0, 0, 0, 29,
0, 85, 86, 95, 96, 97, 98, 99, 100, 0,
0, 89, 93, 36, 7, 4, 0, 0, 61, 63,
105, 107, 0, 7, 0, 42, 43, 44, 45, 46,
47, 56, 62, 64, 0, 0, 10, 12, 7, 37,
7, 0, 0, 3, 0, 117, 26, 27, 37, 87,
88, 5, 0, 28, 118 };
#ifndef lint
static char yaccpar_sccsid[] = "@(#)yaccpar 4.1 (Berkeley) 2/11/83";
#endif not lint
#
# define YYFLAG -1000
# define YYERROR goto yyerrlab
# define YYACCEPT return(0)
# define YYABORT return(1)
/* parser for yacc output */
#ifdef YYDEBUG
int yydebug = 0; /* 1 for debugging */
#endif
YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
int yychar = -1; /* current input token number */
int yynerrs = 0; /* number of errors */
short yyerrflag = 0; /* error recovery flag */
yyparse() {
short yys[YYMAXDEPTH];
short yyj, yym;
register YYSTYPE *yypvt;
register short yystate, *yyps, yyn;
register YYSTYPE *yypv;
register short *yyxi;
yystate = 0;
yychar = -1;
yynerrs = 0;
yyerrflag = 0;
yyps= &yys[-1];
yypv= &yyv[-1];
yystack: /* put a state and value onto the stack */
#ifdef YYDEBUG
if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
#endif
if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
*yyps = yystate;
++yypv;
*yypv = yyval;
yynewstate:
yyn = yypact[yystate];
if( yyn<= YYFLAG ) goto yydefault; /* simple state */
if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
yychar = -1;
yyval = yylval;
yystate = yyn;
if( yyerrflag > 0 ) --yyerrflag;
goto yystack;
}
yydefault:
/* default state action */
if( (yyn=yydef[yystate]) == -2 ) {
if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
/* look through exception table */
for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
while( *(yyxi+=2) >= 0 ){
if( *yyxi == yychar ) break;
}
if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
}
if( yyn == 0 ){ /* error */
/* error ... attempt to resume parsing */
switch( yyerrflag ){
case 0: /* brand new error */
yyerror( "syntax error" );
yyerrlab:
++yynerrs;
case 1:
case 2: /* incompletely recovered error ... try again */
yyerrflag = 3;
/* find a state where "error" is a legal shift action */
while ( yyps >= yys ) {
yyn = yypact[*yyps] + YYERRCODE;
if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
yystate = yyact[yyn]; /* simulate a shift of "error" */
goto yystack;
}
yyn = yypact[*yyps];
/* the current yyps has no shift onn "error", pop stack */
#ifdef YYDEBUG
if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
#endif
--yyps;
--yypv;
}
/* there is no state on the stack with an error shift ... abort */
yyabort:
return(1);
case 3: /* no shift yet; clobber input char */
#ifdef YYDEBUG
if( yydebug ) printf( "error recovery discards char %d\n", yychar );
#endif
if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
yychar = -1;
goto yynewstate; /* try again in the same state */
}
}
/* reduction by production yyn */
#ifdef YYDEBUG
if( yydebug ) printf("reduce %d\n",yyn);
#endif
yyps -= yyr2[yyn];
yypvt = yypv;
yypv -= yyr2[yyn];
yyval = yypv[1];
yym=yyn;
/* consult goto table to find next state */
yyn = yyr1[yyn];
yyj = yypgo[yyn] + *yyps + 1;
if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
switch(yym){
case 2:
# line 39 "bc.y"
output( yypvt[-1] ); break;
case 3:
# line 41 "bc.y"
{ bundle( 6,pre, yypvt[-1], post ,"0",numb[lev],"Q");
conout( yyval, yypvt[-6] );
rcrs = crs;
output( "" );
lev = bindx = 0;
} break;
case 6:
# line 54 "bc.y"
{ bundle(2, yypvt[-0], "ps." ); } break;
case 7:
# line 56 "bc.y"
{ bundle(1, "" ); } break;
case 8:
# line 58 "bc.y"
{ bundle(3,"[",yypvt[-0],"]P");} break;
case 9:
# line 60 "bc.y"
{ bundle(3, yypvt[-0], "s", yypvt[-2] ); } break;
case 10:
# line 62 "bc.y"
{ bundle(4, yypvt[-0], yypvt[-3], ":", geta(yypvt[-5])); } break;
case 11:
# line 64 "bc.y"
{ bundle(6, "l", yypvt[-2], yypvt[-0], yypvt[-1], "s", yypvt[-2] ); } break;
case 12:
# line 66 "bc.y"
{ bundle(8,yypvt[-3], ";", geta(yypvt[-5]), yypvt[-0], yypvt[-1], yypvt[-3], ":", geta(yypvt[-5]));} break;
case 13:
# line 68 "bc.y"
{ bundle(2, numb[lev-bstack[bindx-1]], "Q" ); } break;
case 14:
# line 70 "bc.y"
bundle(4, yypvt[-1], post, numb[lev], "Q" ); break;
case 15:
# line 72 "bc.y"
bundle(4, "0", post, numb[lev], "Q" ); break;
case 16:
# line 74 "bc.y"
bundle(4,"0",post,numb[lev],"Q"); break;
case 17:
# line 76 "bc.y"
bundle(2, yypvt[-0], "k"); break;
case 18:
# line 78 "bc.y"
bundle(4,"K",yypvt[-0],yypvt[-1],"k"); break;
case 19:
# line 80 "bc.y"
bundle(2,yypvt[-0], "i"); break;
case 20:
# line 82 "bc.y"
bundle(4,"I",yypvt[-0],yypvt[-1],"i"); break;
case 21:
# line 84 "bc.y"
bundle(2,yypvt[-0],"o"); break;
case 22:
# line 86 "bc.y"
bundle(4,"O",yypvt[-0],yypvt[-1],"o"); break;
case 23:
# line 88 "bc.y"
{ yyval = yypvt[-1]; } break;
case 24:
# line 90 "bc.y"
{ bundle(1,"fY"); } break;
case 25:
# line 92 "bc.y"
{ bundle(1,"c"); } break;
case 26:
# line 94 "bc.y"
{ conout( yypvt[-0], yypvt[-5] );
bundle(3, yypvt[-2], yypvt[-5], " " );
} break;
case 27:
# line 98 "bc.y"
{ bundle(3, yypvt[-1], yypvt[-3], yypvt[-5] );
conout( yyval, yypvt[-5] );
bundle(3, yypvt[-3], yypvt[-5], " " );
} break;
case 28:
# line 103 "bc.y"
{ bundle(5, yypvt[-1], yypvt[-3], "s.", yypvt[-5], yypvt[-6] );
conout( yyval, yypvt[-6] );
bundle(5, yypvt[-7], "s.", yypvt[-5], yypvt[-6], " " );
} break;
case 29:
# line 108 "bc.y"
{ bundle(3,yypvt[-0],"S",yypvt[-2]); } break;
case 30:
# line 112 "bc.y"
{ yyval = "+"; } break;
case 31:
# line 114 "bc.y"
{ yyval = "-"; } break;
case 32:
# line 116 "bc.y"
{ yyval = "*"; } break;
case 33:
# line 118 "bc.y"
{ yyval = "/"; } break;
case 34:
# line 120 "bc.y"
{ yyval = "%%"; } break;
case 35:
# line 122 "bc.y"
{ yyval = "^"; } break;
case 36:
# line 126 "bc.y"
{ yyval = yypvt[-1]; } break;
case 37:
# line 130 "bc.y"
{ --bindx; } break;
case 39:
# line 135 "bc.y"
{ bundle(2, yypvt[-2], yypvt[-0] ); } break;
case 40:
# line 139 "bc.y"
{ln++;} break;
case 42:
# line 144 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "=" ); break;
case 43:
# line 146 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], ">" ); break;
case 44:
# line 148 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "<" ); break;
case 45:
# line 150 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "!=" ); break;
case 46:
# line 152 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "!>" ); break;
case 47:
# line 154 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "!<" ); break;
case 48:
# line 156 "bc.y"
bundle(2, yypvt[-0], " 0!=" ); break;
case 49:
# line 160 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "+" ); break;
case 50:
# line 162 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "-" ); break;
case 51:
# line 164 "bc.y"
bundle(3, " 0", yypvt[-0], "-" ); break;
case 52:
# line 166 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "*" ); break;
case 53:
# line 168 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "/" ); break;
case 54:
# line 170 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "%%" ); break;
case 55:
# line 172 "bc.y"
bundle(3, yypvt[-2], yypvt[-0], "^" ); break;
case 56:
# line 174 "bc.y"
{ bundle(3,yypvt[-1], ";", geta(yypvt[-3])); } break;
case 57:
# line 176 "bc.y"
bundle(4, "l", yypvt[-1], "d1+s", yypvt[-1] ); break;
case 58:
# line 178 "bc.y"
bundle(4, "l", yypvt[-0], "1+ds", yypvt[-0] ); break;
case 59:
# line 180 "bc.y"
bundle(4, "l", yypvt[-0], "1-ds", yypvt[-0] ); break;
case 60:
# line 182 "bc.y"
bundle(4, "l", yypvt[-1], "d1-s", yypvt[-1] ); break;
case 61:
# line 184 "bc.y"
bundle(7,yypvt[-2],";",geta(yypvt[-4]),"d1+",yypvt[-2],":",geta(yypvt[-4])); break;
case 62:
# line 186 "bc.y"
bundle(7,yypvt[-1],";",geta(yypvt[-3]),"1+d",yypvt[-1],":",geta(yypvt[-3])); break;
case 63:
# line 188 "bc.y"
bundle(7,yypvt[-2],";",geta(yypvt[-4]),"d1-",yypvt[-2],":",geta(yypvt[-4])); break;
case 64:
# line 190 "bc.y"
bundle(7,yypvt[-1],";",geta(yypvt[-3]),"1-d",yypvt[-1],":",geta(yypvt[-3])); break;
case 65:
# line 192 "bc.y"
bundle(1,"Kd1+k"); break;
case 66:
# line 194 "bc.y"
bundle(1,"K1+dk"); break;
case 67:
# line 196 "bc.y"
bundle(1,"Kd1-k"); break;
case 68:
# line 198 "bc.y"
bundle(1,"K1-dk"); break;
case 69:
# line 200 "bc.y"
bundle(1,"Id1+i"); break;
case 70:
# line 202 "bc.y"
bundle(1,"I1+di"); break;
case 71:
# line 204 "bc.y"
bundle(1,"Id1-i"); break;
case 72:
# line 206 "bc.y"
bundle(1,"I1-di"); break;
case 73:
# line 208 "bc.y"
bundle(1,"Od1+o"); break;
case 74:
# line 210 "bc.y"
bundle(1,"O1+do"); break;
case 75:
# line 212 "bc.y"
bundle(1,"Od1-o"); break;
case 76:
# line 214 "bc.y"
bundle(1,"O1-do"); break;
case 77:
# line 216 "bc.y"
bundle(4, yypvt[-1], "l", getf(yypvt[-3]), "x" ); break;
case 78:
# line 218 "bc.y"
bundle(3, "l", getf(yypvt[-2]), "x" ); break;
case 79:
# line 220 "bc.y"
{ bundle(2, " ", yypvt[-0] ); } break;
case 80:
# line 222 "bc.y"
{ bundle(2, " .", yypvt[-0] ); } break;
case 81:
# line 224 "bc.y"
{ bundle(4, " ", yypvt[-2], ".", yypvt[-0] ); } break;
case 82:
# line 226 "bc.y"
{ bundle(3, " ", yypvt[-1], "." ); } break;
case 83:
# line 228 "bc.y"
{ yyval = "l."; } break;
case 84:
# line 230 "bc.y"
{ bundle(2, "l", yypvt[-0] ); } break;
case 85:
# line 232 "bc.y"
{ bundle(3, yypvt[-0], "ds", yypvt[-2] ); } break;
case 86:
# line 234 "bc.y"
{ bundle(6, "l", yypvt[-2], yypvt[-0], yypvt[-1], "ds", yypvt[-2] ); } break;
case 87:
# line 236 "bc.y"
{ bundle(5,yypvt[-0],"d",yypvt[-3],":",geta(yypvt[-5])); } break;
case 88:
# line 238 "bc.y"
{ bundle(9,yypvt[-3],";",geta(yypvt[-5]),yypvt[-0],yypvt[-1],"d",yypvt[-3],":",geta(yypvt[-5])); } break;
case 89:
# line 240 "bc.y"
bundle(2,yypvt[-1],"Z"); break;
case 90:
# line 242 "bc.y"
bundle(2,yypvt[-1],"X"); break;
case 91:
# line 244 "bc.y"
{ yyval = yypvt[-1]; } break;
case 92:
# line 246 "bc.y"
{ bundle(1, "?" ); } break;
case 93:
# line 248 "bc.y"
{ bundle(2, yypvt[-1], "v" ); } break;
case 94:
# line 250 "bc.y"
{ bundle(2,"L",yypvt[-0]); } break;
case 95:
# line 252 "bc.y"
bundle(2,yypvt[-0],"dk"); break;
case 96:
# line 254 "bc.y"
bundle(4,"K",yypvt[-0],yypvt[-1],"dk"); break;
case 97:
# line 256 "bc.y"
bundle(2,yypvt[-0],"di"); break;
case 98:
# line 258 "bc.y"
bundle(4,"I",yypvt[-0],yypvt[-1],"di"); break;
case 99:
# line 260 "bc.y"
bundle(2,yypvt[-0],"do"); break;
case 100:
# line 262 "bc.y"
bundle(4,"O",yypvt[-0],yypvt[-1],"do"); break;
case 101:
# line 264 "bc.y"
bundle(1,"K"); break;
case 102:
# line 266 "bc.y"
bundle(1,"I"); break;
case 103:
# line 268 "bc.y"
bundle(1,"O"); break;
case 105:
# line 273 "bc.y"
bundle(2, yypvt[-2], yypvt[-0] ); break;
case 107:
# line 277 "bc.y"
bundle(2,"l",geta(yypvt[-2])); break;
case 108:
# line 281 "bc.y"
{ *cp++ = '\0'; } break;
case 109:
# line 285 "bc.y"
{ yyval = cp; *cp++ = '_'; } break;
case 110:
# line 287 "bc.y"
{ yyval = cp; *cp++ = yypvt[-0]; } break;
case 111:
# line 289 "bc.y"
{ *cp++ = yypvt[-0]; } break;
case 112:
# line 293 "bc.y"
{ yyval = cp; *cp++ = crs++; *cp++ = '\0';
if(crs == '[')crs+=3;
if(crs == 'a')crs='{';
if(crs >= 0241){yyerror("program too big");
getout();
}
bstack[bindx++] = lev++; } break;
case 113:
# line 303 "bc.y"
{ yyval = getf(yypvt[-1]);
pre = "";
post = "";
lev = 1;
bstack[bindx=0] = 0;
} break;
case 115:
# line 313 "bc.y"
{ pp( yypvt[-0] ); } break;
case 116:
# line 315 "bc.y"
{ pp( yypvt[-0] ); } break;
case 117:
# line 319 "bc.y"
{ tp(yypvt[-0]); } break;
case 118:
# line 321 "bc.y"
{ tp(yypvt[-0]); } break;
case 120:
# line 325 "bc.y"
{ yyval = geta(yypvt[-2]); } break;
}
goto yystack; /* stack new state and value */
}