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')
452 memset(&yystack, 0, sizeof(yystack));
455 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
456 yystack.s_mark = yystack.s_base;
457 yystack.l_mark = yystack.l_base;
462 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
465 if ((yychar = YYLEX) < 0) yychar = YYEOF;
469 yys = yyname[YYTRANSLATE(yychar)];
470 printf("%sdebug: state %d, reading %d (%s)\n",
471 YYPREFIX, yystate, yychar, yys);
475 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
476 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
480 printf("%sdebug: state %d, shifting to state %d\n",
481 YYPREFIX, yystate, yytable[yyn]);
483 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
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]) && (yyn += yychar) >= 0 &&
495 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
500 if (yyerrflag) goto yyinrecovery;
502 YYERROR_CALL("syntax error");
515 if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
516 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
520 printf("%sdebug: state %d, error recovery shifting\
521 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
523 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
527 yystate = yytable[yyn];
528 *++yystack.s_mark = yytable[yyn];
529 *++yystack.l_mark = yylval;
536 printf("%sdebug: error recovery discarding state %d\n",
537 YYPREFIX, *yystack.s_mark);
539 if (yystack.s_mark <= yystack.s_base) goto yyabort;
547 if (yychar == YYEOF) goto yyabort;
551 yys = yyname[YYTRANSLATE(yychar)];
552 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
553 YYPREFIX, yystate, yychar, yys);
563 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
564 YYPREFIX, yystate, yyn, yyrule[yyn]);
568 yyval = yystack.l_mark[1-yym];
570 memset(&yyval, 0, sizeof yyval);
579 { printf("%d\n",yystack.l_mark[0]);}
583 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
587 { yyval = yystack.l_mark[-1]; }
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[-2] & yystack.l_mark[0]; }
615 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
619 { yyval = - yystack.l_mark[0]; }
623 { yyval = regs[yystack.l_mark[0]]; }
627 { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; }
631 { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; }
633 #line 634 "calc3.tab.c"
635 yystack.s_mark -= yym;
636 yystate = *yystack.s_mark;
637 yystack.l_mark -= yym;
639 if (yystate == 0 && yym == 0)
643 printf("%sdebug: after reduction, shifting from state 0 to\
644 state %d\n", YYPREFIX, YYFINAL);
647 *++yystack.s_mark = YYFINAL;
648 *++yystack.l_mark = yyval;
651 if ((yychar = YYLEX) < 0) yychar = YYEOF;
655 yys = yyname[YYTRANSLATE(yychar)];
656 printf("%sdebug: state %d, reading %d (%s)\n",
657 YYPREFIX, YYFINAL, yychar, yys);
661 if (yychar == YYEOF) goto yyaccept;
664 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
665 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
666 yystate = yytable[yyn];
668 yystate = yydgoto[yym];
671 printf("%sdebug: after reduction, shifting from state %d \
672 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
674 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM)
678 *++yystack.s_mark = (YYINT) yystate;
679 *++yystack.l_mark = yyval;
683 YYERROR_CALL("yacc stack overflow");
686 yyfreestack(&yystack);
690 yyfreestack(&yystack);