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)
17 /* %code "top" block start */
18 #line 1 "calc_code_top.y"
20 #line 2 "calc_code_top.y"
22 /* %code "top" block end */
23 #line 24 "calc_code_top.tab.c"
26 #define yyparse calc_code_top_parse
30 #define yylex calc_code_top_lex
34 #define yyerror calc_code_top_error
38 #define yychar calc_code_top_char
42 #define yyval calc_code_top_val
46 #define yylval calc_code_top_lval
50 #define yydebug calc_code_top_debug
54 #define yynerrs calc_code_top_nerrs
58 #define yyerrflag calc_code_top_errflag
59 #endif /* yyerrflag */
62 #define yylhs calc_code_top_lhs
66 #define yylen calc_code_top_len
70 #define yydefred calc_code_top_defred
74 #define yydgoto calc_code_top_dgoto
78 #define yysindex calc_code_top_sindex
82 #define yyrindex calc_code_top_rindex
86 #define yygindex calc_code_top_gindex
90 #define yytable calc_code_top_table
94 #define yycheck calc_code_top_check
98 #define yyname calc_code_top_name
102 #define yyrule calc_code_top_rule
104 #define YYPREFIX "calc_code_top_"
108 #line 5 "calc_code_top.y"
115 extern int yylex(void);
116 static void yyerror(const char *s);
118 #line 119 "calc_code_top.tab.c"
120 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED)
121 /* Default: YYSTYPE is the semantic value type. */
123 # define YYSTYPE_IS_DECLARED 1
126 /* compatibility with bison */
128 /* compatibility with FreeBSD */
129 # ifdef YYPARSE_PARAM_TYPE
130 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
132 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
135 # define YYPARSE_DECL() yyparse(void)
138 /* Parameters sent to lex. */
140 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
141 # define YYLEX yylex(YYLEX_PARAM)
143 # define YYLEX_DECL() yylex(void)
144 # define YYLEX yylex()
147 /* Parameters sent to yyerror. */
149 #define YYERROR_DECL() yyerror(const char *s)
152 #define YYERROR_CALL(msg) yyerror(msg)
155 extern int YYPARSE_DECL();
160 #define YYERRCODE 256
162 static const YYINT calc_code_top_lhs[] = { -1,
163 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
164 2, 2, 2, 2, 2, 2, 3, 3,
166 static const YYINT calc_code_top_len[] = { 2,
167 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
168 3, 3, 3, 2, 1, 1, 1, 2,
170 static const YYINT calc_code_top_defred[] = { 1,
171 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
172 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
173 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
176 static const YYINT calc_code_top_dgoto[] = { 1,
179 static const YYINT calc_code_top_sindex[] = { 0,
180 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
181 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
182 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
185 static const YYINT calc_code_top_rindex[] = { 0,
186 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
187 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
188 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
191 static const YYINT calc_code_top_gindex[] = { 0,
194 #define YYTABLESIZE 220
195 static const YYINT calc_code_top_table[] = { 6,
196 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
197 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
198 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
199 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
200 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
201 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
202 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
203 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
204 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
205 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
206 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
207 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
208 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
209 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
210 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 3, 12,
219 static const YYINT calc_code_top_check[] = { 40,
220 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
221 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
222 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
223 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
224 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
225 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
226 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
227 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
228 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
229 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
230 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
231 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
232 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
233 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
234 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
235 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
236 -1, -1, -1, -1, -1, -1, -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, 256, 257, 258, 257, 258,
247 #define YYMAXTOKEN 259
248 #define YYUNDFTOKEN 265
249 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
251 static const char *const calc_code_top_name[] = {
253 "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,
254 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,
255 0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,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,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol",
262 static const char *const calc_code_top_rule[] = {
265 "list : list stat '\\n'",
266 "list : list error '\\n'",
268 "stat : LETTER '=' expr",
269 "expr : '(' expr ')'",
270 "expr : expr '+' expr",
271 "expr : expr '-' expr",
272 "expr : expr '*' expr",
273 "expr : expr '/' expr",
274 "expr : expr '%' expr",
275 "expr : expr '&' expr",
276 "expr : expr '|' expr",
281 "number : number DIGIT",
296 /* define the initial stack-sizes */
299 #define YYMAXDEPTH YYSTACKSIZE
302 #define YYSTACKSIZE YYMAXDEPTH
304 #define YYSTACKSIZE 10000
305 #define YYMAXDEPTH 10000
309 #define YYINITSTACKSIZE 200
319 /* variables for the parser stack */
320 static YYSTACKDATA yystack;
321 #line 69 "calc_code_top.y"
322 /* start of programs */
327 while(!feof(stdin)) {
334 yyerror(const char *s)
336 fprintf(stderr, "%s\n", s);
342 /* lexical analysis routine */
343 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
344 /* return DIGIT for a digit, yylval = 0 through 9 */
345 /* all other characters are returned immediately */
349 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
351 /* c is now nonblank */
363 #line 364 "calc_code_top.tab.c"
366 #include <stdio.h> /* needed for printf */
369 #include <stdlib.h> /* needed for malloc, etc */
370 #include <string.h> /* needed for memset */
372 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
373 static int yygrowstack(YYSTACKDATA *data)
380 if ((newsize = data->stacksize) == 0)
381 newsize = YYINITSTACKSIZE;
382 else if (newsize >= YYMAXDEPTH)
384 else if ((newsize *= 2) > YYMAXDEPTH)
385 newsize = YYMAXDEPTH;
387 i = (int) (data->s_mark - data->s_base);
388 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
392 data->s_base = newss;
393 data->s_mark = newss + i;
395 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
399 data->l_base = newvs;
400 data->l_mark = newvs + i;
402 data->stacksize = newsize;
403 data->s_last = data->s_base + newsize - 1;
407 #if YYPURE || defined(YY_NO_LEAKS)
408 static void yyfreestack(YYSTACKDATA *data)
412 memset(data, 0, sizeof(*data));
415 #define yyfreestack(data) /* nothing */
418 #define YYABORT goto yyabort
419 #define YYREJECT goto yyabort
420 #define YYACCEPT goto yyaccept
421 #define YYERROR goto yyerrlab
426 int yym, yyn, yystate;
430 if ((yys = getenv("YYDEBUG")) != 0)
433 if (yyn >= '0' && yyn <= '9')
446 memset(&yystack, 0, sizeof(yystack));
449 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
450 yystack.s_mark = yystack.s_base;
451 yystack.l_mark = yystack.l_base;
456 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
460 if (yychar < 0) yychar = YYEOF;
464 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
465 printf("%sdebug: state %d, reading %d (%s)\n",
466 YYPREFIX, yystate, yychar, yys);
470 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
471 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
475 printf("%sdebug: state %d, shifting to state %d\n",
476 YYPREFIX, yystate, yytable[yyn]);
478 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
479 yystate = yytable[yyn];
480 *++yystack.s_mark = yytable[yyn];
481 *++yystack.l_mark = yylval;
483 if (yyerrflag > 0) --yyerrflag;
486 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
487 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
492 if (yyerrflag != 0) goto yyinrecovery;
494 YYERROR_CALL("syntax error");
496 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
506 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
507 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
511 printf("%sdebug: state %d, error recovery shifting\
512 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
514 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
515 yystate = yytable[yyn];
516 *++yystack.s_mark = yytable[yyn];
517 *++yystack.l_mark = yylval;
524 printf("%sdebug: error recovery discarding state %d\n",
525 YYPREFIX, *yystack.s_mark);
527 if (yystack.s_mark <= yystack.s_base) goto yyabort;
535 if (yychar == YYEOF) goto yyabort;
539 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
540 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
541 YYPREFIX, yystate, yychar, yys);
551 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
552 YYPREFIX, yystate, yyn, yyrule[yyn]);
556 yyval = yystack.l_mark[1-yym];
558 memset(&yyval, 0, sizeof yyval);
563 #line 31 "calc_code_top.y"
567 #line 35 "calc_code_top.y"
568 { printf("%d\n",yystack.l_mark[0]);}
571 #line 37 "calc_code_top.y"
572 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
575 #line 41 "calc_code_top.y"
576 { yyval = yystack.l_mark[-1]; }
579 #line 43 "calc_code_top.y"
580 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
583 #line 45 "calc_code_top.y"
584 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
587 #line 47 "calc_code_top.y"
588 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
591 #line 49 "calc_code_top.y"
592 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
595 #line 51 "calc_code_top.y"
596 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
599 #line 53 "calc_code_top.y"
600 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
603 #line 55 "calc_code_top.y"
604 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
607 #line 57 "calc_code_top.y"
608 { yyval = - yystack.l_mark[0]; }
611 #line 59 "calc_code_top.y"
612 { yyval = regs[yystack.l_mark[0]]; }
615 #line 64 "calc_code_top.y"
616 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
619 #line 66 "calc_code_top.y"
620 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
622 #line 623 "calc_code_top.tab.c"
624 yystack.s_mark -= yym;
625 yystate = *yystack.s_mark;
626 yystack.l_mark -= yym;
628 if (yystate == 0 && yym == 0)
632 printf("%sdebug: after reduction, shifting from state 0 to\
633 state %d\n", YYPREFIX, YYFINAL);
636 *++yystack.s_mark = YYFINAL;
637 *++yystack.l_mark = yyval;
641 if (yychar < 0) yychar = YYEOF;
645 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
646 printf("%sdebug: state %d, reading %d (%s)\n",
647 YYPREFIX, YYFINAL, yychar, yys);
651 if (yychar == YYEOF) goto yyaccept;
654 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
655 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
656 yystate = yytable[yyn];
658 yystate = yydgoto[yym];
661 printf("%sdebug: after reduction, shifting from state %d \
662 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
664 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
665 *++yystack.s_mark = (YYINT) yystate;
666 *++yystack.l_mark = yyval;
670 YYERROR_CALL("yacc stack overflow");
673 yyfreestack(&yystack);
677 yyfreestack(&yystack);