calc1.tab.c revision 1.1.1.8 1 /* $NetBSD: calc1.tab.c,v 1.1.1.8 2026/01/18 16:39:06 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
19 #ifndef yyparse
20 #define yyparse calc1_parse
21 #endif /* yyparse */
22
23 #ifndef yylex
24 #define yylex calc1_lex
25 #endif /* yylex */
26
27 #ifndef yyerror
28 #define yyerror calc1_error
29 #endif /* yyerror */
30
31 #ifndef yychar
32 #define yychar calc1_char
33 #endif /* yychar */
34
35 #ifndef yyval
36 #define yyval calc1_val
37 #endif /* yyval */
38
39 #ifndef yylval
40 #define yylval calc1_lval
41 #endif /* yylval */
42
43 #ifndef yydebug
44 #define yydebug calc1_debug
45 #endif /* yydebug */
46
47 #ifndef yynerrs
48 #define yynerrs calc1_nerrs
49 #endif /* yynerrs */
50
51 #ifndef yyerrflag
52 #define yyerrflag calc1_errflag
53 #endif /* yyerrflag */
54
55 #ifndef yylhs
56 #define yylhs calc1_lhs
57 #endif /* yylhs */
58
59 #ifndef yylen
60 #define yylen calc1_len
61 #endif /* yylen */
62
63 #ifndef yydefred
64 #define yydefred calc1_defred
65 #endif /* yydefred */
66
67 #ifndef yydgoto
68 #define yydgoto calc1_dgoto
69 #endif /* yydgoto */
70
71 #ifndef yysindex
72 #define yysindex calc1_sindex
73 #endif /* yysindex */
74
75 #ifndef yyrindex
76 #define yyrindex calc1_rindex
77 #endif /* yyrindex */
78
79 #ifndef yygindex
80 #define yygindex calc1_gindex
81 #endif /* yygindex */
82
83 #ifndef yytable
84 #define yytable calc1_table
85 #endif /* yytable */
86
87 #ifndef yycheck
88 #define yycheck calc1_check
89 #endif /* yycheck */
90
91 #ifndef yyname
92 #define yyname calc1_name
93 #endif /* yyname */
94
95 #ifndef yyrule
96 #define yyrule calc1_rule
97 #endif /* yyrule */
98 #define YYPREFIX "calc1_"
99
100 #define YYPURE 0
101
102 #line 2 "calc1.y"
103
104 /* http://dinosaur.compilertools.net/yacc/index.html */
105
106 #include <stdlib.h>
107 #include <stdio.h>
108 #include <ctype.h>
109 #include <math.h>
110
111 typedef struct interval
112 {
113 double lo, hi;
114 }
115 INTERVAL;
116
117 INTERVAL vmul(double, double, INTERVAL);
118 INTERVAL vdiv(double, double, INTERVAL);
119
120 extern int yylex(void);
121 static void yyerror(const char *s);
122
123 int dcheck(INTERVAL);
124
125 double dreg[26];
126 INTERVAL vreg[26];
127
128 #ifdef YYSTYPE
129 #undef YYSTYPE_IS_DECLARED
130 #define YYSTYPE_IS_DECLARED 1
131 #endif
132 #ifndef YYSTYPE_IS_DECLARED
133 #define YYSTYPE_IS_DECLARED 1
134 #line 31 "calc1.y"
135 typedef union YYSTYPE
136 {
137 int ival;
138 double dval;
139 INTERVAL vval;
140 } YYSTYPE;
141 #endif /* !YYSTYPE_IS_DECLARED */
142 #line 141 "calc1.tab.c"
143
144 /* compatibility with bison */
145 #ifdef YYPARSE_PARAM
146 /* compatibility with FreeBSD */
147 # ifdef YYPARSE_PARAM_TYPE
148 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
149 # else
150 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
151 # endif
152 #else
153 # define YYPARSE_DECL() yyparse(void)
154 #endif
155
156 /* Parameters sent to lex. */
157 #ifdef YYLEX_PARAM
158 # define YYLEX_DECL() yylex(void *YYLEX_PARAM)
159 # define YYLEX yylex(YYLEX_PARAM)
160 #else
161 # define YYLEX_DECL() yylex(void)
162 # define YYLEX yylex()
163 #endif
164
165 /* Parameters sent to yyerror. */
166 #ifndef YYERROR_DECL
167 #define YYERROR_DECL() yyerror(const char *s)
168 #endif
169 #ifndef YYERROR_CALL
170 #define YYERROR_CALL(msg) yyerror(msg)
171 #endif
172
173 extern int YYPARSE_DECL();
174
175 #define DREG 257
176 #define VREG 258
177 #define CONST 259
178 #define UMINUS 260
179 #define YYERRCODE 256
180 typedef int YYINT;
181 static const YYINT calc1_lhs[] = { -1,
182 3, 3, 0, 0, 0, 0, 0, 1, 1, 1,
183 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
184 2, 2, 2, 2, 2, 2, 2, 2,
185 };
186 static const YYINT calc1_len[] = { 2,
187 0, 2, 2, 2, 4, 4, 2, 1, 1, 3,
188 3, 3, 3, 2, 3, 1, 5, 1, 3, 3,
189 3, 3, 3, 3, 3, 3, 2, 3,
190 };
191 static const YYINT calc1_defred[] = { 0,
192 0, 0, 0, 8, 0, 0, 0, 0, 0, 7,
193 0, 0, 9, 18, 14, 27, 0, 0, 0, 0,
194 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
195 0, 0, 0, 15, 0, 28, 0, 0, 0, 0,
196 12, 24, 13, 26, 0, 0, 23, 25, 14, 0,
197 0, 0, 0, 0, 5, 6, 0, 0, 0, 12,
198 13, 17,
199 };
200 static const YYINT calc1_dgoto[] = { 7,
201 32, 9, 0,
202 };
203 static const YYINT calc1_sindex[] = { -40,
204 -8, -48, -47, 0, -37, -37, 0, 2, 17, 0,
205 -34, -37, 0, 0, 0, 0, -25, 90, -37, -37,
206 -37, -37, 0, -37, -37, -37, -37, 0, -34, -34,
207 25, 125, 31, 0, -34, 0, -11, 37, -11, 37,
208 0, 0, 0, 0, 37, 37, 0, 0, 0, 111,
209 -34, -34, -34, -34, 0, 0, 118, 69, 69, 0,
210 0, 0,
211 };
212 static const YYINT calc1_rindex[] = { 0,
213 0, 38, 44, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216 0, -9, 0, 0, 0, 0, 51, -3, 56, 61,
217 0, 0, 0, 0, 67, 72, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 0, 78, 83, 0,
219 0, 0,
220 };
221 static const YYINT calc1_gindex[] = { 0,
222 4, 124, 0,
223 };
224 #define YYTABLESIZE 225
225 static const YYINT calc1_table[] = { 6,
226 16, 10, 6, 8, 5, 30, 20, 5, 15, 17,
227 29, 23, 11, 12, 31, 34, 21, 19, 35, 20,
228 0, 22, 37, 39, 41, 43, 28, 0, 0, 0,
229 21, 16, 49, 50, 55, 22, 0, 20, 57, 20,
230 56, 20, 0, 21, 19, 0, 20, 9, 22, 0,
231 0, 0, 0, 18, 58, 59, 60, 61, 26, 24,
232 10, 25, 0, 27, 0, 11, 53, 51, 0, 52,
233 22, 54, 26, 24, 0, 25, 19, 27, 26, 9,
234 9, 21, 9, 27, 9, 18, 18, 10, 18, 0,
235 18, 10, 11, 10, 10, 10, 11, 0, 11, 11,
236 11, 22, 0, 22, 0, 22, 0, 19, 0, 19,
237 53, 19, 21, 0, 21, 54, 21, 0, 10, 0,
238 10, 0, 10, 11, 0, 11, 0, 11, 16, 18,
239 36, 26, 24, 0, 25, 33, 27, 0, 0, 0,
240 0, 0, 38, 40, 42, 44, 0, 45, 46, 47,
241 48, 34, 53, 51, 0, 52, 0, 54, 62, 53,
242 51, 0, 52, 0, 54, 0, 21, 19, 0, 20,
243 0, 22, 0, 0, 0, 0, 0, 0, 0, 0,
244 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
246 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
247 0, 0, 0, 0, 0, 1, 2, 3, 4, 13,
248 14, 4, 13, 0, 4,
249 };
250 static const YYINT calc1_check[] = { 40,
251 10, 10, 40, 0, 45, 40, 10, 45, 5, 6,
252 45, 10, 61, 61, 11, 41, 42, 43, 44, 45,
253 -1, 47, 19, 20, 21, 22, 10, -1, -1, -1,
254 42, 41, 29, 30, 10, 47, -1, 41, 35, 43,
255 10, 45, -1, 42, 43, -1, 45, 10, 47, -1,
256 -1, -1, -1, 10, 51, 52, 53, 54, 42, 43,
257 10, 45, -1, 47, -1, 10, 42, 43, -1, 45,
258 10, 47, 42, 43, -1, 45, 10, 47, 42, 42,
259 43, 10, 45, 47, 47, 42, 43, 10, 45, -1,
260 47, 41, 10, 43, 44, 45, 41, -1, 43, 44,
261 45, 41, -1, 43, -1, 45, -1, 41, -1, 43,
262 42, 45, 41, -1, 43, 47, 45, -1, 41, -1,
263 43, -1, 45, 41, -1, 43, -1, 45, 5, 6,
264 41, 42, 43, -1, 45, 12, 47, -1, -1, -1,
265 -1, -1, 19, 20, 21, 22, -1, 24, 25, 26,
266 27, 41, 42, 43, -1, 45, -1, 47, 41, 42,
267 43, -1, 45, -1, 47, -1, 42, 43, -1, 45,
268 -1, 47, -1, -1, -1, -1, -1, -1, -1, -1,
269 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
270 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
271 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
272 -1, -1, -1, -1, -1, 256, 257, 258, 259, 257,
273 258, 259, 257, -1, 259,
274 };
275 #define YYFINAL 7
276 #ifndef YYDEBUG
277 #define YYDEBUG 0
278 #endif
279 #define YYMAXTOKEN 260
280 #define YYUNDFTOKEN 266
281 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a))
282 #if YYDEBUG
283 #ifndef NULL
284 #define NULL (void*)0
285 #endif
286 static const char *const calc1_name[] = {
287
288 "end-of-file",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"'\\n'",NULL,NULL,
289 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
290 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,"'('","')'","'*'","'+'",
291 "','","'-'",NULL,"'/'",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
292 NULL,NULL,"'='",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
293 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
294 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
295 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
296 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
297 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
298 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
299 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
300 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
301 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
302 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
303 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
304 NULL,NULL,NULL,NULL,NULL,NULL,NULL,"DREG","VREG","CONST","UMINUS",NULL,NULL,
305 NULL,NULL,NULL,"illegal-symbol",
306 };
307 static const char *const calc1_rule[] = {
308 "$accept : line",
309 "lines :",
310 "lines : lines line",
311 "line : dexp '\\n'",
312 "line : vexp '\\n'",
313 "line : DREG '=' dexp '\\n'",
314 "line : VREG '=' vexp '\\n'",
315 "line : error '\\n'",
316 "dexp : CONST",
317 "dexp : DREG",
318 "dexp : dexp '+' dexp",
319 "dexp : dexp '-' dexp",
320 "dexp : dexp '*' dexp",
321 "dexp : dexp '/' dexp",
322 "dexp : '-' dexp",
323 "dexp : '(' dexp ')'",
324 "vexp : dexp",
325 "vexp : '(' dexp ',' dexp ')'",
326 "vexp : VREG",
327 "vexp : vexp '+' vexp",
328 "vexp : dexp '+' vexp",
329 "vexp : vexp '-' vexp",
330 "vexp : dexp '-' vexp",
331 "vexp : vexp '*' vexp",
332 "vexp : dexp '*' vexp",
333 "vexp : vexp '/' vexp",
334 "vexp : dexp '/' vexp",
335 "vexp : '-' vexp",
336 "vexp : '(' vexp ')'",
337
338 };
339 #endif
340
341 #if YYDEBUG
342 int yydebug;
343 #endif
344
345 int yyerrflag;
346 int yychar;
347 YYSTYPE yyval;
348 YYSTYPE yylval;
349 int yynerrs;
350
351 /* define the initial stack-sizes */
352 #ifdef YYSTACKSIZE
353 #undef YYMAXDEPTH
354 #define YYMAXDEPTH YYSTACKSIZE
355 #else
356 #ifdef YYMAXDEPTH
357 #define YYSTACKSIZE YYMAXDEPTH
358 #else
359 #define YYSTACKSIZE 10000
360 #define YYMAXDEPTH 10000
361 #endif
362 #endif
363
364 #define YYINITSTACKSIZE 200
365
366 typedef struct {
367 unsigned stacksize;
368 YYINT *s_base;
369 YYINT *s_mark;
370 YYINT *s_last;
371 YYSTYPE *l_base;
372 YYSTYPE *l_mark;
373 } YYSTACKDATA;
374 /* variables for the parser stack */
375 static YYSTACKDATA yystack;
376 #line 176 "calc1.y"
377 /* beginning of subroutines section */
378
379 #define BSZ 50 /* buffer size for floating point numbers */
380
381 /* lexical analysis */
382
383 static void
384 yyerror(const char *s)
385 {
386 fprintf(stderr, "%s\n", s);
387 }
388
389 int
390 yylex(void)
391 {
392 int c;
393
394 while ((c = getchar()) == ' ')
395 { /* skip over blanks */
396 }
397
398 if (isupper(c))
399 {
400 yylval.ival = c - 'A';
401 return (VREG);
402 }
403 if (islower(c))
404 {
405 yylval.ival = c - 'a';
406 return (DREG);
407 }
408
409 if (isdigit(c) || c == '.')
410 {
411 /* gobble up digits, points, exponents */
412 char buf[BSZ + 1], *cp = buf;
413 int dot = 0, expr = 0;
414
415 for (; (cp - buf) < BSZ; ++cp, c = getchar())
416 {
417
418 *cp = (char) c;
419 if (isdigit(c))
420 continue;
421 if (c == '.')
422 {
423 if (dot++ || expr)
424 return ('.'); /* will cause syntax error */
425 continue;
426 }
427
428 if (c == 'e')
429 {
430 if (expr++)
431 return ('e'); /* will cause syntax error */
432 continue;
433 }
434
435 /* end of number */
436 break;
437 }
438 *cp = '\0';
439
440 if ((cp - buf) >= BSZ)
441 printf("constant too long: truncated\n");
442 else
443 ungetc(c, stdin); /* push back last char read */
444 yylval.dval = atof(buf);
445 return (CONST);
446 }
447 return (c);
448 }
449
450 static INTERVAL
451 hilo(double a, double b, double c, double d)
452 {
453 /* returns the smallest interval containing a, b, c, and d */
454 /* used by *, / routines */
455 INTERVAL v;
456
457 if (a > b)
458 {
459 v.hi = a;
460 v.lo = b;
461 }
462 else
463 {
464 v.hi = b;
465 v.lo = a;
466 }
467
468 if (c > d)
469 {
470 if (c > v.hi)
471 v.hi = c;
472 if (d < v.lo)
473 v.lo = d;
474 }
475 else
476 {
477 if (d > v.hi)
478 v.hi = d;
479 if (c < v.lo)
480 v.lo = c;
481 }
482 return (v);
483 }
484
485 INTERVAL
486 vmul(double a, double b, INTERVAL v)
487 {
488 return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
489 }
490
491 int
492 dcheck(INTERVAL v)
493 {
494 if (v.hi >= 0. && v.lo <= 0.)
495 {
496 printf("divisor interval contains 0.\n");
497 return (1);
498 }
499 return (0);
500 }
501
502 INTERVAL
503 vdiv(double a, double b, INTERVAL v)
504 {
505 return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
506 }
507 #line 506 "calc1.tab.c"
508
509 #if YYDEBUG
510 #include <stdio.h> /* needed for printf */
511 #endif
512
513 #include <stdlib.h> /* needed for malloc, etc */
514 #include <string.h> /* needed for memset */
515
516 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
517 static int yygrowstack(YYSTACKDATA *data)
518 {
519 int i;
520 unsigned newsize;
521 YYINT *newss;
522 YYSTYPE *newvs;
523
524 if ((newsize = data->stacksize) == 0)
525 newsize = YYINITSTACKSIZE;
526 else if (newsize >= YYMAXDEPTH)
527 return YYENOMEM;
528 else if ((newsize *= 2) > YYMAXDEPTH)
529 newsize = YYMAXDEPTH;
530
531 i = (int) (data->s_mark - data->s_base);
532 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
533 if (newss == NULL)
534 return YYENOMEM;
535
536 data->s_base = newss;
537 data->s_mark = newss + i;
538
539 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
540 if (newvs == NULL)
541 return YYENOMEM;
542
543 data->l_base = newvs;
544 data->l_mark = newvs + i;
545
546 data->stacksize = newsize;
547 data->s_last = data->s_base + newsize - 1;
548 return 0;
549 }
550
551 #if YYPURE || defined(YY_NO_LEAKS)
552 static void yyfreestack(YYSTACKDATA *data)
553 {
554 free(data->s_base);
555 free(data->l_base);
556 memset(data, 0, sizeof(*data));
557 }
558 #else
559 #define yyfreestack(data) /* nothing */
560 #endif
561
562 #define YYABORT goto yyabort
563 #define YYREJECT goto yyabort
564 #define YYACCEPT goto yyaccept
565 #define YYERROR goto yyerrlab
566
567 int
568 YYPARSE_DECL()
569 {
570 int yym, yyn, yystate;
571 #if YYDEBUG
572 const char *yys;
573
574 if ((yys = getenv("YYDEBUG")) != NULL)
575 {
576 yyn = *yys;
577 if (yyn >= '0' && yyn <= '9')
578 yydebug = yyn - '0';
579 }
580 #endif
581
582 /* yym is set below */
583 /* yyn is set below */
584 yynerrs = 0;
585 yyerrflag = 0;
586 yychar = YYEMPTY;
587 yystate = 0;
588
589 #if YYPURE
590 memset(&yystack, 0, sizeof(yystack));
591 #endif
592
593 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
594 yystack.s_mark = yystack.s_base;
595 yystack.l_mark = yystack.l_base;
596 yystate = 0;
597 *yystack.s_mark = 0;
598
599 yyloop:
600 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
601 if (yychar < 0)
602 {
603 yychar = YYLEX;
604 if (yychar < 0) yychar = YYEOF;
605 #if YYDEBUG
606 if (yydebug)
607 {
608 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
609 printf("%sdebug: state %d, reading %d (%s)\n",
610 YYPREFIX, yystate, yychar, yys);
611 }
612 #endif
613 }
614 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
615 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
616 {
617 #if YYDEBUG
618 if (yydebug)
619 printf("%sdebug: state %d, shifting to state %d\n",
620 YYPREFIX, yystate, yytable[yyn]);
621 #endif
622 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
623 yystate = yytable[yyn];
624 *++yystack.s_mark = yytable[yyn];
625 *++yystack.l_mark = yylval;
626 yychar = YYEMPTY;
627 if (yyerrflag > 0) --yyerrflag;
628 goto yyloop;
629 }
630 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
631 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
632 {
633 yyn = yytable[yyn];
634 goto yyreduce;
635 }
636 if (yyerrflag != 0) goto yyinrecovery;
637
638 YYERROR_CALL("syntax error");
639
640 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
641 yyerrlab:
642 ++yynerrs;
643
644 yyinrecovery:
645 if (yyerrflag < 3)
646 {
647 yyerrflag = 3;
648 for (;;)
649 {
650 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
651 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
652 {
653 #if YYDEBUG
654 if (yydebug)
655 printf("%sdebug: state %d, error recovery shifting\
656 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
657 #endif
658 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
659 yystate = yytable[yyn];
660 *++yystack.s_mark = yytable[yyn];
661 *++yystack.l_mark = yylval;
662 goto yyloop;
663 }
664 else
665 {
666 #if YYDEBUG
667 if (yydebug)
668 printf("%sdebug: error recovery discarding state %d\n",
669 YYPREFIX, *yystack.s_mark);
670 #endif
671 if (yystack.s_mark <= yystack.s_base) goto yyabort;
672 --yystack.s_mark;
673 --yystack.l_mark;
674 }
675 }
676 }
677 else
678 {
679 if (yychar == YYEOF) goto yyabort;
680 #if YYDEBUG
681 if (yydebug)
682 {
683 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
684 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
685 YYPREFIX, yystate, yychar, yys);
686 }
687 #endif
688 yychar = YYEMPTY;
689 goto yyloop;
690 }
691
692 yyreduce:
693 #if YYDEBUG
694 if (yydebug)
695 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
696 YYPREFIX, yystate, yyn, yyrule[yyn]);
697 #endif
698 yym = yylen[yyn];
699 if (yym > 0)
700 yyval = yystack.l_mark[1-yym];
701 else
702 memset(&yyval, 0, sizeof yyval);
703
704 switch (yyn)
705 {
706 case 3:
707 #line 57 "calc1.y"
708 {
709 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
710 }
711 #line 710 "calc1.tab.c"
712 break;
713 case 4:
714 #line 61 "calc1.y"
715 {
716 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
717 }
718 #line 717 "calc1.tab.c"
719 break;
720 case 5:
721 #line 65 "calc1.y"
722 {
723 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
724 }
725 #line 724 "calc1.tab.c"
726 break;
727 case 6:
728 #line 69 "calc1.y"
729 {
730 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
731 }
732 #line 731 "calc1.tab.c"
733 break;
734 case 7:
735 #line 73 "calc1.y"
736 {
737 yyerrok;
738 }
739 #line 738 "calc1.tab.c"
740 break;
741 case 9:
742 #line 80 "calc1.y"
743 {
744 yyval.dval = dreg[yystack.l_mark[0].ival];
745 }
746 #line 745 "calc1.tab.c"
747 break;
748 case 10:
749 #line 84 "calc1.y"
750 {
751 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
752 }
753 #line 752 "calc1.tab.c"
754 break;
755 case 11:
756 #line 88 "calc1.y"
757 {
758 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
759 }
760 #line 759 "calc1.tab.c"
761 break;
762 case 12:
763 #line 92 "calc1.y"
764 {
765 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
766 }
767 #line 766 "calc1.tab.c"
768 break;
769 case 13:
770 #line 96 "calc1.y"
771 {
772 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
773 }
774 #line 773 "calc1.tab.c"
775 break;
776 case 14:
777 #line 100 "calc1.y"
778 {
779 yyval.dval = -yystack.l_mark[0].dval;
780 }
781 #line 780 "calc1.tab.c"
782 break;
783 case 15:
784 #line 104 "calc1.y"
785 {
786 yyval.dval = yystack.l_mark[-1].dval;
787 }
788 #line 787 "calc1.tab.c"
789 break;
790 case 16:
791 #line 110 "calc1.y"
792 {
793 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
794 }
795 #line 794 "calc1.tab.c"
796 break;
797 case 17:
798 #line 114 "calc1.y"
799 {
800 yyval.vval.lo = yystack.l_mark[-3].dval;
801 yyval.vval.hi = yystack.l_mark[-1].dval;
802 if ( yyval.vval.lo > yyval.vval.hi )
803 {
804 (void) printf("interval out of order\n");
805 YYERROR;
806 }
807 }
808 #line 807 "calc1.tab.c"
809 break;
810 case 18:
811 #line 124 "calc1.y"
812 {
813 yyval.vval = vreg[yystack.l_mark[0].ival];
814 }
815 #line 814 "calc1.tab.c"
816 break;
817 case 19:
818 #line 128 "calc1.y"
819 {
820 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
821 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
822 }
823 #line 822 "calc1.tab.c"
824 break;
825 case 20:
826 #line 133 "calc1.y"
827 {
828 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
829 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
830 }
831 #line 830 "calc1.tab.c"
832 break;
833 case 21:
834 #line 138 "calc1.y"
835 {
836 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
837 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
838 }
839 #line 838 "calc1.tab.c"
840 break;
841 case 22:
842 #line 143 "calc1.y"
843 {
844 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
845 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
846 }
847 #line 846 "calc1.tab.c"
848 break;
849 case 23:
850 #line 148 "calc1.y"
851 {
852 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
853 }
854 #line 853 "calc1.tab.c"
855 break;
856 case 24:
857 #line 152 "calc1.y"
858 {
859 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
860 }
861 #line 860 "calc1.tab.c"
862 break;
863 case 25:
864 #line 156 "calc1.y"
865 {
866 if (dcheck(yystack.l_mark[0].vval)) YYERROR;
867 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
868 }
869 #line 868 "calc1.tab.c"
870 break;
871 case 26:
872 #line 161 "calc1.y"
873 {
874 if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
875 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
876 }
877 #line 876 "calc1.tab.c"
878 break;
879 case 27:
880 #line 166 "calc1.y"
881 {
882 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
883 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
884 }
885 #line 884 "calc1.tab.c"
886 break;
887 case 28:
888 #line 171 "calc1.y"
889 {
890 yyval.vval = yystack.l_mark[-1].vval;
891 }
892 #line 891 "calc1.tab.c"
893 break;
894 #line 893 "calc1.tab.c"
895 }
896 yystack.s_mark -= yym;
897 yystate = *yystack.s_mark;
898 yystack.l_mark -= yym;
899 yym = yylhs[yyn];
900 if (yystate == 0 && yym == 0)
901 {
902 #if YYDEBUG
903 if (yydebug)
904 printf("%sdebug: after reduction, shifting from state 0 to\
905 state %d\n", YYPREFIX, YYFINAL);
906 #endif
907 yystate = YYFINAL;
908 *++yystack.s_mark = YYFINAL;
909 *++yystack.l_mark = yyval;
910 if (yychar < 0)
911 {
912 yychar = YYLEX;
913 if (yychar < 0) yychar = YYEOF;
914 #if YYDEBUG
915 if (yydebug)
916 {
917 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
918 printf("%sdebug: state %d, reading %d (%s)\n",
919 YYPREFIX, YYFINAL, yychar, yys);
920 }
921 #endif
922 }
923 if (yychar == YYEOF) goto yyaccept;
924 goto yyloop;
925 }
926 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
927 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
928 yystate = yytable[yyn];
929 else
930 yystate = yydgoto[yym];
931 #if YYDEBUG
932 if (yydebug)
933 printf("%sdebug: after reduction, shifting from state %d \
934 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
935 #endif
936 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
937 *++yystack.s_mark = (YYINT) yystate;
938 *++yystack.l_mark = yyval;
939 goto yyloop;
940
941 yyoverflow:
942 YYERROR_CALL("yacc stack overflow");
943
944 yyabort:
945 yyfreestack(&yystack);
946 return (1);
947
948 yyaccept:
949 yyfreestack(&yystack);
950 return (0);
951 }
952