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();
141 #define YYERRCODE 256
142 static const short calc_lhs[] = { -1,
143 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
144 2, 2, 2, 2, 2, 2, 3, 3,
146 static const short calc_len[] = { 2,
147 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
148 3, 3, 3, 2, 1, 1, 1, 2,
150 static const short calc_defred[] = { 1,
151 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
152 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
153 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
156 static const short calc_dgoto[] = { 1,
159 static const short calc_sindex[] = { 0,
160 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
161 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
162 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
165 static const short calc_rindex[] = { 0,
166 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
171 static const short calc_gindex[] = { 0,
174 #define YYTABLESIZE 220
175 static const short calc_table[] = { 6,
176 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
177 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
178 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
179 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
180 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
181 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
182 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
183 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
184 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
185 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
186 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
187 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
188 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
189 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
190 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
191 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 3, 12,
199 static const short calc_check[] = { 40,
200 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
201 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
202 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
203 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
204 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
205 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
206 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
207 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
208 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
209 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
210 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
211 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
212 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
213 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
214 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
215 -1, -1, -1, -1, -1, -1, -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, 256, 257, 258, 257, 258,
227 #define YYMAXTOKEN 259
229 static const char *yyname[] = {
231 "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,
232 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,0,0,0,0,0,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,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,"DIGIT","LETTER","UMINUS",
240 static const char *yyrule[] = {
243 "list : list stat '\\n'",
244 "list : list error '\\n'",
246 "stat : LETTER '=' expr",
247 "expr : '(' expr ')'",
248 "expr : 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",
259 "number : number DIGIT",
263 /* define the initial stack-sizes */
266 #define YYMAXDEPTH YYSTACKSIZE
269 #define YYSTACKSIZE YYMAXDEPTH
271 #define YYSTACKSIZE 500
272 #define YYMAXDEPTH 500
276 #define YYINITSTACKSIZE 500
294 /* variables for the parser stack */
295 static YYSTACKDATA yystack;
297 /* start of programs */
300 extern int YYLEX_DECL();
301 static void YYERROR_DECL();
307 while(!feof(stdin)) {
314 yyerror(const char *s)
316 fprintf(stderr, "%s\n", s);
322 /* lexical analysis routine */
323 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
324 /* return DIGIT for a digit, yylval = 0 through 9 */
325 /* all other characters are returned immediately */
329 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
331 /* c is now nonblank */
343 #line 344 "calc.tab.c"
346 #include <stdio.h> /* needed for printf */
349 #include <stdlib.h> /* needed for malloc, etc */
350 #include <string.h> /* needed for memset */
352 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
353 static int yygrowstack(YYSTACKDATA *data)
360 if ((newsize = data->stacksize) == 0)
361 newsize = YYINITSTACKSIZE;
362 else if (newsize >= YYMAXDEPTH)
364 else if ((newsize *= 2) > YYMAXDEPTH)
365 newsize = YYMAXDEPTH;
367 i = data->s_mark - data->s_base;
368 newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
372 data->s_base = newss;
373 data->s_mark = newss + i;
375 newvs = (YYSTYPE *)realloc(data->l_base, 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);