2 static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
10 #define yyclearin (yychar = YYEMPTY)
11 #define yyerrok (yyerrflag = 0)
12 #define YYRECOVERING() (yyerrflag != 0)
27 #define YYLEX_PARAM &yylval
28 #define YYLEX_DECL() yylex(YYSTYPE *yylval)
29 #define YYERROR_DECL() yyerror(const char *s)
31 static void YYERROR_DECL();
34 #line 34 "/dev/stdout"
40 /* compatibility with bison */
42 /* compatibility with FreeBSD */
43 # ifdef YYPARSE_PARAM_TYPE
44 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
46 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
49 # define YYPARSE_DECL() yyparse(void)
52 /* Parameters sent to lex. */
54 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
55 # define YYLEX yylex(YYLEX_PARAM)
57 # define YYLEX_DECL() yylex(void)
58 # define YYLEX yylex()
61 /* Parameters sent to yyerror. */
63 #define YYERROR_DECL() yyerror(const char *s)
66 #define YYERROR_CALL(msg) yyerror(msg)
69 extern int YYPARSE_DECL();
75 static const short yylhs[] = { -1,
76 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
77 2, 2, 2, 2, 2, 2, 3, 3,
79 static const short yylen[] = { 2,
80 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
81 3, 3, 3, 2, 1, 1, 1, 2,
83 static const short yydefred[] = { 1,
84 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
85 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
86 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
89 static const short yydgoto[] = { 1,
92 static const short yysindex[] = { 0,
93 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
94 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
95 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
98 static const short yyrindex[] = { 0,
99 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
100 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
101 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
104 static const short yygindex[] = { 0,
107 #define YYTABLESIZE 220
108 static const short yytable[] = { 6,
109 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
110 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
111 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
112 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
113 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
114 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
115 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
116 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
117 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
118 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
119 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
120 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
121 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
122 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
123 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
124 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
125 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
126 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
127 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
129 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
130 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
132 static const short yycheck[] = { 40,
133 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
134 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
135 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
136 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
137 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
138 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
139 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
140 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
141 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
142 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
143 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
144 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
145 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
146 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
147 -1, -1, -1, -1, -1, 124, -1, -1, -1, -1,
148 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
149 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
150 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
151 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
152 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
153 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
154 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
160 #define YYMAXTOKEN 259
162 static const char *yyname[] = {
164 "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,
165 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'",0,"'/'",0,0,0,0,0,0,0,
166 0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
167 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0,0,0,0,0,0,
168 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
169 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
170 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
171 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",
173 static const char *yyrule[] = {
176 "list : list stat '\\n'",
177 "list : list error '\\n'",
179 "stat : LETTER '=' expr",
180 "expr : '(' expr ')'",
181 "expr : expr '+' expr",
182 "expr : expr '-' expr",
183 "expr : expr '*' expr",
184 "expr : expr '/' expr",
185 "expr : expr '%' expr",
186 "expr : expr '&' expr",
187 "expr : expr '|' expr",
192 "number : number DIGIT",
205 /* define the initial stack-sizes */
208 #define YYMAXDEPTH YYSTACKSIZE
211 #define YYSTACKSIZE YYMAXDEPTH
213 #define YYSTACKSIZE 500
214 #define YYMAXDEPTH 500
218 #define YYINITSTACKSIZE 500
228 /* variables for the parser stack */
229 static YYSTACKDATA yystack;
230 #line 72 "pure_calc.y"
231 /* start of programs */
234 static int YYLEX_DECL();
240 while(!feof(stdin)) {
249 fprintf(stderr, "%s\n", s);
255 /* lexical analysis routine */
256 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
257 /* return DIGIT for a digit, yylval = 0 through 9 */
258 /* all other characters are returned immediately */
262 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
264 /* c is now nonblank */
276 #line 276 "/dev/stdout"
279 #include <stdio.h> /* needed for printf */
282 #include <stdlib.h> /* needed for malloc, etc */
283 #include <string.h> /* needed for memset */
285 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
286 static int yygrowstack(YYSTACKDATA *data)
293 if ((newsize = data->stacksize) == 0)
294 newsize = YYINITSTACKSIZE;
295 else if (newsize >= YYMAXDEPTH)
297 else if ((newsize *= 2) > YYMAXDEPTH)
298 newsize = YYMAXDEPTH;
300 i = data->s_mark - data->s_base;
301 newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
305 data->s_base = newss;
306 data->s_mark = newss + i;
308 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
312 data->l_base = newvs;
313 data->l_mark = newvs + i;
315 data->stacksize = newsize;
316 data->s_last = data->s_base + newsize - 1;
320 #if YYPURE || defined(YY_NO_LEAKS)
321 static void yyfreestack(YYSTACKDATA *data)
325 memset(data, 0, sizeof(*data));
328 #define yyfreestack(data) /* nothing */
331 #define YYABORT goto yyabort
332 #define YYREJECT goto yyabort
333 #define YYACCEPT goto yyaccept
334 #define YYERROR goto yyerrlab
339 int yym, yyn, yystate;
343 if ((yys = getenv("YYDEBUG")) != 0)
346 if (yyn >= '0' && yyn <= '9')
357 memset(&yystack, 0, sizeof(yystack));
360 if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
361 yystack.s_mark = yystack.s_base;
362 yystack.l_mark = yystack.l_base;
367 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
370 if ((yychar = YYLEX) < 0) yychar = 0;
375 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
376 if (!yys) yys = "illegal-symbol";
377 printf("%sdebug: state %d, reading %d (%s)\n",
378 YYPREFIX, yystate, yychar, yys);
382 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
383 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
387 printf("%sdebug: state %d, shifting to state %d\n",
388 YYPREFIX, yystate, yytable[yyn]);
390 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
394 yystate = yytable[yyn];
395 *++yystack.s_mark = yytable[yyn];
396 *++yystack.l_mark = yylval;
398 if (yyerrflag > 0) --yyerrflag;
401 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
402 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
407 if (yyerrflag) goto yyinrecovery;
409 yyerror("syntax error");
422 if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
423 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
427 printf("%sdebug: state %d, error recovery shifting\
428 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
430 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
434 yystate = yytable[yyn];
435 *++yystack.s_mark = yytable[yyn];
436 *++yystack.l_mark = yylval;
443 printf("%sdebug: error recovery discarding state %d\n",
444 YYPREFIX, *yystack.s_mark);
446 if (yystack.s_mark <= yystack.s_base) goto yyabort;
454 if (yychar == 0) goto yyabort;
459 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
460 if (!yys) yys = "illegal-symbol";
461 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
462 YYPREFIX, yystate, yychar, yys);
472 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
473 YYPREFIX, yystate, yyn, yyrule[yyn]);
477 yyval = yystack.l_mark[1-yym];
479 memset(&yyval, 0, sizeof yyval);
483 #line 34 "pure_calc.y"
487 #line 38 "pure_calc.y"
488 { printf("%d\n",yystack.l_mark[0]);}
491 #line 40 "pure_calc.y"
492 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
495 #line 44 "pure_calc.y"
496 { yyval = yystack.l_mark[-1]; }
499 #line 46 "pure_calc.y"
500 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
503 #line 48 "pure_calc.y"
504 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
507 #line 50 "pure_calc.y"
508 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
511 #line 52 "pure_calc.y"
512 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
515 #line 54 "pure_calc.y"
516 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
519 #line 56 "pure_calc.y"
520 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
523 #line 58 "pure_calc.y"
524 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
527 #line 60 "pure_calc.y"
528 { yyval = - yystack.l_mark[0]; }
531 #line 62 "pure_calc.y"
532 { yyval = regs[yystack.l_mark[0]]; }
535 #line 67 "pure_calc.y"
536 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
539 #line 69 "pure_calc.y"
540 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
542 #line 542 "/dev/stdout"
544 yystack.s_mark -= yym;
545 yystate = *yystack.s_mark;
546 yystack.l_mark -= yym;
548 if (yystate == 0 && yym == 0)
552 printf("%sdebug: after reduction, shifting from state 0 to\
553 state %d\n", YYPREFIX, YYFINAL);
556 *++yystack.s_mark = YYFINAL;
557 *++yystack.l_mark = yyval;
560 if ((yychar = YYLEX) < 0) yychar = 0;
565 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
566 if (!yys) yys = "illegal-symbol";
567 printf("%sdebug: state %d, reading %d (%s)\n",
568 YYPREFIX, YYFINAL, yychar, yys);
572 if (yychar == 0) goto yyaccept;
575 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
576 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
577 yystate = yytable[yyn];
579 yystate = yydgoto[yym];
582 printf("%sdebug: after reduction, shifting from state %d \
583 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
585 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
589 *++yystack.s_mark = (short) yystate;
590 *++yystack.l_mark = yyval;
594 yyerror("yacc stack overflow");
597 yyfreestack(&yystack);
601 yyfreestack(&yystack);