2 static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
8 #define YYPATCH 20140101
11 #define yyclearin (yychar = YYEMPTY)
12 #define yyerrok (yyerrflag = 0)
13 #define YYRECOVERING() (yyerrflag != 0)
28 #define YYLEX_PARAM &yylval
29 #define YYLEX_DECL() yylex(YYSTYPE *yylval)
30 #define YYERROR_DECL() yyerror(const char *s)
32 static void YYERROR_DECL();
35 #line 35 "/dev/stdout"
41 /* compatibility with bison */
43 /* compatibility with FreeBSD */
44 # ifdef YYPARSE_PARAM_TYPE
45 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
47 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
50 # define YYPARSE_DECL() yyparse(void)
53 /* Parameters sent to lex. */
55 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
56 # define YYLEX yylex(YYLEX_PARAM)
58 # define YYLEX_DECL() yylex(void)
59 # define YYLEX yylex()
62 /* Parameters sent to yyerror. */
64 #define YYERROR_DECL() yyerror(const char *s)
67 #define YYERROR_CALL(msg) yyerror(msg)
70 extern int YYPARSE_DECL();
76 static const short yylhs[] = { -1,
77 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
78 2, 2, 2, 2, 2, 2, 3, 3,
80 static const short yylen[] = { 2,
81 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
82 3, 3, 3, 2, 1, 1, 1, 2,
84 static const short yydefred[] = { 1,
85 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
86 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
87 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
90 static const short yydgoto[] = { 1,
93 static const short yysindex[] = { 0,
94 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
95 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
96 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
99 static const short yyrindex[] = { 0,
100 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
105 static const short yygindex[] = { 0,
108 #define YYTABLESIZE 220
109 static const short yytable[] = { 6,
110 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
111 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
112 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
113 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
114 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
115 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
116 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
117 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
118 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
119 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
120 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
121 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
122 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
123 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
124 0, 0, 0, 0, 0, 16, 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, 0, 0, 0, 0, 0,
131 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
133 static const short yycheck[] = { 40,
134 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
135 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
136 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
137 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
138 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
139 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
140 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
141 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
142 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
143 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
144 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
145 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
146 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
147 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
148 -1, -1, -1, -1, -1, 124, -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, -1, -1, -1, -1, -1,
155 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
161 #define YYMAXTOKEN 259
162 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? (YYMAXTOKEN + 1) : (a))
164 static const char *yyname[] = {
166 "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,
167 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,
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,
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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
172 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
173 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS","illegal-symbol",
175 static const char *yyrule[] = {
178 "list : list stat '\\n'",
179 "list : list error '\\n'",
181 "stat : LETTER '=' expr",
182 "expr : '(' expr ')'",
183 "expr : expr '+' expr",
184 "expr : expr '-' expr",
185 "expr : expr '*' expr",
186 "expr : expr '/' expr",
187 "expr : expr '%' expr",
188 "expr : expr '&' expr",
189 "expr : expr '|' expr",
194 "number : number DIGIT",
207 /* define the initial stack-sizes */
210 #define YYMAXDEPTH YYSTACKSIZE
213 #define YYSTACKSIZE YYMAXDEPTH
215 #define YYSTACKSIZE 10000
216 #define YYMAXDEPTH 10000
220 #define YYINITSTACKSIZE 200
230 /* variables for the parser stack */
231 static YYSTACKDATA yystack;
232 #line 72 "pure_calc.y"
233 /* start of programs */
236 static int YYLEX_DECL();
242 while(!feof(stdin)) {
251 fprintf(stderr, "%s\n", s);
257 /* lexical analysis routine */
258 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
259 /* return DIGIT for a digit, yylval = 0 through 9 */
260 /* all other characters are returned immediately */
264 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
266 /* c is now nonblank */
278 #line 277 "/dev/stdout"
281 #include <stdio.h> /* needed for printf */
284 #include <stdlib.h> /* needed for malloc, etc */
285 #include <string.h> /* needed for memset */
287 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
288 static int yygrowstack(YYSTACKDATA *data)
295 if ((newsize = data->stacksize) == 0)
296 newsize = YYINITSTACKSIZE;
297 else if (newsize >= YYMAXDEPTH)
299 else if ((newsize *= 2) > YYMAXDEPTH)
300 newsize = YYMAXDEPTH;
302 i = (int) (data->s_mark - data->s_base);
303 newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
307 data->s_base = newss;
308 data->s_mark = newss + i;
310 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
314 data->l_base = newvs;
315 data->l_mark = newvs + i;
317 data->stacksize = newsize;
318 data->s_last = data->s_base + newsize - 1;
322 #if YYPURE || defined(YY_NO_LEAKS)
323 static void yyfreestack(YYSTACKDATA *data)
327 memset(data, 0, sizeof(*data));
330 #define yyfreestack(data) /* nothing */
333 #define YYABORT goto yyabort
334 #define YYREJECT goto yyabort
335 #define YYACCEPT goto yyaccept
336 #define YYERROR goto yyerrlab
341 int yym, yyn, yystate;
345 if ((yys = getenv("YYDEBUG")) != 0)
348 if (yyn >= '0' && yyn <= '9')
359 memset(&yystack, 0, sizeof(yystack));
362 if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
363 yystack.s_mark = yystack.s_base;
364 yystack.l_mark = yystack.l_base;
369 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
372 if ((yychar = YYLEX) < 0) yychar = 0;
376 yys = yyname[YYTRANSLATE(yychar)];
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;
458 yys = yyname[YYTRANSLATE(yychar)];
459 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
460 YYPREFIX, yystate, yychar, yys);
470 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
471 YYPREFIX, yystate, yyn, yyrule[yyn]);
475 yyval = yystack.l_mark[1-yym];
477 memset(&yyval, 0, sizeof yyval);
481 #line 34 "pure_calc.y"
485 #line 38 "pure_calc.y"
486 { printf("%d\n",yystack.l_mark[0]);}
489 #line 40 "pure_calc.y"
490 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
493 #line 44 "pure_calc.y"
494 { yyval = yystack.l_mark[-1]; }
497 #line 46 "pure_calc.y"
498 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
501 #line 48 "pure_calc.y"
502 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
505 #line 50 "pure_calc.y"
506 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
509 #line 52 "pure_calc.y"
510 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
513 #line 54 "pure_calc.y"
514 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
517 #line 56 "pure_calc.y"
518 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
521 #line 58 "pure_calc.y"
522 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
525 #line 60 "pure_calc.y"
526 { yyval = - yystack.l_mark[0]; }
529 #line 62 "pure_calc.y"
530 { yyval = regs[yystack.l_mark[0]]; }
533 #line 67 "pure_calc.y"
534 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
537 #line 69 "pure_calc.y"
538 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
540 #line 539 "/dev/stdout"
542 yystack.s_mark -= yym;
543 yystate = *yystack.s_mark;
544 yystack.l_mark -= yym;
546 if (yystate == 0 && yym == 0)
550 printf("%sdebug: after reduction, shifting from state 0 to\
551 state %d\n", YYPREFIX, YYFINAL);
554 *++yystack.s_mark = YYFINAL;
555 *++yystack.l_mark = yyval;
558 if ((yychar = YYLEX) < 0) yychar = 0;
562 yys = yyname[YYTRANSLATE(yychar)];
563 printf("%sdebug: state %d, reading %d (%s)\n",
564 YYPREFIX, YYFINAL, yychar, yys);
568 if (yychar == 0) goto yyaccept;
571 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
572 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
573 yystate = yytable[yyn];
575 yystate = yydgoto[yym];
578 printf("%sdebug: after reduction, shifting from state %d \
579 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
581 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
585 *++yystack.s_mark = (short) yystate;
586 *++yystack.l_mark = yyval;
590 yyerror("yacc stack overflow");
593 yyfreestack(&yystack);
597 yyfreestack(&yystack);