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",
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
312 /* start of programs */
315 extern int YYLEX_DECL();
324 while(!feof(stdin)) {
325 yyparse(regs, &base);
330 #define UNUSED(x) ((void)(x))
335 UNUSED(regs); /* %parse-param regs is not actually used here */
336 UNUSED(base); /* %parse-param base is not actually used here */
337 fprintf(stderr, "%s\n", s);
343 /* lexical analysis routine */
344 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
345 /* return DIGIT for a digit, yylval = 0 through 9 */
346 /* all other characters are returned immediately */
350 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
352 /* c is now nonblank */
359 *yylval = (c - '0') % (*base);
364 #line 365 "calc3.tab.c"
367 #include <stdio.h> /* needed for printf */
370 #include <stdlib.h> /* needed for malloc, etc */
371 #include <string.h> /* needed for memset */
373 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
374 static int yygrowstack(YYSTACKDATA *data)
381 if ((newsize = data->stacksize) == 0)
382 newsize = YYINITSTACKSIZE;
383 else if (newsize >= YYMAXDEPTH)
385 else if ((newsize *= 2) > YYMAXDEPTH)
386 newsize = YYMAXDEPTH;
388 i = (int) (data->s_mark - data->s_base);
389 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
393 data->s_base = newss;
394 data->s_mark = newss + i;
396 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
400 data->l_base = newvs;
401 data->l_mark = newvs + i;
403 data->stacksize = newsize;
404 data->s_last = data->s_base + newsize - 1;
408 #if YYPURE || defined(YY_NO_LEAKS)
409 static void yyfreestack(YYSTACKDATA *data)
413 memset(data, 0, sizeof(*data));
416 #define yyfreestack(data) /* nothing */
419 #define YYABORT goto yyabort
420 #define YYREJECT goto yyabort
421 #define YYACCEPT goto yyaccept
422 #define YYERROR goto yyerrlab
432 /* variables for the parser stack */
434 int yym, yyn, yystate;
438 if ((yys = getenv("YYDEBUG")) != 0)
441 if (yyn >= '0' && yyn <= '9')
454 memset(&yystack, 0, sizeof(yystack));
457 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
458 yystack.s_mark = yystack.s_base;
459 yystack.l_mark = yystack.l_base;
464 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
468 if (yychar < 0) yychar = YYEOF;
472 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
473 printf("%sdebug: state %d, reading %d (%s)\n",
474 YYPREFIX, yystate, yychar, yys);
478 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
479 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
483 printf("%sdebug: state %d, shifting to state %d\n",
484 YYPREFIX, yystate, yytable[yyn]);
486 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
487 yystate = yytable[yyn];
488 *++yystack.s_mark = yytable[yyn];
489 *++yystack.l_mark = yylval;
491 if (yyerrflag > 0) --yyerrflag;
494 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
495 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
500 if (yyerrflag != 0) goto yyinrecovery;
502 YYERROR_CALL("syntax error");
504 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
514 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
515 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
519 printf("%sdebug: state %d, error recovery shifting\
520 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
522 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
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 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
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);
576 { printf("%d\n",yystack.l_mark[0]);}
580 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
584 { yyval = yystack.l_mark[-1]; }
588 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
592 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
596 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
600 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
604 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
608 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
612 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
616 { yyval = - yystack.l_mark[0]; }
620 { yyval = regs[yystack.l_mark[0]]; }
624 { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; }
628 { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; }
630 #line 631 "calc3.tab.c"
632 yystack.s_mark -= yym;
633 yystate = *yystack.s_mark;
634 yystack.l_mark -= yym;
636 if (yystate == 0 && yym == 0)
640 printf("%sdebug: after reduction, shifting from state 0 to\
641 state %d\n", YYPREFIX, YYFINAL);
644 *++yystack.s_mark = YYFINAL;
645 *++yystack.l_mark = yyval;
649 if (yychar < 0) yychar = YYEOF;
653 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
654 printf("%sdebug: state %d, reading %d (%s)\n",
655 YYPREFIX, YYFINAL, yychar, yys);
659 if (yychar == YYEOF) goto yyaccept;
662 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
663 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
664 yystate = yytable[yyn];
666 yystate = yydgoto[yym];
669 printf("%sdebug: after reduction, shifting from state %d \
670 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
672 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
673 *++yystack.s_mark = (YYINT) yystate;
674 *++yystack.l_mark = yyval;
678 YYERROR_CALL("yacc stack overflow");
681 yyfreestack(&yystack);
685 yyfreestack(&yystack);