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 calc2_parse
22 #define yylex calc2_lex
26 #define yyerror calc2_error
30 #define yychar calc2_char
34 #define yyval calc2_val
38 #define yylval calc2_lval
42 #define yydebug calc2_debug
46 #define yynerrs calc2_nerrs
50 #define yyerrflag calc2_errflag
51 #endif /* yyerrflag */
54 #define yylhs calc2_lhs
58 #define yylen calc2_len
62 #define yydefred calc2_defred
66 #define yydgoto calc2_dgoto
70 #define yysindex calc2_sindex
74 #define yyrindex calc2_rindex
78 #define yygindex calc2_gindex
82 #define yytable calc2_table
86 #define yycheck calc2_check
90 #define yyname calc2_name
94 #define yyrule calc2_rule
96 #define YYPREFIX "calc2_"
105 #define YYLEX_PARAM base
106 #define YYLEX_DECL() yylex(int *YYLEX_PARAM)
107 #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
109 static void YYERROR_DECL();
112 #line 113 "calc2.tab.c"
114 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED)
115 /* Default: YYSTYPE is the semantic value type. */
117 # define YYSTYPE_IS_DECLARED 1
120 /* compatibility with bison */
122 /* compatibility with FreeBSD */
123 # ifdef YYPARSE_PARAM_TYPE
124 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
126 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
129 # define YYPARSE_DECL() yyparse(int regs[26], int *base)
132 /* Parameters sent to lex. */
134 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
135 # define YYLEX yylex(YYLEX_PARAM)
137 # define YYLEX_DECL() yylex(int *base)
138 # define YYLEX yylex(base)
141 /* Parameters sent to yyerror. */
143 #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
146 #define YYERROR_CALL(msg) yyerror(regs, base, msg)
149 extern int YYPARSE_DECL();
154 #define YYERRCODE 256
156 static const YYINT calc2_lhs[] = { -1,
157 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
158 2, 2, 2, 2, 2, 2, 3, 3,
160 static const YYINT calc2_len[] = { 2,
161 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
162 3, 3, 3, 2, 1, 1, 1, 2,
164 static const YYINT calc2_defred[] = { 1,
165 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
166 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
167 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
170 static const YYINT calc2_dgoto[] = { 1,
173 static const YYINT calc2_sindex[] = { 0,
174 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
175 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
176 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
179 static const YYINT calc2_rindex[] = { 0,
180 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
181 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
182 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
185 static const YYINT calc2_gindex[] = { 0,
188 #define YYTABLESIZE 220
189 static const YYINT calc2_table[] = { 6,
190 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
191 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
192 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
193 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
194 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
195 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
196 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
197 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
198 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
199 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
200 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
201 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
202 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
203 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
204 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
205 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
206 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
208 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
209 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
210 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
213 static const YYINT calc2_check[] = { 40,
214 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
215 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
216 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
217 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
218 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
219 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
220 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
221 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
222 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
223 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
224 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
225 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
226 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
227 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
228 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
229 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
230 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
231 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
232 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
233 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
234 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
235 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
241 #define YYMAXTOKEN 259
242 #define YYUNDFTOKEN 265
243 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
245 static const char *const calc2_name[] = {
247 "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,
248 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,
249 0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
250 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0,
251 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
252 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
253 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol",
256 static const char *const calc2_rule[] = {
259 "list : list stat '\\n'",
260 "list : list error '\\n'",
262 "stat : LETTER '=' expr",
263 "expr : '(' expr ')'",
264 "expr : expr '+' expr",
265 "expr : expr '-' expr",
266 "expr : expr '*' expr",
267 "expr : expr '/' expr",
268 "expr : expr '%' expr",
269 "expr : expr '&' expr",
270 "expr : expr '|' expr",
275 "number : number DIGIT",
288 /* define the initial stack-sizes */
291 #define YYMAXDEPTH YYSTACKSIZE
294 #define YYSTACKSIZE YYMAXDEPTH
296 #define YYSTACKSIZE 10000
297 #define YYMAXDEPTH 10000
301 #define YYINITSTACKSIZE 200
311 /* variables for the parser stack */
312 static YYSTACKDATA yystack;
314 /* start of programs */
317 extern int YYLEX_DECL();
326 while(!feof(stdin)) {
327 yyparse(regs, &base);
332 #define UNUSED(x) ((void)(x))
337 UNUSED(regs); /* %parse-param regs is not actually used here */
338 UNUSED(base); /* %parse-param base is not actually used here */
339 fprintf(stderr, "%s\n", s);
345 /* lexical analysis routine */
346 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
347 /* return DIGIT for a digit, yylval = 0 through 9 */
348 /* all other characters are returned immediately */
352 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
354 /* c is now nonblank */
361 yylval = (c - '0') % (*base);
366 #line 367 "calc2.tab.c"
369 #include <stdio.h> /* needed for printf */
372 #include <stdlib.h> /* needed for malloc, etc */
373 #include <string.h> /* needed for memset */
375 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
376 static int yygrowstack(YYSTACKDATA *data)
383 if ((newsize = data->stacksize) == 0)
384 newsize = YYINITSTACKSIZE;
385 else if (newsize >= YYMAXDEPTH)
387 else if ((newsize *= 2) > YYMAXDEPTH)
388 newsize = YYMAXDEPTH;
390 i = (int) (data->s_mark - data->s_base);
391 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
395 data->s_base = newss;
396 data->s_mark = newss + i;
398 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
402 data->l_base = newvs;
403 data->l_mark = newvs + i;
405 data->stacksize = newsize;
406 data->s_last = data->s_base + newsize - 1;
410 #if YYPURE || defined(YY_NO_LEAKS)
411 static void yyfreestack(YYSTACKDATA *data)
415 memset(data, 0, sizeof(*data));
418 #define yyfreestack(data) /* nothing */
421 #define YYABORT goto yyabort
422 #define YYREJECT goto yyabort
423 #define YYACCEPT goto yyaccept
424 #define YYERROR goto yyerrlab
429 int yym, yyn, yystate;
433 if ((yys = getenv("YYDEBUG")) != 0)
436 if (yyn >= '0' && yyn <= '9')
449 memset(&yystack, 0, sizeof(yystack));
452 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
453 yystack.s_mark = yystack.s_base;
454 yystack.l_mark = yystack.l_base;
459 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
463 if (yychar < 0) yychar = YYEOF;
467 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
468 printf("%sdebug: state %d, reading %d (%s)\n",
469 YYPREFIX, yystate, yychar, yys);
473 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
474 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
478 printf("%sdebug: state %d, shifting to state %d\n",
479 YYPREFIX, yystate, yytable[yyn]);
481 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
482 yystate = yytable[yyn];
483 *++yystack.s_mark = yytable[yyn];
484 *++yystack.l_mark = yylval;
486 if (yyerrflag > 0) --yyerrflag;
489 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
490 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
495 if (yyerrflag != 0) goto yyinrecovery;
497 YYERROR_CALL("syntax error");
499 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
509 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
510 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
514 printf("%sdebug: state %d, error recovery shifting\
515 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
517 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
518 yystate = yytable[yyn];
519 *++yystack.s_mark = yytable[yyn];
520 *++yystack.l_mark = yylval;
527 printf("%sdebug: error recovery discarding state %d\n",
528 YYPREFIX, *yystack.s_mark);
530 if (yystack.s_mark <= yystack.s_base) goto yyabort;
538 if (yychar == YYEOF) goto yyabort;
542 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
543 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
544 YYPREFIX, yystate, yychar, yys);
554 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
555 YYPREFIX, yystate, yyn, yyrule[yyn]);
559 yyval = yystack.l_mark[1-yym];
561 memset(&yyval, 0, sizeof yyval);
571 { printf("%d\n",yystack.l_mark[0]);}
575 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
579 { yyval = yystack.l_mark[-1]; }
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[-2] / yystack.l_mark[0]; }
599 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
603 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
607 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
611 { yyval = - yystack.l_mark[0]; }
615 { yyval = regs[yystack.l_mark[0]]; }
619 { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; }
623 { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; }
625 #line 626 "calc2.tab.c"
627 yystack.s_mark -= yym;
628 yystate = *yystack.s_mark;
629 yystack.l_mark -= yym;
631 if (yystate == 0 && yym == 0)
635 printf("%sdebug: after reduction, shifting from state 0 to\
636 state %d\n", YYPREFIX, YYFINAL);
639 *++yystack.s_mark = YYFINAL;
640 *++yystack.l_mark = yyval;
644 if (yychar < 0) yychar = YYEOF;
648 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
649 printf("%sdebug: state %d, reading %d (%s)\n",
650 YYPREFIX, YYFINAL, yychar, yys);
654 if (yychar == YYEOF) goto yyaccept;
657 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
658 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
659 yystate = yytable[yyn];
661 yystate = yydgoto[yym];
664 printf("%sdebug: after reduction, shifting from state %d \
665 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
667 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
668 *++yystack.s_mark = (YYINT) yystate;
669 *++yystack.l_mark = yyval;
673 YYERROR_CALL("yacc stack overflow");
676 yyfreestack(&yystack);
680 yyfreestack(&yystack);