2 static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
10 #define yyclearin (yychar = YYEMPTY)
11 #define yyerrok (yyerrflag = 0)
12 #define YYRECOVERING() (yyerrflag != 0)
16 #define yyparse calc_parse
20 #define yylex calc_lex
24 #define yyerror calc_error
28 #define yychar calc_char
32 #define yyval calc_val
36 #define yylval calc_lval
40 #define yydebug calc_debug
44 #define yynerrs calc_nerrs
48 #define yyerrflag calc_errflag
49 #endif /* yyerrflag */
52 #define yylhs calc_lhs
56 #define yylen calc_len
60 #define yydefred calc_defred
64 #define yydgoto calc_dgoto
68 #define yysindex calc_sindex
72 #define yyrindex calc_rindex
76 #define yygindex calc_gindex
80 #define yytable calc_table
84 #define yycheck calc_check
88 #define yyname calc_name
92 #define yyrule calc_rule
94 #define YYPREFIX "calc_"
105 #line 106 "pure_calc.tab.c"
111 /* compatibility with bison */
113 /* compatibility with FreeBSD */
114 # ifdef YYPARSE_PARAM_TYPE
115 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
117 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
120 # define YYPARSE_DECL() yyparse(void)
123 /* Parameters sent to lex. */
125 # define YYLEX_DECL() yylex(YYSTYPE *yylval, void *YYLEX_PARAM)
126 # define YYLEX yylex(&yylval, YYLEX_PARAM)
128 # define YYLEX_DECL() yylex(YYSTYPE *yylval)
129 # define YYLEX yylex(&yylval)
132 /* Parameters sent to yyerror. */
133 #define YYERROR_DECL() yyerror(const char *s)
134 #define YYERROR_CALL(msg) yyerror(msg)
136 extern int YYPARSE_DECL();
137 extern int YYLEX_DECL();
142 #define YYERRCODE 256
143 static const short calc_lhs[] = { -1,
144 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
145 2, 2, 2, 2, 2, 2, 3, 3,
147 static const short calc_len[] = { 2,
148 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
149 3, 3, 3, 2, 1, 1, 1, 2,
151 static const short calc_defred[] = { 1,
152 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
153 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
154 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
157 static const short calc_dgoto[] = { 1,
160 static const short calc_sindex[] = { 0,
161 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
162 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
163 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
166 static const short calc_rindex[] = { 0,
167 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
172 static const short calc_gindex[] = { 0,
175 #define YYTABLESIZE 220
176 static const short calc_table[] = { 6,
177 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
178 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
179 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
180 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
181 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
182 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
183 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
184 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
185 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
186 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
187 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
188 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
189 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
190 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
191 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
193 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
194 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
195 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
196 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
198 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
200 static const short calc_check[] = { 40,
201 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
202 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
203 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
204 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
205 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
206 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
207 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
208 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
209 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
210 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
211 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
212 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
213 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
214 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
215 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
216 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
217 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
218 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
219 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
220 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
221 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
222 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
228 #define YYMAXTOKEN 259
230 static const char *yyname[] = {
232 "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,
233 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,
234 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,
235 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,
236 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,
237 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,
238 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,
239 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",
241 static const char *yyrule[] = {
244 "list : list stat '\\n'",
245 "list : list error '\\n'",
247 "stat : LETTER '=' expr",
248 "expr : '(' expr ')'",
249 "expr : expr '+' expr",
250 "expr : expr '-' expr",
251 "expr : expr '*' expr",
252 "expr : expr '/' expr",
253 "expr : expr '%' expr",
254 "expr : expr '&' expr",
255 "expr : expr '|' expr",
260 "number : number DIGIT",
264 /* define the initial stack-sizes */
267 #define YYMAXDEPTH YYSTACKSIZE
270 #define YYSTACKSIZE YYMAXDEPTH
272 #define YYSTACKSIZE 500
273 #define YYMAXDEPTH 500
277 #define YYINITSTACKSIZE 500
290 #line 63 "pure_calc.y"
291 /* start of programs */
296 while(!feof(stdin)) {
303 yyerror(const char *s)
305 fprintf(stderr, "%s\n", s);
309 yylex(YYSTYPE *value)
311 /* lexical analysis routine */
312 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
313 /* return DIGIT for a digit, yylval = 0 through 9 */
314 /* all other characters are returned immediately */
318 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
320 /* c is now nonblank */
332 #line 333 "pure_calc.tab.c"
335 #include <stdio.h> /* needed for printf */
338 #include <stdlib.h> /* needed for malloc, etc */
339 #include <string.h> /* needed for memset */
341 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
342 static int yygrowstack(YYSTACKDATA *data)
349 if ((newsize = data->stacksize) == 0)
350 newsize = YYINITSTACKSIZE;
351 else if (newsize >= YYMAXDEPTH)
353 else if ((newsize *= 2) > YYMAXDEPTH)
354 newsize = YYMAXDEPTH;
356 i = data->s_mark - data->s_base;
357 newss = (data->s_base != 0)
358 ? (short *)realloc(data->s_base, newsize * sizeof(*newss))
359 : (short *)malloc(newsize * sizeof(*newss));
363 data->s_base = newss;
364 data->s_mark = newss + i;
366 newvs = (data->l_base != 0)
367 ? (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs))
368 : (YYSTYPE *)malloc(newsize * sizeof(*newvs));
372 data->l_base = newvs;
373 data->l_mark = newvs + i;
375 data->stacksize = newsize;
376 data->s_last = data->s_base + newsize - 1;
380 #if YYPURE || defined(YY_NO_LEAKS)
381 static void yyfreestack(YYSTACKDATA *data)
385 memset(data, 0, sizeof(*data));
388 #define yyfreestack(data) /* nothing */
391 #define YYABORT goto yyabort
392 #define YYREJECT goto yyabort
393 #define YYACCEPT goto yyaccept
394 #define YYERROR goto yyerrlab
404 /* variables for the parser stack */
406 int yym, yyn, yystate;
410 if ((yys = getenv("YYDEBUG")) != 0)
413 if (yyn >= '0' && yyn <= '9')
424 memset(&yystack, 0, sizeof(yystack));
427 if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
428 yystack.s_mark = yystack.s_base;
429 yystack.l_mark = yystack.l_base;
434 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
437 if ((yychar = YYLEX) < 0) yychar = 0;
442 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
443 if (!yys) yys = "illegal-symbol";
444 printf("%sdebug: state %d, reading %d (%s)\n",
445 YYPREFIX, yystate, yychar, yys);
449 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
450 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
454 printf("%sdebug: state %d, shifting to state %d\n",
455 YYPREFIX, yystate, yytable[yyn]);
457 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
461 yystate = yytable[yyn];
462 *++yystack.s_mark = yytable[yyn];
463 *++yystack.l_mark = yylval;
465 if (yyerrflag > 0) --yyerrflag;
468 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
469 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
474 if (yyerrflag) goto yyinrecovery;
476 yyerror("syntax error");
489 if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
490 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
494 printf("%sdebug: state %d, error recovery shifting\
495 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
497 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
501 yystate = yytable[yyn];
502 *++yystack.s_mark = yytable[yyn];
503 *++yystack.l_mark = yylval;
510 printf("%sdebug: error recovery discarding state %d\n",
511 YYPREFIX, *yystack.s_mark);
513 if (yystack.s_mark <= yystack.s_base) goto yyabort;
521 if (yychar == 0) goto yyabort;
526 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
527 if (!yys) yys = "illegal-symbol";
528 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
529 YYPREFIX, yystate, yychar, yys);
539 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
540 YYPREFIX, yystate, yyn, yyrule[yyn]);
544 yyval = yystack.l_mark[1-yym];
546 memset(&yyval, 0, sizeof yyval);
550 #line 25 "pure_calc.y"
554 #line 29 "pure_calc.y"
555 { printf("%d\n",yystack.l_mark[0]);}
558 #line 31 "pure_calc.y"
559 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
562 #line 35 "pure_calc.y"
563 { yyval = yystack.l_mark[-1]; }
566 #line 37 "pure_calc.y"
567 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
570 #line 39 "pure_calc.y"
571 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
574 #line 41 "pure_calc.y"
575 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
578 #line 43 "pure_calc.y"
579 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
582 #line 45 "pure_calc.y"
583 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
586 #line 47 "pure_calc.y"
587 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
590 #line 49 "pure_calc.y"
591 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
594 #line 51 "pure_calc.y"
595 { yyval = - yystack.l_mark[0]; }
598 #line 53 "pure_calc.y"
599 { yyval = regs[yystack.l_mark[0]]; }
602 #line 58 "pure_calc.y"
603 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
606 #line 60 "pure_calc.y"
607 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
609 #line 610 "pure_calc.tab.c"
611 yystack.s_mark -= yym;
612 yystate = *yystack.s_mark;
613 yystack.l_mark -= yym;
615 if (yystate == 0 && yym == 0)
619 printf("%sdebug: after reduction, shifting from state 0 to\
620 state %d\n", YYPREFIX, YYFINAL);
623 *++yystack.s_mark = YYFINAL;
624 *++yystack.l_mark = yyval;
627 if ((yychar = YYLEX) < 0) yychar = 0;
632 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
633 if (!yys) yys = "illegal-symbol";
634 printf("%sdebug: state %d, reading %d (%s)\n",
635 YYPREFIX, YYFINAL, yychar, yys);
639 if (yychar == 0) goto yyaccept;
642 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
643 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
644 yystate = yytable[yyn];
646 yystate = yydgoto[yym];
649 printf("%sdebug: after reduction, shifting from state %d \
650 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
652 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
656 *++yystack.s_mark = (short) yystate;
657 *++yystack.l_mark = yyval;
661 yyerror("yacc stack overflow");
664 yyfreestack(&yystack);
668 yyfreestack(&yystack);