defines3.calc.c revision 1.2 1 /* $NetBSD: defines3.calc.c,v 1.2 2024/09/14 21:29:04 christos Exp $ */
2
3 /* original parser id follows */
4 /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */
5 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */
6
7 #define YYBYACC 1
8 #define YYMAJOR 2
9 #define YYMINOR 0
10 #define YYCHECK "yyyymmdd"
11
12 #define YYEMPTY (-1)
13 #define yyclearin (yychar = YYEMPTY)
14 #define yyerrok (yyerrflag = 0)
15 #define YYRECOVERING() (yyerrflag != 0)
16 #define YYENOMEM (-2)
17 #define YYEOF 0
18 #define YYPREFIX "yy"
19
20 #define YYPURE 0
21
22 #line 2 "calc.y"
23 # include <stdio.h>
24 # include <ctype.h>
25
26 int regs[26];
27 int base;
28
29 extern int yylex(void);
30 static void yyerror(const char *s);
31
32 #line 31 "prefix.tab.c"
33
34 #if ! defined(YYSTYPE) && ! defined(YYSTYPE_IS_DECLARED)
35 /* Default: YYSTYPE is the semantic value type. */
36 typedef int YYSTYPE;
37 # define YYSTYPE_IS_DECLARED 1
38 #endif
39
40 /* compatibility with bison */
41 #ifdef YYPARSE_PARAM
42 /* compatibility with FreeBSD */
43 # ifdef YYPARSE_PARAM_TYPE
44 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
45 # else
46 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
47 # endif
48 #else
49 # define YYPARSE_DECL() yyparse(void)
50 #endif
51
52 /* Parameters sent to lex. */
53 #ifdef YYLEX_PARAM
54 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
55 # define YYLEX yylex(YYLEX_PARAM)
56 #else
57 # define YYLEX_DECL() yylex(void)
58 # define YYLEX yylex()
59 #endif
60
61 #if !(defined(yylex) || defined(YYSTATE))
62 int YYLEX_DECL();
63 #endif
64
65 /* Parameters sent to yyerror. */
66 #ifndef YYERROR_DECL
67 #define YYERROR_DECL() yyerror(const char *s)
68 #endif
69 #ifndef YYERROR_CALL
70 #define YYERROR_CALL(msg) yyerror(msg)
71 #endif
72
73 extern int YYPARSE_DECL();
74
75 #define DIGIT 257
76 #define LETTER 258
77 #define UMINUS 259
78 #define YYERRCODE 256
79 typedef int YYINT;
80 static const YYINT yylhs[] = { -1,
81 0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
82 2, 2, 2, 2, 2, 2, 3, 3,
83 };
84 static const YYINT yylen[] = { 2,
85 0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
86 3, 3, 3, 2, 1, 1, 1, 2,
87 };
88 static const YYINT yydefred[] = { 1,
89 0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
90 0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
91 0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
92 10, 11,
93 };
94 static const YYINT yydgoto[] = { 1,
95 7, 8, 9,
96 };
97 static const YYINT yysindex[] = { 0,
98 -40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
99 -38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
100 -38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
101 0, 0,
102 };
103 static const YYINT yyrindex[] = { 0,
104 0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
105 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
107 0, 0,
108 };
109 static const YYINT yygindex[] = { 0,
110 0, 65, 0,
111 };
112 #define YYTABLESIZE 220
113 static const YYINT yytable[] = { 6,
114 16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
115 15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
116 0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
117 0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
118 0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
119 8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
120 0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
121 14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
122 26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
123 0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
124 0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
125 0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
126 0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
127 0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
128 0, 0, 0, 0, 0, 16, 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, 0, 0, 0, 0, 0,
134 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
135 0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
136 };
137 static const YYINT yycheck[] = { 40,
138 10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
139 10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
140 -1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
141 -1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
142 -1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
143 38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
144 -1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
145 6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
146 16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
147 -1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
148 -1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
149 -1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
150 -1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
151 -1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
152 -1, -1, -1, -1, -1, 124, -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, -1, -1, -1, -1, -1,
158 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
159 -1, -1, -1, -1, -1, 256, 257, 258, 257, 258,
160 };
161 #define YYFINAL 1
162 #ifndef YYDEBUG
163 #define YYDEBUG 0
164 #endif
165 #define YYMAXTOKEN 259
166 #define YYUNDFTOKEN 265
167 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
168 #if YYDEBUG
169 static const char *const yyname[] = {
170
171 "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,
172 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,
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,
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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
177 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
178 0,0,0,0,0,0,"DIGIT","LETTER","UMINUS",0,0,0,0,0,"illegal-symbol",
179 };
180 static const char *const yyrule[] = {
181 "$accept : list",
182 "list :",
183 "list : list stat '\\n'",
184 "list : list error '\\n'",
185 "stat : expr",
186 "stat : LETTER '=' expr",
187 "expr : '(' expr ')'",
188 "expr : expr '+' expr",
189 "expr : expr '-' expr",
190 "expr : expr '*' expr",
191 "expr : expr '/' expr",
192 "expr : expr '%' expr",
193 "expr : expr '&' expr",
194 "expr : expr '|' expr",
195 "expr : '-' expr",
196 "expr : LETTER",
197 "expr : number",
198 "number : DIGIT",
199 "number : number DIGIT",
200
201 };
202 #endif
203
204 #if YYDEBUG
205 int yydebug;
206 #endif
207
208 int yyerrflag;
209 int yychar;
210 YYSTYPE yyval;
211 YYSTYPE yylval;
212 int yynerrs;
213
214 /* define the initial stack-sizes */
215 #ifdef YYSTACKSIZE
216 #undef YYMAXDEPTH
217 #define YYMAXDEPTH YYSTACKSIZE
218 #else
219 #ifdef YYMAXDEPTH
220 #define YYSTACKSIZE YYMAXDEPTH
221 #else
222 #define YYSTACKSIZE 10000
223 #define YYMAXDEPTH 10000
224 #endif
225 #endif
226
227 #define YYINITSTACKSIZE 200
228
229 typedef struct {
230 unsigned stacksize;
231 YYINT *s_base;
232 YYINT *s_mark;
233 YYINT *s_last;
234 YYSTYPE *l_base;
235 YYSTYPE *l_mark;
236 } YYSTACKDATA;
237 /* variables for the parser stack */
238 static YYSTACKDATA yystack;
239 #line 66 "calc.y"
240 /* start of programs */
241
242 int
243 main (void)
244 {
245 while(!feof(stdin)) {
246 yyparse();
247 }
248 return 0;
249 }
250
251 static void
252 yyerror(const char *s)
253 {
254 fprintf(stderr, "%s\n", s);
255 }
256
257 int
258 yylex(void)
259 {
260 /* lexical analysis routine */
261 /* returns LETTER for a lower case letter, yylval = 0 through 25 */
262 /* return DIGIT for a digit, yylval = 0 through 9 */
263 /* all other characters are returned immediately */
264
265 int c;
266
267 while( (c=getchar()) == ' ' ) { /* skip blanks */ }
268
269 /* c is now nonblank */
270
271 if( islower( c )) {
272 yylval = c - 'a';
273 return ( LETTER );
274 }
275 if( isdigit( c )) {
276 yylval = c - '0';
277 return ( DIGIT );
278 }
279 return( c );
280 }
281 #line 280 "prefix.tab.c"
282
283 #if YYDEBUG
284 #include <stdio.h> /* needed for printf */
285 #endif
286
287 #include <stdlib.h> /* needed for malloc, etc */
288 #include <string.h> /* needed for memset */
289
290 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
291 static int yygrowstack(YYSTACKDATA *data)
292 {
293 int i;
294 unsigned newsize;
295 YYINT *newss;
296 YYSTYPE *newvs;
297
298 if ((newsize = data->stacksize) == 0)
299 newsize = YYINITSTACKSIZE;
300 else if (newsize >= YYMAXDEPTH)
301 return YYENOMEM;
302 else if ((newsize *= 2) > YYMAXDEPTH)
303 newsize = YYMAXDEPTH;
304
305 i = (int) (data->s_mark - data->s_base);
306 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
307 if (newss == 0)
308 return YYENOMEM;
309
310 data->s_base = newss;
311 data->s_mark = newss + i;
312
313 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
314 if (newvs == 0)
315 return YYENOMEM;
316
317 data->l_base = newvs;
318 data->l_mark = newvs + i;
319
320 data->stacksize = newsize;
321 data->s_last = data->s_base + newsize - 1;
322 return 0;
323 }
324
325 #if YYPURE || defined(YY_NO_LEAKS)
326 static void yyfreestack(YYSTACKDATA *data)
327 {
328 free(data->s_base);
329 free(data->l_base);
330 memset(data, 0, sizeof(*data));
331 }
332 #else
333 #define yyfreestack(data) /* nothing */
334 #endif
335
336 #define YYABORT goto yyabort
337 #define YYREJECT goto yyabort
338 #define YYACCEPT goto yyaccept
339 #define YYERROR goto yyerrlab
340
341 int
342 YYPARSE_DECL()
343 {
344 int yym, yyn, yystate;
345 #if YYDEBUG
346 const char *yys;
347
348 if ((yys = getenv("YYDEBUG")) != 0)
349 {
350 yyn = *yys;
351 if (yyn >= '0' && yyn <= '9')
352 yydebug = yyn - '0';
353 }
354 #endif
355
356 /* yym is set below */
357 /* yyn is set below */
358 yynerrs = 0;
359 yyerrflag = 0;
360 yychar = YYEMPTY;
361 yystate = 0;
362
363 #if YYPURE
364 memset(&yystack, 0, sizeof(yystack));
365 #endif
366
367 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
368 yystack.s_mark = yystack.s_base;
369 yystack.l_mark = yystack.l_base;
370 yystate = 0;
371 *yystack.s_mark = 0;
372
373 yyloop:
374 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
375 if (yychar < 0)
376 {
377 yychar = YYLEX;
378 if (yychar < 0) yychar = YYEOF;
379 #if YYDEBUG
380 if (yydebug)
381 {
382 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
383 printf("%sdebug: state %d, reading %d (%s)\n",
384 YYPREFIX, yystate, yychar, yys);
385 }
386 #endif
387 }
388 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
389 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
390 {
391 #if YYDEBUG
392 if (yydebug)
393 printf("%sdebug: state %d, shifting to state %d\n",
394 YYPREFIX, yystate, yytable[yyn]);
395 #endif
396 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
397 yystate = yytable[yyn];
398 *++yystack.s_mark = yytable[yyn];
399 *++yystack.l_mark = yylval;
400 yychar = YYEMPTY;
401 if (yyerrflag > 0) --yyerrflag;
402 goto yyloop;
403 }
404 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
405 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
406 {
407 yyn = yytable[yyn];
408 goto yyreduce;
409 }
410 if (yyerrflag != 0) goto yyinrecovery;
411
412 YYERROR_CALL("syntax error");
413
414 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
415 yyerrlab:
416 ++yynerrs;
417
418 yyinrecovery:
419 if (yyerrflag < 3)
420 {
421 yyerrflag = 3;
422 for (;;)
423 {
424 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
425 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
426 {
427 #if YYDEBUG
428 if (yydebug)
429 printf("%sdebug: state %d, error recovery shifting\
430 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
431 #endif
432 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
433 yystate = yytable[yyn];
434 *++yystack.s_mark = yytable[yyn];
435 *++yystack.l_mark = yylval;
436 goto yyloop;
437 }
438 else
439 {
440 #if YYDEBUG
441 if (yydebug)
442 printf("%sdebug: error recovery discarding state %d\n",
443 YYPREFIX, *yystack.s_mark);
444 #endif
445 if (yystack.s_mark <= yystack.s_base) goto yyabort;
446 --yystack.s_mark;
447 --yystack.l_mark;
448 }
449 }
450 }
451 else
452 {
453 if (yychar == YYEOF) goto yyabort;
454 #if YYDEBUG
455 if (yydebug)
456 {
457 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
458 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
459 YYPREFIX, yystate, yychar, yys);
460 }
461 #endif
462 yychar = YYEMPTY;
463 goto yyloop;
464 }
465
466 yyreduce:
467 #if YYDEBUG
468 if (yydebug)
469 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
470 YYPREFIX, yystate, yyn, yyrule[yyn]);
471 #endif
472 yym = yylen[yyn];
473 if (yym > 0)
474 yyval = yystack.l_mark[1-yym];
475 else
476 memset(&yyval, 0, sizeof yyval);
477
478 switch (yyn)
479 {
480 case 3:
481 #line 28 "calc.y"
482 { yyerrok ; }
483 #line 482 "prefix.tab.c"
484 break;
485 case 4:
486 #line 32 "calc.y"
487 { printf("%d\n",yystack.l_mark[0]);}
488 #line 487 "prefix.tab.c"
489 break;
490 case 5:
491 #line 34 "calc.y"
492 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
493 #line 492 "prefix.tab.c"
494 break;
495 case 6:
496 #line 38 "calc.y"
497 { yyval = yystack.l_mark[-1]; }
498 #line 497 "prefix.tab.c"
499 break;
500 case 7:
501 #line 40 "calc.y"
502 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
503 #line 502 "prefix.tab.c"
504 break;
505 case 8:
506 #line 42 "calc.y"
507 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
508 #line 507 "prefix.tab.c"
509 break;
510 case 9:
511 #line 44 "calc.y"
512 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
513 #line 512 "prefix.tab.c"
514 break;
515 case 10:
516 #line 46 "calc.y"
517 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
518 #line 517 "prefix.tab.c"
519 break;
520 case 11:
521 #line 48 "calc.y"
522 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
523 #line 522 "prefix.tab.c"
524 break;
525 case 12:
526 #line 50 "calc.y"
527 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
528 #line 527 "prefix.tab.c"
529 break;
530 case 13:
531 #line 52 "calc.y"
532 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
533 #line 532 "prefix.tab.c"
534 break;
535 case 14:
536 #line 54 "calc.y"
537 { yyval = - yystack.l_mark[0]; }
538 #line 537 "prefix.tab.c"
539 break;
540 case 15:
541 #line 56 "calc.y"
542 { yyval = regs[yystack.l_mark[0]]; }
543 #line 542 "prefix.tab.c"
544 break;
545 case 17:
546 #line 61 "calc.y"
547 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
548 #line 547 "prefix.tab.c"
549 break;
550 case 18:
551 #line 63 "calc.y"
552 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
553 #line 552 "prefix.tab.c"
554 break;
555 #line 554 "prefix.tab.c"
556 }
557 yystack.s_mark -= yym;
558 yystate = *yystack.s_mark;
559 yystack.l_mark -= yym;
560 yym = yylhs[yyn];
561 if (yystate == 0 && yym == 0)
562 {
563 #if YYDEBUG
564 if (yydebug)
565 printf("%sdebug: after reduction, shifting from state 0 to\
566 state %d\n", YYPREFIX, YYFINAL);
567 #endif
568 yystate = YYFINAL;
569 *++yystack.s_mark = YYFINAL;
570 *++yystack.l_mark = yyval;
571 if (yychar < 0)
572 {
573 yychar = YYLEX;
574 if (yychar < 0) yychar = YYEOF;
575 #if YYDEBUG
576 if (yydebug)
577 {
578 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
579 printf("%sdebug: state %d, reading %d (%s)\n",
580 YYPREFIX, YYFINAL, yychar, yys);
581 }
582 #endif
583 }
584 if (yychar == YYEOF) goto yyaccept;
585 goto yyloop;
586 }
587 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
588 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
589 yystate = yytable[yyn];
590 else
591 yystate = yydgoto[yym];
592 #if YYDEBUG
593 if (yydebug)
594 printf("%sdebug: after reduction, shifting from state %d \
595 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
596 #endif
597 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
598 *++yystack.s_mark = (YYINT) yystate;
599 *++yystack.l_mark = yyval;
600 goto yyloop;
601
602 yyoverflow:
603 YYERROR_CALL("yacc stack overflow");
604
605 yyabort:
606 yyfreestack(&yystack);
607 return (1);
608
609 yyaccept:
610 yyfreestack(&yystack);
611 return (0);
612 }
613