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')
448 memset(&yystack, 0, sizeof(yystack));
451 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
452 yystack.s_mark = yystack.s_base;
453 yystack.l_mark = yystack.l_base;
458 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
461 if ((yychar = YYLEX) < 0) yychar = YYEOF;
465 yys = yyname[YYTRANSLATE(yychar)];
466 printf("%sdebug: state %d, reading %d (%s)\n",
467 YYPREFIX, yystate, yychar, yys);
471 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
472 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
476 printf("%sdebug: state %d, shifting to state %d\n",
477 YYPREFIX, yystate, yytable[yyn]);
479 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
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]) && (yyn += yychar) >= 0 &&
491 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
496 if (yyerrflag) goto yyinrecovery;
498 YYERROR_CALL("syntax error");
511 if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
512 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
516 printf("%sdebug: state %d, error recovery shifting\
517 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
519 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
523 yystate = yytable[yyn];
524 *++yystack.s_mark = yytable[yyn];
525 *++yystack.l_mark = yylval;
532 printf("%sdebug: error recovery discarding state %d\n",
533 YYPREFIX, *yystack.s_mark);
535 if (yystack.s_mark <= yystack.s_base) goto yyabort;
543 if (yychar == YYEOF) goto yyabort;
547 yys = yyname[YYTRANSLATE(yychar)];
548 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
549 YYPREFIX, yystate, yychar, yys);
559 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
560 YYPREFIX, yystate, yyn, yyrule[yyn]);
564 yyval = yystack.l_mark[1-yym];
566 memset(&yyval, 0, sizeof yyval);
570 #line 34 "pure_calc.y"
574 #line 38 "pure_calc.y"
575 { printf("%d\n",yystack.l_mark[0]);}
578 #line 40 "pure_calc.y"
579 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
582 #line 44 "pure_calc.y"
583 { yyval = yystack.l_mark[-1]; }
586 #line 46 "pure_calc.y"
587 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
590 #line 48 "pure_calc.y"
591 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
594 #line 50 "pure_calc.y"
595 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
598 #line 52 "pure_calc.y"
599 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
602 #line 54 "pure_calc.y"
603 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
606 #line 56 "pure_calc.y"
607 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
610 #line 58 "pure_calc.y"
611 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
614 #line 60 "pure_calc.y"
615 { yyval = - yystack.l_mark[0]; }
618 #line 62 "pure_calc.y"
619 { yyval = regs[yystack.l_mark[0]]; }
622 #line 67 "pure_calc.y"
623 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
626 #line 69 "pure_calc.y"
627 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
629 #line 630 "pure_calc.tab.c"
631 yystack.s_mark -= yym;
632 yystate = *yystack.s_mark;
633 yystack.l_mark -= yym;
635 if (yystate == 0 && yym == 0)
639 printf("%sdebug: after reduction, shifting from state 0 to\
640 state %d\n", YYPREFIX, YYFINAL);
643 *++yystack.s_mark = YYFINAL;
644 *++yystack.l_mark = yyval;
647 if ((yychar = YYLEX) < 0) yychar = YYEOF;
651 yys = yyname[YYTRANSLATE(yychar)];
652 printf("%sdebug: state %d, reading %d (%s)\n",
653 YYPREFIX, YYFINAL, yychar, yys);
657 if (yychar == YYEOF) goto yyaccept;
660 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
661 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
662 yystate = yytable[yyn];
664 yystate = yydgoto[yym];
667 printf("%sdebug: after reduction, shifting from state %d \
668 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
670 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
674 *++yystack.s_mark = (YYINT) yystate;
675 *++yystack.l_mark = yyval;
679 YYERROR_CALL("yacc stack overflow");
682 yyfreestack(&yystack);
686 yyfreestack(&yystack);