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')
446 memset(&yyval, 0, sizeof(yyval));
447 memset(&yylval, 0, sizeof(yylval));
457 memset(&yystack, 0, sizeof(yystack));
460 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
461 yystack.s_mark = yystack.s_base;
462 yystack.l_mark = yystack.l_base;
467 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
471 if (yychar < 0) yychar = YYEOF;
475 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
476 printf("%sdebug: state %d, reading %d (%s)\n",
477 YYPREFIX, yystate, yychar, yys);
481 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
482 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
486 printf("%sdebug: state %d, shifting to state %d\n",
487 YYPREFIX, yystate, yytable[yyn]);
489 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
490 yystate = yytable[yyn];
491 *++yystack.s_mark = yytable[yyn];
492 *++yystack.l_mark = yylval;
494 if (yyerrflag > 0) --yyerrflag;
497 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
498 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
503 if (yyerrflag != 0) goto yyinrecovery;
505 YYERROR_CALL("syntax error");
507 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
517 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
518 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
522 printf("%sdebug: state %d, error recovery shifting\
523 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
525 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
526 yystate = yytable[yyn];
527 *++yystack.s_mark = yytable[yyn];
528 *++yystack.l_mark = yylval;
535 printf("%sdebug: error recovery discarding state %d\n",
536 YYPREFIX, *yystack.s_mark);
538 if (yystack.s_mark <= yystack.s_base) goto yyabort;
546 if (yychar == YYEOF) goto yyabort;
550 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
551 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
552 YYPREFIX, yystate, yychar, yys);
562 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
563 YYPREFIX, yystate, yyn, yyrule[yyn]);
567 yyval = yystack.l_mark[1-yym];
569 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;
652 if (yychar < 0) yychar = YYEOF;
656 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
657 printf("%sdebug: state %d, reading %d (%s)\n",
658 YYPREFIX, YYFINAL, yychar, yys);
662 if (yychar == YYEOF) goto yyaccept;
665 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
666 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
667 yystate = yytable[yyn];
669 yystate = yydgoto[yym];
672 printf("%sdebug: after reduction, shifting from state %d \
673 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
675 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
676 *++yystack.s_mark = (YYINT) yystate;
677 *++yystack.l_mark = yyval;
681 YYERROR_CALL("yacc stack overflow");
684 yyfreestack(&yystack);
688 yyfreestack(&yystack);