1 /* original parser id follows */
2 /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */
3 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
8 #define YYCHECK "yyyymmdd"
11 #define yyclearin (yychar = YYEMPTY)
12 #define yyerrok (yyerrflag = 0)
13 #define YYRECOVERING() (yyerrflag != 0)
18 #define yyparse calc_parse
22 #define yylex calc_lex
26 #define yyerror calc_error
30 #define yychar calc_char
34 #define yyval calc_val
38 #define yylval calc_lval
42 #define yydebug calc_debug
46 #define yynerrs calc_nerrs
50 #define yyerrflag calc_errflag
51 #endif /* yyerrflag */
54 #define yylhs calc_lhs
58 #define yylen calc_len
62 #define yydefred calc_defred
66 #define yydgoto calc_dgoto
70 #define yysindex calc_sindex
74 #define yyrindex calc_rindex
78 #define yygindex calc_gindex
82 #define yytable calc_table
86 #define yycheck calc_check
90 #define yyname calc_name
94 #define yyrule calc_rule
96 #define YYPREFIX "calc_"
100 #line 2 "pure_calc.y"
109 #define YYLEX_PARAM &yylval
110 #define YYLEX_DECL() yylex(YYSTYPE *yylval)
111 #define YYERROR_DECL() yyerror(const char *s)
113 static void YYERROR_DECL();
116 #line 117 "pure_calc.tab.c"
118 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED)
119 /* Default: YYSTYPE is the semantic value type. */
121 # define YYSTYPE_IS_DECLARED 1
124 /* compatibility with bison */
126 /* compatibility with FreeBSD */
127 # ifdef YYPARSE_PARAM_TYPE
128 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
130 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
133 # define YYPARSE_DECL() yyparse(void)
136 /* Parameters sent to lex. */
138 # ifdef YYLEX_PARAM_TYPE
139 # define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM)
141 # define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM)
143 # define YYLEX yylex(&yylval, YYLEX_PARAM)
145 # define YYLEX_DECL() yylex(YYSTYPE *yylval)
146 # define YYLEX yylex(&yylval)
149 /* Parameters sent to yyerror. */
151 #define YYERROR_DECL() yyerror(const char *s)
154 #define YYERROR_CALL(msg) yyerror(msg)
157 extern int YYPARSE_DECL();
162 #define YYERRCODE 256
164 static const YYINT calc_lhs[] = { -1,
165 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
166 2, 2, 2, 2, 2, 2, 3, 3,
168 static const YYINT calc_len[] = { 2,
169 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
170 3, 3, 3, 2, 1, 1, 1, 2,
172 static const YYINT calc_defred[] = { 1,
173 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
174 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
175 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
178 static const YYINT calc_dgoto[] = { 1,
181 static const YYINT calc_sindex[] = { 0,
182 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
183 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
184 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
187 static const YYINT calc_rindex[] = { 0,
188 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
189 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
190 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
193 static const YYINT calc_gindex[] = { 0,
196 #define YYTABLESIZE 220
197 static const YYINT calc_table[] = { 6,
198 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
199 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
200 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
201 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
202 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
203 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
204 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
205 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
206 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
207 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
208 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
209 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
210 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
211 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
212 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
221 static const YYINT calc_check[] = { 40,
222 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
223 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
224 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
225 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
226 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
227 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
228 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
229 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
230 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
231 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
232 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
233 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
234 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
235 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
236 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
237 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
238 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
239 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
240 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
241 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
242 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
243 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
249 #define YYMAXTOKEN 259
250 #define YYUNDFTOKEN 265
251 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
253 static const char *const calc_name[] = {
255 "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,
256 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,
257 0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
258 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0,
259 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
260 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
261 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
262 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol",
264 static const char *const calc_rule[] = {
267 "list : list stat '\\n'",
268 "list : list error '\\n'",
270 "stat : LETTER '=' expr",
271 "expr : '(' expr ')'",
272 "expr : expr '+' expr",
273 "expr : expr '-' expr",
274 "expr : expr '*' expr",
275 "expr : expr '/' expr",
276 "expr : expr '%' expr",
277 "expr : expr '&' expr",
278 "expr : expr '|' expr",
283 "number : number DIGIT",
291 /* define the initial stack-sizes */
294 #define YYMAXDEPTH YYSTACKSIZE
297 #define YYSTACKSIZE YYMAXDEPTH
299 #define YYSTACKSIZE 10000
300 #define YYMAXDEPTH 10000
304 #define YYINITSTACKSIZE 200
314 #line 72 "pure_calc.y"
315 /* start of programs */
318 static int YYLEX_DECL();
324 while(!feof(stdin)) {
333 fprintf(stderr, "%s\n", s);
339 /* lexical analysis routine */
340 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
341 /* return DIGIT for a digit, yylval = 0 through 9 */
342 /* all other characters are returned immediately */
346 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
348 /* c is now nonblank */
360 #line 361 "pure_calc.tab.c"
363 #include <stdio.h> /* needed for printf */
366 #include <stdlib.h> /* needed for malloc, etc */
367 #include <string.h> /* needed for memset */
369 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
370 static int yygrowstack(YYSTACKDATA *data)
377 if ((newsize = data->stacksize) == 0)
378 newsize = YYINITSTACKSIZE;
379 else if (newsize >= YYMAXDEPTH)
381 else if ((newsize *= 2) > YYMAXDEPTH)
382 newsize = YYMAXDEPTH;
384 i = (int) (data->s_mark - data->s_base);
385 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
389 data->s_base = newss;
390 data->s_mark = newss + i;
392 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
396 data->l_base = newvs;
397 data->l_mark = newvs + i;
399 data->stacksize = newsize;
400 data->s_last = data->s_base + newsize - 1;
404 #if YYPURE || defined(YY_NO_LEAKS)
405 static void yyfreestack(YYSTACKDATA *data)
409 memset(data, 0, sizeof(*data));
412 #define yyfreestack(data) /* nothing */
415 #define YYABORT goto yyabort
416 #define YYREJECT goto yyabort
417 #define YYACCEPT goto yyaccept
418 #define YYERROR goto yyerrlab
428 /* variables for the parser stack */
430 int yym, yyn, yystate;
434 if ((yys = getenv("YYDEBUG")) != 0)
437 if (yyn >= '0' && yyn <= '9')
450 memset(&yystack, 0, sizeof(yystack));
453 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
454 yystack.s_mark = yystack.s_base;
455 yystack.l_mark = yystack.l_base;
460 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
464 if (yychar < 0) yychar = YYEOF;
468 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
469 printf("%sdebug: state %d, reading %d (%s)\n",
470 YYPREFIX, yystate, yychar, yys);
474 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
475 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
479 printf("%sdebug: state %d, shifting to state %d\n",
480 YYPREFIX, yystate, yytable[yyn]);
482 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
483 yystate = yytable[yyn];
484 *++yystack.s_mark = yytable[yyn];
485 *++yystack.l_mark = yylval;
487 if (yyerrflag > 0) --yyerrflag;
490 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
491 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
496 if (yyerrflag != 0) goto yyinrecovery;
498 YYERROR_CALL("syntax error");
500 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
510 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
511 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
515 printf("%sdebug: state %d, error recovery shifting\
516 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
518 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
519 yystate = yytable[yyn];
520 *++yystack.s_mark = yytable[yyn];
521 *++yystack.l_mark = yylval;
528 printf("%sdebug: error recovery discarding state %d\n",
529 YYPREFIX, *yystack.s_mark);
531 if (yystack.s_mark <= yystack.s_base) goto yyabort;
539 if (yychar == YYEOF) goto yyabort;
543 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
544 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
545 YYPREFIX, yystate, yychar, yys);
555 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
556 YYPREFIX, yystate, yyn, yyrule[yyn]);
560 yyval = yystack.l_mark[1-yym];
562 memset(&yyval, 0, sizeof yyval);
567 #line 34 "pure_calc.y"
571 #line 38 "pure_calc.y"
572 { printf("%d\n",yystack.l_mark[0]);}
575 #line 40 "pure_calc.y"
576 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
579 #line 44 "pure_calc.y"
580 { yyval = yystack.l_mark[-1]; }
583 #line 46 "pure_calc.y"
584 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
587 #line 48 "pure_calc.y"
588 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
591 #line 50 "pure_calc.y"
592 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
595 #line 52 "pure_calc.y"
596 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
599 #line 54 "pure_calc.y"
600 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
603 #line 56 "pure_calc.y"
604 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
607 #line 58 "pure_calc.y"
608 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
611 #line 60 "pure_calc.y"
612 { yyval = - yystack.l_mark[0]; }
615 #line 62 "pure_calc.y"
616 { yyval = regs[yystack.l_mark[0]]; }
619 #line 67 "pure_calc.y"
620 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
623 #line 69 "pure_calc.y"
624 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
626 #line 627 "pure_calc.tab.c"
628 yystack.s_mark -= yym;
629 yystate = *yystack.s_mark;
630 yystack.l_mark -= yym;
632 if (yystate == 0 && yym == 0)
636 printf("%sdebug: after reduction, shifting from state 0 to\
637 state %d\n", YYPREFIX, YYFINAL);
640 *++yystack.s_mark = YYFINAL;
641 *++yystack.l_mark = yyval;
645 if (yychar < 0) yychar = YYEOF;
649 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
650 printf("%sdebug: state %d, reading %d (%s)\n",
651 YYPREFIX, YYFINAL, yychar, yys);
655 if (yychar == YYEOF) goto yyaccept;
658 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
659 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
660 yystate = yytable[yyn];
662 yystate = yydgoto[yym];
665 printf("%sdebug: after reduction, shifting from state %d \
666 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
668 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
669 *++yystack.s_mark = (YYINT) yystate;
670 *++yystack.l_mark = yyval;
674 YYERROR_CALL("yacc stack overflow");
677 yyfreestack(&yystack);
681 yyfreestack(&yystack);