2 static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
13 #define yyclearin (yychar = YYEMPTY)
14 #define yyerrok (yyerrflag = 0)
15 #define YYRECOVERING() (yyerrflag != 0)
19 #define yyparse calc_parse
23 #define yylex calc_lex
27 #define yyerror calc_error
31 #define yychar calc_char
35 #define yyval calc_val
39 #define yylval calc_lval
43 #define yydebug calc_debug
47 #define yynerrs calc_nerrs
51 #define yyerrflag calc_errflag
52 #endif /* yyerrflag */
55 #define yylhs calc_lhs
59 #define yylen calc_len
63 #define yydefred calc_defred
67 #define yydgoto calc_dgoto
71 #define yysindex calc_sindex
75 #define yyrindex calc_rindex
79 #define yygindex calc_gindex
83 #define yytable calc_table
87 #define yycheck calc_check
91 #define yyname calc_name
95 #define yyrule calc_rule
97 #define YYPREFIX "calc_"
99 /* compatibility with bison */
101 /* compatibility with FreeBSD */
102 #ifdef YYPARSE_PARAM_TYPE
103 #define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
105 #define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
108 #define YYPARSE_DECL() yyparse(void)
109 #endif /* YYPARSE_PARAM */
111 extern int YYPARSE_DECL();
120 #line 121 "calc.tab.c"
124 #define YYERRCODE 256
125 static const short calc_lhs[] = { -1,
126 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
127 2, 2, 2, 2, 2, 2, 3, 3,
129 static const short calc_len[] = { 2,
130 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
131 3, 3, 3, 2, 1, 1, 1, 2,
133 static const short calc_defred[] = { 1,
134 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
135 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
136 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
139 static const short calc_dgoto[] = { 1,
142 static const short calc_sindex[] = { 0,
143 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
144 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
145 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
148 static const short calc_rindex[] = { 0,
149 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
150 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
151 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
154 static const short calc_gindex[] = { 0,
157 #define YYTABLESIZE 220
158 static const short calc_table[] = { 6,
159 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
160 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
161 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
162 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
163 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
164 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
165 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
166 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
167 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
168 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
169 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
170 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
171 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
172 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
173 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
174 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
175 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
176 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
177 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
178 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
179 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
180 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
182 static const short calc_check[] = { 40,
183 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
184 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
185 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
186 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
187 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
188 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
189 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
190 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
191 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
192 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
193 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
194 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
195 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
196 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
197 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
198 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
199 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
200 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
201 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
202 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
203 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
204 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
210 #define YYMAXTOKEN 259
212 static const char *yyname[] = {
214 "end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
215 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,
216 0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
217 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0,
218 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
219 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
220 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
221 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",
223 static const char *yyrule[] = {
226 "list : list stat '\\n'",
227 "list : list error '\\n'",
229 "stat : LETTER '=' expr",
230 "expr : '(' expr ')'",
231 "expr : expr '+' expr",
232 "expr : expr '-' expr",
233 "expr : expr '*' expr",
234 "expr : expr '/' expr",
235 "expr : expr '%' expr",
236 "expr : expr '&' expr",
237 "expr : expr '|' expr",
242 "number : number DIGIT",
253 /* define the initial stack-sizes */
256 #define YYMAXDEPTH YYSTACKSIZE
259 #define YYSTACKSIZE YYMAXDEPTH
261 #define YYSTACKSIZE 500
262 #define YYMAXDEPTH 500
266 #define YYINITSTACKSIZE 500
287 /* variables for the parser stack */
288 static YYSTACKDATA yystack;
290 /* start of programs */
295 while(!feof(stdin)) {
302 fprintf(stderr, "%s\n", s);
306 yylex() { /* lexical analysis routine */
307 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
308 /* return DIGIT for a digit, yylval = 0 through 9 */
309 /* all other characters are returned immediately */
313 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
315 /* c is now nonblank */
327 #line 328 "calc.tab.c"
328 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
329 static int yygrowstack(YYSTACKDATA *data)
336 if ((newsize = data->stacksize) == 0)
337 newsize = YYINITSTACKSIZE;
338 else if (newsize >= YYMAXDEPTH)
340 else if ((newsize *= 2) > YYMAXDEPTH)
341 newsize = YYMAXDEPTH;
343 i = data->s_mark - data->s_base;
344 newss = (data->s_base != 0)
345 ? (short *)realloc(data->s_base, newsize * sizeof(*newss))
346 : (short *)malloc(newsize * sizeof(*newss));
350 data->s_base = newss;
351 data->s_mark = newss + i;
353 newvs = (data->l_base != 0)
354 ? (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs))
355 : (YYSTYPE *)malloc(newsize * sizeof(*newvs));
359 data->l_base = newvs;
360 data->l_mark = newvs + i;
362 data->stacksize = newsize;
363 data->s_last = data->s_base + newsize - 1;
367 #if YYPURE || defined(YY_NO_LEAKS)
368 static void yyfreestack(YYSTACKDATA *data)
372 memset(data, 0, sizeof(*data));
375 #define yyfreestack(data) /* nothing */
378 #define YYABORT goto yyabort
379 #define YYREJECT goto yyabort
380 #define YYACCEPT goto yyaccept
381 #define YYERROR goto yyerrlab
386 int yym, yyn, yystate;
390 if ((yys = getenv("YYDEBUG")) != 0)
393 if (yyn >= '0' && yyn <= '9')
404 memset(&yystack, 0, sizeof(yystack));
407 if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
408 yystack.s_mark = yystack.s_base;
409 yystack.l_mark = yystack.l_base;
414 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
417 if ((yychar = yylex()) < 0) yychar = 0;
422 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
423 if (!yys) yys = "illegal-symbol";
424 printf("%sdebug: state %d, reading %d (%s)\n",
425 YYPREFIX, yystate, yychar, yys);
429 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
430 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
434 printf("%sdebug: state %d, shifting to state %d\n",
435 YYPREFIX, yystate, yytable[yyn]);
437 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
441 yystate = yytable[yyn];
442 *++yystack.s_mark = yytable[yyn];
443 *++yystack.l_mark = yylval;
445 if (yyerrflag > 0) --yyerrflag;
448 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
449 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
454 if (yyerrflag) goto yyinrecovery;
456 yyerror("syntax error");
469 if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
470 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
474 printf("%sdebug: state %d, error recovery shifting\
475 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
477 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
481 yystate = yytable[yyn];
482 *++yystack.s_mark = yytable[yyn];
483 *++yystack.l_mark = yylval;
490 printf("%sdebug: error recovery discarding state %d\n",
491 YYPREFIX, *yystack.s_mark);
493 if (yystack.s_mark <= yystack.s_base) goto yyabort;
501 if (yychar == 0) goto yyabort;
506 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
507 if (!yys) yys = "illegal-symbol";
508 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
509 YYPREFIX, yystate, yychar, yys);
519 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
520 YYPREFIX, yystate, yyn, yyrule[yyn]);
524 yyval = yystack.l_mark[1-yym];
526 memset(&yyval, 0, sizeof yyval);
535 { printf("%d\n",yystack.l_mark[0]);}
539 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
543 { yyval = yystack.l_mark[-1]; }
547 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
551 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
555 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
559 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
563 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
567 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
571 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
575 { yyval = - yystack.l_mark[0]; }
579 { yyval = regs[yystack.l_mark[0]]; }
583 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
587 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
589 #line 590 "calc.tab.c"
591 yystack.s_mark -= yym;
592 yystate = *yystack.s_mark;
593 yystack.l_mark -= yym;
595 if (yystate == 0 && yym == 0)
599 printf("%sdebug: after reduction, shifting from state 0 to\
600 state %d\n", YYPREFIX, YYFINAL);
603 *++yystack.s_mark = YYFINAL;
604 *++yystack.l_mark = yyval;
607 if ((yychar = yylex()) < 0) yychar = 0;
612 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
613 if (!yys) yys = "illegal-symbol";
614 printf("%sdebug: state %d, reading %d (%s)\n",
615 YYPREFIX, YYFINAL, yychar, yys);
619 if (yychar == 0) goto yyaccept;
622 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
623 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
624 yystate = yytable[yyn];
626 yystate = yydgoto[yym];
629 printf("%sdebug: after reduction, shifting from state %d \
630 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
632 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
636 *++yystack.s_mark = (short) yystate;
637 *++yystack.l_mark = yyval;
641 yyerror("yacc stack overflow");
644 yyfreestack(&yystack);
648 yyfreestack(&yystack);