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)
25 #define YYLEX_PARAM base
26 #define YYLEX_DECL() yylex(YYSTYPE *yylval, int *YYLEX_PARAM)
27 #define YYERROR_DECL() yyerror(int regs[26], int *base, const char *s)
29 static void YYERROR_DECL();
32 #line 32 "/dev/stdout"
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(int regs[26], int * base)
50 /* Parameters sent to lex. */
52 # ifdef YYLEX_PARAM_TYPE
53 # define YYLEX_DECL() yylex(YYSTYPE *yylval, YYLEX_PARAM_TYPE YYLEX_PARAM)
55 # define YYLEX_DECL() yylex(YYSTYPE *yylval, void * YYLEX_PARAM)
57 # define YYLEX yylex(&yylval, YYLEX_PARAM)
59 # define YYLEX_DECL() yylex(YYSTYPE *yylval, int * base)
60 # define YYLEX yylex(&yylval, base)
63 /* Parameters sent to yyerror. */
65 #define YYERROR_DECL() yyerror(int regs[26], int * base, const char *s)
68 #define YYERROR_CALL(msg) yyerror(regs, base, msg)
71 extern int YYPARSE_DECL();
77 static const short yylhs[] = { -1,
78 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
79 2, 2, 2, 2, 2, 2, 3, 3,
81 static const short yylen[] = { 2,
82 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
83 3, 3, 3, 2, 1, 1, 1, 2,
85 static const short yydefred[] = { 1,
86 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
87 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
88 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
91 static const short yydgoto[] = { 1,
94 static const short yysindex[] = { 0,
95 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
96 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
97 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
100 static const short yyrindex[] = { 0,
101 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
106 static const short yygindex[] = { 0,
109 #define YYTABLESIZE 220
110 static const short yytable[] = { 6,
111 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
112 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
113 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
114 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
115 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
116 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
117 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
118 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
119 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
120 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
121 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
122 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
123 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
124 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
125 0, 0, 0, 0, 0, 16, 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, 0, 0, 0, 0, 0,
132 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
134 static const short yycheck[] = { 40,
135 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
136 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
137 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
138 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
139 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
140 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
141 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
142 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
143 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
144 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
145 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
146 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
147 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
148 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
149 -1, -1, -1, -1, -1, 124, -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, -1, -1, -1, -1, -1,
156 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
162 #define YYMAXTOKEN 259
163 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? (YYMAXTOKEN + 1) : (a))
165 static const char *yyname[] = {
167 "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,
168 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,
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,0,0,0,0,0,0,0,0,0,0,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,"DIGIT","LETTER","UMINUS","illegal-symbol",
176 static const char *yyrule[] = {
179 "list : list stat '\\n'",
180 "list : list error '\\n'",
182 "stat : LETTER '=' expr",
183 "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",
190 "expr : expr '|' expr",
195 "number : number DIGIT",
203 /* define the initial stack-sizes */
206 #define YYMAXDEPTH YYSTACKSIZE
209 #define YYSTACKSIZE YYMAXDEPTH
211 #define YYSTACKSIZE 10000
212 #define YYMAXDEPTH 10000
216 #define YYINITSTACKSIZE 200
227 /* start of programs */
230 extern int YYLEX_DECL();
239 while(!feof(stdin)) {
240 yyparse(regs, &base);
248 fprintf(stderr, "%s\n", s);
254 /* lexical analysis routine */
255 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
256 /* return DIGIT for a digit, yylval = 0 through 9 */
257 /* all other characters are returned immediately */
261 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
263 /* c is now nonblank */
270 *yylval = (c - '0') % (*base);
275 #line 274 "/dev/stdout"
278 #include <stdio.h> /* needed for printf */
281 #include <stdlib.h> /* needed for malloc, etc */
282 #include <string.h> /* needed for memset */
284 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
285 static int yygrowstack(YYSTACKDATA *data)
292 if ((newsize = data->stacksize) == 0)
293 newsize = YYINITSTACKSIZE;
294 else if (newsize >= YYMAXDEPTH)
296 else if ((newsize *= 2) > YYMAXDEPTH)
297 newsize = YYMAXDEPTH;
299 i = (int) (data->s_mark - data->s_base);
300 newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
304 data->s_base = newss;
305 data->s_mark = newss + i;
307 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
311 data->l_base = newvs;
312 data->l_mark = newvs + i;
314 data->stacksize = newsize;
315 data->s_last = data->s_base + newsize - 1;
319 #if YYPURE || defined(YY_NO_LEAKS)
320 static void yyfreestack(YYSTACKDATA *data)
324 memset(data, 0, sizeof(*data));
327 #define yyfreestack(data) /* nothing */
330 #define YYABORT goto yyabort
331 #define YYREJECT goto yyabort
332 #define YYACCEPT goto yyaccept
333 #define YYERROR goto yyerrlab
343 /* variables for the parser stack */
345 int yym, yyn, yystate;
349 if ((yys = getenv("YYDEBUG")) != 0)
352 if (yyn >= '0' && yyn <= '9')
363 memset(&yystack, 0, sizeof(yystack));
366 if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
367 yystack.s_mark = yystack.s_base;
368 yystack.l_mark = yystack.l_base;
373 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
376 if ((yychar = YYLEX) < 0) yychar = 0;
380 yys = yyname[YYTRANSLATE(yychar)];
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;
462 yys = yyname[YYTRANSLATE(yychar)];
463 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
464 YYPREFIX, yystate, yychar, yys);
474 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
475 YYPREFIX, yystate, yyn, yyrule[yyn]);
479 yyval = yystack.l_mark[1-yym];
481 memset(&yyval, 0, sizeof yyval);
490 { printf("%d\n",yystack.l_mark[0]);}
494 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
498 { yyval = yystack.l_mark[-1]; }
502 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
506 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
510 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
514 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
518 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
522 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
526 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
530 { yyval = - yystack.l_mark[0]; }
534 { yyval = regs[yystack.l_mark[0]]; }
538 { yyval = yystack.l_mark[0]; (*base) = (yystack.l_mark[0]==0) ? 8 : 10; }
542 { yyval = (*base) * yystack.l_mark[-1] + yystack.l_mark[0]; }
544 #line 543 "/dev/stdout"
546 yystack.s_mark -= yym;
547 yystate = *yystack.s_mark;
548 yystack.l_mark -= yym;
550 if (yystate == 0 && yym == 0)
554 printf("%sdebug: after reduction, shifting from state 0 to\
555 state %d\n", YYPREFIX, YYFINAL);
558 *++yystack.s_mark = YYFINAL;
559 *++yystack.l_mark = yyval;
562 if ((yychar = YYLEX) < 0) yychar = 0;
566 yys = yyname[YYTRANSLATE(yychar)];
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(regs, base, "yacc stack overflow");
597 yyfreestack(&yystack);
601 yyfreestack(&yystack);