defines3.calc.c revision 1.1.1.1 1 /* $NetBSD: defines3.calc.c,v 1.1.1.1 2019/10/06 23:19:26 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 1
9 #define YYMINOR 9
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 short 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 = 0;
357 yyn = 0;
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 break;
484 case 4:
485 #line 32 "calc.y"
486 { printf("%d\n",yystack.l_mark[0]);}
487 break;
488 case 5:
489 #line 34 "calc.y"
490 { regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
491 break;
492 case 6:
493 #line 38 "calc.y"
494 { yyval = yystack.l_mark[-1]; }
495 break;
496 case 7:
497 #line 40 "calc.y"
498 { yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
499 break;
500 case 8:
501 #line 42 "calc.y"
502 { yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
503 break;
504 case 9:
505 #line 44 "calc.y"
506 { yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
507 break;
508 case 10:
509 #line 46 "calc.y"
510 { yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
511 break;
512 case 11:
513 #line 48 "calc.y"
514 { yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
515 break;
516 case 12:
517 #line 50 "calc.y"
518 { yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
519 break;
520 case 13:
521 #line 52 "calc.y"
522 { yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
523 break;
524 case 14:
525 #line 54 "calc.y"
526 { yyval = - yystack.l_mark[0]; }
527 break;
528 case 15:
529 #line 56 "calc.y"
530 { yyval = regs[yystack.l_mark[0]]; }
531 break;
532 case 17:
533 #line 61 "calc.y"
534 { yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
535 break;
536 case 18:
537 #line 63 "calc.y"
538 { yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
539 break;
540 #line 539 "prefix.tab.c"
541 }
542 yystack.s_mark -= yym;
543 yystate = *yystack.s_mark;
544 yystack.l_mark -= yym;
545 yym = yylhs[yyn];
546 if (yystate == 0 && yym == 0)
547 {
548 #if YYDEBUG
549 if (yydebug)
550 printf("%sdebug: after reduction, shifting from state 0 to\
551 state %d\n", YYPREFIX, YYFINAL);
552 #endif
553 yystate = YYFINAL;
554 *++yystack.s_mark = YYFINAL;
555 *++yystack.l_mark = yyval;
556 if (yychar < 0)
557 {
558 yychar = YYLEX;
559 if (yychar < 0) yychar = YYEOF;
560 #if YYDEBUG
561 if (yydebug)
562 {
563 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
564 printf("%sdebug: state %d, reading %d (%s)\n",
565 YYPREFIX, YYFINAL, yychar, yys);
566 }
567 #endif
568 }
569 if (yychar == YYEOF) goto yyaccept;
570 goto yyloop;
571 }
572 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
573 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
574 yystate = yytable[yyn];
575 else
576 yystate = yydgoto[yym];
577 #if YYDEBUG
578 if (yydebug)
579 printf("%sdebug: after reduction, shifting from state %d \
580 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
581 #endif
582 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
583 *++yystack.s_mark = (YYINT) yystate;
584 *++yystack.l_mark = yyval;
585 goto yyloop;
586
587 yyoverflow:
588 YYERROR_CALL("yacc stack overflow");
589
590 yyabort:
591 yyfreestack(&yystack);
592 return (1);
593
594 yyaccept:
595 yyfreestack(&yystack);
596 return (0);
597 }
598