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 "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(void *YYLEX_PARAM)
126 # define YYLEX yylex(YYLEX_PARAM)
128 # define YYLEX_DECL() yylex(void)
129 # define YYLEX yylex()
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
295 /* variables for the parser stack */
296 static YYSTACKDATA yystack;
298 /* start of programs */
303 while(!feof(stdin)) {
310 yyerror(const char *s)
312 fprintf(stderr, "%s\n", s);
318 /* lexical analysis routine */
319 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
320 /* return DIGIT for a digit, yylval = 0 through 9 */
321 /* all other characters are returned immediately */
325 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
327 /* c is now nonblank */
339 #line 340 "calc.tab.c"
342 #include <stdio.h> /* needed for printf */
345 #include <stdlib.h> /* needed for malloc, etc */
346 #include <string.h> /* needed for memset */
348 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
349 static int yygrowstack(YYSTACKDATA *data)
356 if ((newsize = data->stacksize) == 0)
357 newsize = YYINITSTACKSIZE;
358 else if (newsize >= YYMAXDEPTH)
360 else if ((newsize *= 2) > YYMAXDEPTH)
361 newsize = YYMAXDEPTH;
363 i = data->s_mark - data->s_base;
364 newss = (data->s_base != 0)
365 ? (short *)realloc(data->s_base, newsize * sizeof(*newss))
366 : (short *)malloc(newsize * sizeof(*newss));
370 data->s_base = newss;
371 data->s_mark = newss + i;
373 newvs = (data->l_base != 0)
374 ? (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs))
375 : (YYSTYPE *)malloc(newsize * sizeof(*newvs));
379 data->l_base = newvs;
380 data->l_mark = newvs + i;
382 data->stacksize = newsize;
383 data->s_last = data->s_base + newsize - 1;
387 #if YYPURE || defined(YY_NO_LEAKS)
388 static void yyfreestack(YYSTACKDATA *data)
392 memset(data, 0, sizeof(*data));
395 #define yyfreestack(data) /* nothing */
398 #define YYABORT goto yyabort
399 #define YYREJECT goto yyabort
400 #define YYACCEPT goto yyaccept
401 #define YYERROR goto yyerrlab
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);
555 { printf("%d\n",yystack.l_mark[0]);}
559 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
563 { yyval = yystack.l_mark[-1]; }
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[-2] * yystack.l_mark[0]; }
579 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
583 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
587 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
591 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
595 { yyval = - yystack.l_mark[0]; }
599 { yyval = regs[yystack.l_mark[0]]; }
603 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
607 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
609 #line 610 "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);