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",
292 /* define the initial stack-sizes */
295 #define YYMAXDEPTH YYSTACKSIZE
298 #define YYSTACKSIZE YYMAXDEPTH
300 #define YYSTACKSIZE 10000
301 #define YYMAXDEPTH 10000
305 #define YYINITSTACKSIZE 200
315 #line 72 "pure_calc.y"
316 /* start of programs */
319 static int YYLEX_DECL();
325 while(!feof(stdin)) {
334 fprintf(stderr, "%s\n", s);
340 /* lexical analysis routine */
341 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
342 /* return DIGIT for a digit, yylval = 0 through 9 */
343 /* all other characters are returned immediately */
347 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
349 /* c is now nonblank */
361 #line 362 "pure_calc.tab.c"
364 #include <stdio.h> /* needed for printf */
367 #include <stdlib.h> /* needed for malloc, etc */
368 #include <string.h> /* needed for memset */
370 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
371 static int yygrowstack(YYSTACKDATA *data)
378 if ((newsize = data->stacksize) == 0)
379 newsize = YYINITSTACKSIZE;
380 else if (newsize >= YYMAXDEPTH)
382 else if ((newsize *= 2) > YYMAXDEPTH)
383 newsize = YYMAXDEPTH;
385 i = (int) (data->s_mark - data->s_base);
386 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
390 data->s_base = newss;
391 data->s_mark = newss + i;
393 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
397 data->l_base = newvs;
398 data->l_mark = newvs + i;
400 data->stacksize = newsize;
401 data->s_last = data->s_base + newsize - 1;
405 #if YYPURE || defined(YY_NO_LEAKS)
406 static void yyfreestack(YYSTACKDATA *data)
410 memset(data, 0, sizeof(*data));
413 #define yyfreestack(data) /* nothing */
416 #define YYABORT goto yyabort
417 #define YYREJECT goto yyabort
418 #define YYACCEPT goto yyaccept
419 #define YYERROR goto yyerrlab
430 /* variables for the parser stack */
432 int yym, yyn, yystate;
436 if ((yys = getenv("YYDEBUG")) != 0)
439 if (yyn >= '0' && yyn <= '9')
444 memset(&yyval, 0, sizeof(yyval));
445 memset(&yylval, 0, sizeof(yylval));
455 memset(&yystack, 0, sizeof(yystack));
458 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
459 yystack.s_mark = yystack.s_base;
460 yystack.l_mark = yystack.l_base;
465 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
469 if (yychar < 0) yychar = YYEOF;
473 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
474 printf("%sdebug: state %d, reading %d (%s)\n",
475 YYPREFIX, yystate, yychar, yys);
479 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
480 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
484 printf("%sdebug: state %d, shifting to state %d\n",
485 YYPREFIX, yystate, yytable[yyn]);
487 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
488 yystate = yytable[yyn];
489 *++yystack.s_mark = yytable[yyn];
490 *++yystack.l_mark = yylval;
492 if (yyerrflag > 0) --yyerrflag;
495 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
496 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
501 if (yyerrflag != 0) goto yyinrecovery;
503 YYERROR_CALL("syntax error");
505 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
515 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
516 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
520 printf("%sdebug: state %d, error recovery shifting\
521 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
523 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
524 yystate = yytable[yyn];
525 *++yystack.s_mark = yytable[yyn];
526 *++yystack.l_mark = yylval;
533 printf("%sdebug: error recovery discarding state %d\n",
534 YYPREFIX, *yystack.s_mark);
536 if (yystack.s_mark <= yystack.s_base) goto yyabort;
544 if (yychar == YYEOF) goto yyabort;
548 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
549 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
550 YYPREFIX, yystate, yychar, yys);
560 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
561 YYPREFIX, yystate, yyn, yyrule[yyn]);
565 yyval = yystack.l_mark[1-yym];
567 memset(&yyval, 0, sizeof yyval);
572 #line 34 "pure_calc.y"
576 #line 38 "pure_calc.y"
577 { printf("%d\n",yystack.l_mark[0]);}
580 #line 40 "pure_calc.y"
581 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
584 #line 44 "pure_calc.y"
585 { yyval = yystack.l_mark[-1]; }
588 #line 46 "pure_calc.y"
589 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
592 #line 48 "pure_calc.y"
593 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
596 #line 50 "pure_calc.y"
597 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
600 #line 52 "pure_calc.y"
601 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
604 #line 54 "pure_calc.y"
605 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
608 #line 56 "pure_calc.y"
609 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
612 #line 58 "pure_calc.y"
613 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
616 #line 60 "pure_calc.y"
617 { yyval = - yystack.l_mark[0]; }
620 #line 62 "pure_calc.y"
621 { yyval = regs[yystack.l_mark[0]]; }
624 #line 67 "pure_calc.y"
625 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
628 #line 69 "pure_calc.y"
629 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
631 #line 632 "pure_calc.tab.c"
633 yystack.s_mark -= yym;
634 yystate = *yystack.s_mark;
635 yystack.l_mark -= yym;
637 if (yystate == 0 && yym == 0)
641 printf("%sdebug: after reduction, shifting from state 0 to\
642 state %d\n", YYPREFIX, YYFINAL);
645 *++yystack.s_mark = YYFINAL;
646 *++yystack.l_mark = yyval;
650 if (yychar < 0) yychar = YYEOF;
654 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
655 printf("%sdebug: state %d, reading %d (%s)\n",
656 YYPREFIX, YYFINAL, yychar, yys);
660 if (yychar == YYEOF) goto yyaccept;
663 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
664 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
665 yystate = yytable[yyn];
667 yystate = yydgoto[yym];
670 printf("%sdebug: after reduction, shifting from state %d \
671 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
673 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
674 *++yystack.s_mark = (YYINT) yystate;
675 *++yystack.l_mark = yyval;
679 YYERROR_CALL("yacc stack overflow");
682 yyfreestack(&yystack);
686 yyfreestack(&yystack);