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)
27 extern int yylex(void);
28 static void yyerror(const char *s);
30 #line 31 "prefix.tab.c"
32 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED)
33 /* Default: YYSTYPE is the semantic value type. */
35 # define YYSTYPE_IS_DECLARED 1
38 /* compatibility with bison */
40 /* compatibility with FreeBSD */
41 # ifdef YYPARSE_PARAM_TYPE
42 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
44 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
47 # define YYPARSE_DECL() yyparse(void)
50 /* Parameters sent to lex. */
52 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
53 # define YYLEX yylex(YYLEX_PARAM)
55 # define YYLEX_DECL() yylex(void)
56 # define YYLEX yylex()
59 #if !(defined(yylex) || defined(YYSTATE))
63 /* Parameters sent to yyerror. */
65 #define YYERROR_DECL() yyerror(const char *s)
68 #define YYERROR_CALL(msg) yyerror(msg)
71 extern int YYPARSE_DECL();
78 static const YYINT yylhs[] = { -1,
79 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
80 2, 2, 2, 2, 2, 2, 3, 3,
82 static const YYINT yylen[] = { 2,
83 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
84 3, 3, 3, 2, 1, 1, 1, 2,
86 static const YYINT yydefred[] = { 1,
87 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
88 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
89 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
92 static const YYINT yydgoto[] = { 1,
95 static const YYINT yysindex[] = { 0,
96 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
97 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
98 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
101 static const YYINT yyrindex[] = { 0,
102 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
107 static const YYINT yygindex[] = { 0,
110 #define YYTABLESIZE 220
111 static const YYINT yytable[] = { 6,
112 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
113 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
114 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
115 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
116 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
117 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
118 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
119 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
120 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
121 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
122 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
123 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
124 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
125 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
126 0, 0, 0, 0, 0, 16, 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, 0, 0, 0, 0, 0,
132 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
133 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
135 static const YYINT yycheck[] = { 40,
136 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
137 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
138 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
139 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
140 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
141 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
142 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
143 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
144 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
145 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
146 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
147 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
148 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
149 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
150 -1, -1, -1, -1, -1, 124, -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, -1, -1, -1, -1, -1,
156 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
157 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
163 #define YYMAXTOKEN 259
164 #define YYUNDFTOKEN 265
165 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
167 static const char *const yyname[] = {
169 "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,
170 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,
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,
173 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
174 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
175 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
176 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol",
178 static const char *const yyrule[] = {
181 "list : list stat '\\n'",
182 "list : list error '\\n'",
184 "stat : LETTER '=' expr",
185 "expr : '(' expr ')'",
186 "expr : expr '+' expr",
187 "expr : expr '-' expr",
188 "expr : expr '*' expr",
189 "expr : expr '/' expr",
190 "expr : expr '%' expr",
191 "expr : expr '&' expr",
192 "expr : expr '|' expr",
197 "number : number DIGIT",
212 /* define the initial stack-sizes */
215 #define YYMAXDEPTH YYSTACKSIZE
218 #define YYSTACKSIZE YYMAXDEPTH
220 #define YYSTACKSIZE 10000
221 #define YYMAXDEPTH 10000
225 #define YYINITSTACKSIZE 200
235 /* variables for the parser stack */
236 static YYSTACKDATA yystack;
238 /* start of programs */
243 while(!feof(stdin)) {
250 yyerror(const char *s)
252 fprintf(stderr, "%s\n", s);
258 /* lexical analysis routine */
259 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
260 /* return DIGIT for a digit, yylval = 0 through 9 */
261 /* all other characters are returned immediately */
265 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
267 /* c is now nonblank */
279 #line 280 "prefix.tab.c"
282 #include <stdio.h> /* needed for printf */
285 #include <stdlib.h> /* needed for malloc, etc */
286 #include <string.h> /* needed for memset */
288 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
289 static int yygrowstack(YYSTACKDATA *data)
296 if ((newsize = data->stacksize) == 0)
297 newsize = YYINITSTACKSIZE;
298 else if (newsize >= YYMAXDEPTH)
300 else if ((newsize *= 2) > YYMAXDEPTH)
301 newsize = YYMAXDEPTH;
303 i = (int) (data->s_mark - data->s_base);
304 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
308 data->s_base = newss;
309 data->s_mark = newss + i;
311 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
315 data->l_base = newvs;
316 data->l_mark = newvs + i;
318 data->stacksize = newsize;
319 data->s_last = data->s_base + newsize - 1;
323 #if YYPURE || defined(YY_NO_LEAKS)
324 static void yyfreestack(YYSTACKDATA *data)
328 memset(data, 0, sizeof(*data));
331 #define yyfreestack(data) /* nothing */
334 #define YYABORT goto yyabort
335 #define YYREJECT goto yyabort
336 #define YYACCEPT goto yyaccept
337 #define YYERROR goto yyerrlab
342 int yym, yyn, yystate;
346 if ((yys = getenv("YYDEBUG")) != NULL)
349 if (yyn >= '0' && yyn <= '9')
362 memset(&yystack, 0, sizeof(yystack));
365 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
366 yystack.s_mark = yystack.s_base;
367 yystack.l_mark = yystack.l_base;
372 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
376 if (yychar < 0) yychar = YYEOF;
380 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
381 printf("%sdebug: state %d, reading %d (%s)\n",
382 YYPREFIX, yystate, yychar, yys);
386 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
387 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
391 printf("%sdebug: state %d, shifting to state %d\n",
392 YYPREFIX, yystate, yytable[yyn]);
394 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
395 yystate = yytable[yyn];
396 *++yystack.s_mark = yytable[yyn];
397 *++yystack.l_mark = yylval;
399 if (yyerrflag > 0) --yyerrflag;
402 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
403 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
408 if (yyerrflag != 0) goto yyinrecovery;
410 YYERROR_CALL("syntax error");
412 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
422 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
423 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) 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) == YYENOMEM) goto yyoverflow;
431 yystate = yytable[yyn];
432 *++yystack.s_mark = yytable[yyn];
433 *++yystack.l_mark = yylval;
440 printf("%sdebug: error recovery discarding state %d\n",
441 YYPREFIX, *yystack.s_mark);
443 if (yystack.s_mark <= yystack.s_base) goto yyabort;
451 if (yychar == YYEOF) goto yyabort;
455 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
456 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
457 YYPREFIX, yystate, yychar, yys);
467 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
468 YYPREFIX, yystate, yyn, yyrule[yyn]);
472 yyval = yystack.l_mark[1-yym];
474 memset(&yyval, 0, sizeof yyval);
484 { printf("%d\n",yystack.l_mark[0]);}
488 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
492 { yyval = yystack.l_mark[-1]; }
496 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
500 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
504 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
508 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
512 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
516 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
520 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
524 { yyval = - yystack.l_mark[0]; }
528 { yyval = regs[yystack.l_mark[0]]; }
532 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
536 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
538 #line 539 "prefix.tab.c"
540 yystack.s_mark -= yym;
541 yystate = *yystack.s_mark;
542 yystack.l_mark -= yym;
544 if (yystate == 0 && yym == 0)
548 printf("%sdebug: after reduction, shifting from state 0 to\
549 state %d\n", YYPREFIX, YYFINAL);
552 *++yystack.s_mark = YYFINAL;
553 *++yystack.l_mark = yyval;
557 if (yychar < 0) yychar = YYEOF;
561 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
562 printf("%sdebug: state %d, reading %d (%s)\n",
563 YYPREFIX, YYFINAL, yychar, yys);
567 if (yychar == YYEOF) goto yyaccept;
570 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
571 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
572 yystate = yytable[yyn];
574 yystate = yydgoto[yym];
577 printf("%sdebug: after reduction, shifting from state %d \
578 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
580 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
581 *++yystack.s_mark = (YYINT) yystate;
582 *++yystack.l_mark = yyval;
586 YYERROR_CALL("yacc stack overflow");
589 yyfreestack(&yystack);
593 yyfreestack(&yystack);