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)
24 #define YYLEX_PARAM base
25 #define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM)
26 #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
28 static void YYERROR_DECL();
31 #line 31 "/dev/stdout"
37 /* compatibility with bison */
39 /* compatibility with FreeBSD */
40 # ifdef YYPARSE_PARAM_TYPE
41 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
43 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
46 # define YYPARSE_DECL() yyparse(int regs[26], int * base)
49 /* Parameters sent to lex. */
51 # ifdef YYLEX_PARAM_TYPE
52 # define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM)
54 # define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM)
56 # define YYLEX yylex(&yylval, YYLEX_PARAM)
58 # define YYLEX_DECL() yylex(YYSTYPE *yylval, int * base)
59 # define YYLEX yylex(&yylval, base)
62 /* Parameters sent to yyerror. */
64 #define YYERROR_DECL() yyerror(int regs[26], int * base, const char *s)
67 #define YYERROR_CALL(msg) yyerror(regs, base, 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
163 static const char *yyname[] = {
165 "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,
166 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,
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,0,0,0,0,0,0,0,0,0,0,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,"DIGIT","LETTER","UMINUS",
174 static const char *yyrule[] = {
177 "list : list stat '\\n'",
178 "list : list error '\\n'",
180 "stat : LETTER '=' expr",
181 "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",
188 "expr : expr '|' expr",
193 "number : number DIGIT",
201 /* define the initial stack-sizes */
204 #define YYMAXDEPTH YYSTACKSIZE
207 #define YYSTACKSIZE YYMAXDEPTH
209 #define YYSTACKSIZE 500
210 #define YYMAXDEPTH 500
214 #define YYINITSTACKSIZE 500
225 /* start of programs */
228 extern int YYLEX_DECL();
237 while(!feof(stdin)) {
238 yyparse(regs, &base);
246 fprintf(stderr, "%s\n", s);
252 /* lexical analysis routine */
253 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
254 /* return DIGIT for a digit, yylval = 0 through 9 */
255 /* all other characters are returned immediately */
259 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
261 /* c is now nonblank */
268 *yylval = (c - '0') % (*base);
273 #line 273 "/dev/stdout"
276 #include <stdio.h> /* needed for printf */
279 #include <stdlib.h> /* needed for malloc, etc */
280 #include <string.h> /* needed for memset */
282 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
283 static int yygrowstack(YYSTACKDATA *data)
290 if ((newsize = data->stacksize) == 0)
291 newsize = YYINITSTACKSIZE;
292 else if (newsize >= YYMAXDEPTH)
294 else if ((newsize *= 2) > YYMAXDEPTH)
295 newsize = YYMAXDEPTH;
297 i = data->s_mark - data->s_base;
298 newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
302 data->s_base = newss;
303 data->s_mark = newss + i;
305 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
309 data->l_base = newvs;
310 data->l_mark = newvs + i;
312 data->stacksize = newsize;
313 data->s_last = data->s_base + newsize - 1;
317 #if YYPURE || defined(YY_NO_LEAKS)
318 static void yyfreestack(YYSTACKDATA *data)
322 memset(data, 0, sizeof(*data));
325 #define yyfreestack(data) /* nothing */
328 #define YYABORT goto yyabort
329 #define YYREJECT goto yyabort
330 #define YYACCEPT goto yyaccept
331 #define YYERROR goto yyerrlab
341 /* variables for the parser stack */
343 int yym, yyn, yystate;
347 if ((yys = getenv("YYDEBUG")) != 0)
350 if (yyn >= '0' && yyn <= '9')
361 memset(&yystack, 0, sizeof(yystack));
364 if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
365 yystack.s_mark = yystack.s_base;
366 yystack.l_mark = yystack.l_base;
371 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
374 if ((yychar = YYLEX) < 0) yychar = 0;
379 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
380 if (!yys) yys = "illegal-symbol";
381 printf("%sdebug: state %d, reading %d (%s)\n",
382 YYPREFIX, yystate, yychar, yys);
386 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
387 yyn <= YYTABLESIZE && yycheck[yyn] == 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))
398 yystate = yytable[yyn];
399 *++yystack.s_mark = yytable[yyn];
400 *++yystack.l_mark = yylval;
402 if (yyerrflag > 0) --yyerrflag;
405 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
406 yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
411 if (yyerrflag) goto yyinrecovery;
413 yyerror(regs, base, "syntax error");
426 if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
427 yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
431 printf("%sdebug: state %d, error recovery shifting\
432 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
434 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
438 yystate = yytable[yyn];
439 *++yystack.s_mark = yytable[yyn];
440 *++yystack.l_mark = yylval;
447 printf("%sdebug: error recovery discarding state %d\n",
448 YYPREFIX, *yystack.s_mark);
450 if (yystack.s_mark <= yystack.s_base) goto yyabort;
458 if (yychar == 0) goto yyabort;
463 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
464 if (!yys) yys = "illegal-symbol";
465 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
466 YYPREFIX, yystate, yychar, yys);
476 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
477 YYPREFIX, yystate, yyn, yyrule[yyn]);
481 yyval = yystack.l_mark[1-yym];
483 memset(&yyval, 0, sizeof yyval);
492 { printf("%d\n",yystack.l_mark[0]);}
496 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
500 { yyval = yystack.l_mark[-1]; }
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[-2] & yystack.l_mark[0]; }
528 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
532 { yyval = - yystack.l_mark[0]; }
536 { yyval = regs[yystack.l_mark[0]]; }
540 { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; }
544 { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; }
546 #line 546 "/dev/stdout"
548 yystack.s_mark -= yym;
549 yystate = *yystack.s_mark;
550 yystack.l_mark -= yym;
552 if (yystate == 0 && yym == 0)
556 printf("%sdebug: after reduction, shifting from state 0 to\
557 state %d\n", YYPREFIX, YYFINAL);
560 *++yystack.s_mark = YYFINAL;
561 *++yystack.l_mark = yyval;
564 if ((yychar = YYLEX) < 0) yychar = 0;
569 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
570 if (!yys) yys = "illegal-symbol";
571 printf("%sdebug: state %d, reading %d (%s)\n",
572 YYPREFIX, YYFINAL, yychar, yys);
576 if (yychar == 0) goto yyaccept;
579 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
580 yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
581 yystate = yytable[yyn];
583 yystate = yydgoto[yym];
586 printf("%sdebug: after reduction, shifting from state %d \
587 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
589 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
593 *++yystack.s_mark = (short) yystate;
594 *++yystack.l_mark = yyval;
598 yyerror(regs, base, "yacc stack overflow");
601 yyfreestack(&yystack);
605 yyfreestack(&yystack);