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 calc3_parse
22 #define yylex calc3_lex
26 #define yyerror calc3_error
30 #define yychar calc3_char
34 #define yyval calc3_val
38 #define yylval calc3_lval
42 #define yydebug calc3_debug
46 #define yynerrs calc3_nerrs
50 #define yyerrflag calc3_errflag
51 #endif /* yyerrflag */
54 #define yylhs calc3_lhs
58 #define yylen calc3_len
62 #define yydefred calc3_defred
66 #define yydgoto calc3_dgoto
70 #define yysindex calc3_sindex
74 #define yyrindex calc3_rindex
78 #define yygindex calc3_gindex
82 #define yytable calc3_table
86 #define yycheck calc3_check
90 #define yyname calc3_name
94 #define yyrule calc3_rule
96 #define YYPREFIX "calc3_"
106 #define YYLEX_PARAM base
107 #define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM)
108 #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
110 static void YYERROR_DECL();
113 #line 114 "calc3.tab.c"
115 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED)
116 /* Default: YYSTYPE is the semantic value type. */
118 # define YYSTYPE_IS_DECLARED 1
121 /* compatibility with bison */
123 /* compatibility with FreeBSD */
124 # ifdef YYPARSE_PARAM_TYPE
125 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
127 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
130 # define YYPARSE_DECL() yyparse(int regs[26], int *base)
133 /* Parameters sent to lex. */
135 # ifdef YYLEX_PARAM_TYPE
136 # define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM)
138 # define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM)
140 # define YYLEX yylex(&yylval, YYLEX_PARAM)
142 # define YYLEX_DECL() yylex(YYSTYPE *yylval, int *base)
143 # define YYLEX yylex(&yylval, base)
146 /* Parameters sent to yyerror. */
148 #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
151 #define YYERROR_CALL(msg) yyerror(regs, base, msg)
154 extern int YYPARSE_DECL();
159 #define YYERRCODE 256
161 static const YYINT calc3_lhs[] = { -1,
162 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
163 2, 2, 2, 2, 2, 2, 3, 3,
165 static const YYINT calc3_len[] = { 2,
166 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
167 3, 3, 3, 2, 1, 1, 1, 2,
169 static const YYINT calc3_defred[] = { 1,
170 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
171 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
172 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
175 static const YYINT calc3_dgoto[] = { 1,
178 static const YYINT calc3_sindex[] = { 0,
179 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
180 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
181 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
184 static const YYINT calc3_rindex[] = { 0,
185 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
186 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
187 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
190 static const YYINT calc3_gindex[] = { 0,
193 #define YYTABLESIZE 220
194 static const YYINT calc3_table[] = { 6,
195 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
196 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
197 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
198 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
199 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
200 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
201 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
202 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
203 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
204 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
205 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
206 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
207 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
208 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
209 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
210 0, 0, 0, 0, 0, 0, 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, 2, 3, 4, 3, 12,
218 static const YYINT calc3_check[] = { 40,
219 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
220 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
221 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
222 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
223 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
224 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
225 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
226 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
227 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
228 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
229 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
230 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
231 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
232 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
233 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
234 -1, -1, -1, -1, -1, -1, -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, 256, 257, 258, 257, 258,
246 #define YYMAXTOKEN 259
247 #define YYUNDFTOKEN 265
248 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
250 static const char *const calc3_name[] = {
252 "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,
253 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,0,0,0,0,0,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,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,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol",
261 static const char *const calc3_rule[] = {
264 "list : list stat '\\n'",
265 "list : list error '\\n'",
267 "stat : LETTER '=' expr",
268 "expr : '(' expr ')'",
269 "expr : 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",
280 "number : number DIGIT",
289 /* define the initial stack-sizes */
292 #define YYMAXDEPTH YYSTACKSIZE
295 #define YYSTACKSIZE YYMAXDEPTH
297 #define YYSTACKSIZE 10000
298 #define YYMAXDEPTH 10000
302 #define YYINITSTACKSIZE 200
313 /* start of programs */
316 extern int YYLEX_DECL();
325 while(!feof(stdin)) {
326 yyparse(regs, &base);
331 #define UNUSED(x) ((void)(x))
336 UNUSED(regs); /* %parse-param regs is not actually used here */
337 UNUSED(base); /* %parse-param base is not actually used here */
338 fprintf(stderr, "%s\n", s);
344 /* lexical analysis routine */
345 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
346 /* return DIGIT for a digit, yylval = 0 through 9 */
347 /* all other characters are returned immediately */
351 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
353 /* c is now nonblank */
360 *yylval = (c - '0') % (*base);
365 #line 366 "calc3.tab.c"
368 #include <stdio.h> /* needed for printf */
371 #include <stdlib.h> /* needed for malloc, etc */
372 #include <string.h> /* needed for memset */
374 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
375 static int yygrowstack(YYSTACKDATA *data)
382 if ((newsize = data->stacksize) == 0)
383 newsize = YYINITSTACKSIZE;
384 else if (newsize >= YYMAXDEPTH)
386 else if ((newsize *= 2) > YYMAXDEPTH)
387 newsize = YYMAXDEPTH;
389 i = (int) (data->s_mark - data->s_base);
390 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
394 data->s_base = newss;
395 data->s_mark = newss + i;
397 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
401 data->l_base = newvs;
402 data->l_mark = newvs + i;
404 data->stacksize = newsize;
405 data->s_last = data->s_base + newsize - 1;
409 #if YYPURE || defined(YY_NO_LEAKS)
410 static void yyfreestack(YYSTACKDATA *data)
414 memset(data, 0, sizeof(*data));
417 #define yyfreestack(data) /* nothing */
420 #define YYABORT goto yyabort
421 #define YYREJECT goto yyabort
422 #define YYACCEPT goto yyaccept
423 #define YYERROR goto yyerrlab
434 /* variables for the parser stack */
436 int yym, yyn, yystate;
440 if ((yys = getenv("YYDEBUG")) != 0)
443 if (yyn >= '0' && yyn <= '9')
448 memset(&yyval, 0, sizeof(yyval));
449 memset(&yylval, 0, sizeof(yylval));
459 memset(&yystack, 0, sizeof(yystack));
462 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
463 yystack.s_mark = yystack.s_base;
464 yystack.l_mark = yystack.l_base;
469 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
473 if (yychar < 0) yychar = YYEOF;
477 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
478 printf("%sdebug: state %d, reading %d (%s)\n",
479 YYPREFIX, yystate, yychar, yys);
483 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
484 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
488 printf("%sdebug: state %d, shifting to state %d\n",
489 YYPREFIX, yystate, yytable[yyn]);
491 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
492 yystate = yytable[yyn];
493 *++yystack.s_mark = yytable[yyn];
494 *++yystack.l_mark = yylval;
496 if (yyerrflag > 0) --yyerrflag;
499 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
500 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
505 if (yyerrflag != 0) goto yyinrecovery;
507 YYERROR_CALL("syntax error");
509 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
519 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
520 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
524 printf("%sdebug: state %d, error recovery shifting\
525 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
527 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
528 yystate = yytable[yyn];
529 *++yystack.s_mark = yytable[yyn];
530 *++yystack.l_mark = yylval;
537 printf("%sdebug: error recovery discarding state %d\n",
538 YYPREFIX, *yystack.s_mark);
540 if (yystack.s_mark <= yystack.s_base) goto yyabort;
548 if (yychar == YYEOF) goto yyabort;
552 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
553 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
554 YYPREFIX, yystate, yychar, yys);
564 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
565 YYPREFIX, yystate, yyn, yyrule[yyn]);
569 yyval = yystack.l_mark[1-yym];
571 memset(&yyval, 0, sizeof yyval);
581 { printf("%d\n",yystack.l_mark[0]);}
585 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
589 { yyval = yystack.l_mark[-1]; }
593 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
597 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
601 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
605 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
609 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
613 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
617 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
621 { yyval = - yystack.l_mark[0]; }
625 { yyval = regs[yystack.l_mark[0]]; }
629 { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; }
633 { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; }
635 #line 636 "calc3.tab.c"
637 yystack.s_mark -= yym;
638 yystate = *yystack.s_mark;
639 yystack.l_mark -= yym;
641 if (yystate == 0 && yym == 0)
645 printf("%sdebug: after reduction, shifting from state 0 to\
646 state %d\n", YYPREFIX, YYFINAL);
649 *++yystack.s_mark = YYFINAL;
650 *++yystack.l_mark = yyval;
654 if (yychar < 0) yychar = YYEOF;
658 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
659 printf("%sdebug: state %d, reading %d (%s)\n",
660 YYPREFIX, YYFINAL, yychar, yys);
664 if (yychar == YYEOF) goto yyaccept;
667 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
668 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
669 yystate = yytable[yyn];
671 yystate = yydgoto[yym];
674 printf("%sdebug: after reduction, shifting from state %d \
675 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
677 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
678 *++yystack.s_mark = (YYINT) yystate;
679 *++yystack.l_mark = yyval;
683 YYERROR_CALL("yacc stack overflow");
686 yyfreestack(&yystack);
690 yyfreestack(&yystack);