calc1.tab.c revision 1.5 1 /* $NetBSD: calc1.tab.c,v 1.5 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
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 static const char *const calc1_name[] = {
284
285 "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,
286 0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,
287 0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
288 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
289 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
290 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
291 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
292 0,0,"DREG","VREG","CONST","UMINUS",0,0,0,0,0,"illegal-symbol",
293 };
294 static const char *const calc1_rule[] = {
295 "$accept : line",
296 "lines :",
297 "lines : lines line",
298 "line : dexp '\\n'",
299 "line : vexp '\\n'",
300 "line : DREG '=' dexp '\\n'",
301 "line : VREG '=' vexp '\\n'",
302 "line : error '\\n'",
303 "dexp : CONST",
304 "dexp : DREG",
305 "dexp : dexp '+' dexp",
306 "dexp : dexp '-' dexp",
307 "dexp : dexp '*' dexp",
308 "dexp : dexp '/' dexp",
309 "dexp : '-' dexp",
310 "dexp : '(' dexp ')'",
311 "vexp : dexp",
312 "vexp : '(' dexp ',' dexp ')'",
313 "vexp : VREG",
314 "vexp : vexp '+' vexp",
315 "vexp : dexp '+' vexp",
316 "vexp : vexp '-' vexp",
317 "vexp : dexp '-' vexp",
318 "vexp : vexp '*' vexp",
319 "vexp : dexp '*' vexp",
320 "vexp : vexp '/' vexp",
321 "vexp : dexp '/' vexp",
322 "vexp : '-' vexp",
323 "vexp : '(' vexp ')'",
324
325 };
326 #endif
327
328 #if YYDEBUG
329 int yydebug;
330 #endif
331
332 int yyerrflag;
333 int yychar;
334 YYSTYPE yyval;
335 YYSTYPE yylval;
336 int yynerrs;
337
338 /* define the initial stack-sizes */
339 #ifdef YYSTACKSIZE
340 #undef YYMAXDEPTH
341 #define YYMAXDEPTH YYSTACKSIZE
342 #else
343 #ifdef YYMAXDEPTH
344 #define YYSTACKSIZE YYMAXDEPTH
345 #else
346 #define YYSTACKSIZE 10000
347 #define YYMAXDEPTH 10000
348 #endif
349 #endif
350
351 #define YYINITSTACKSIZE 200
352
353 typedef struct {
354 unsigned stacksize;
355 YYINT *s_base;
356 YYINT *s_mark;
357 YYINT *s_last;
358 YYSTYPE *l_base;
359 YYSTYPE *l_mark;
360 } YYSTACKDATA;
361 /* variables for the parser stack */
362 static YYSTACKDATA yystack;
363 #line 176 "calc1.y"
364 /* beginning of subroutines section */
365
366 #define BSZ 50 /* buffer size for floating point numbers */
367
368 /* lexical analysis */
369
370 static void
371 yyerror(const char *s)
372 {
373 fprintf(stderr, "%s\n", s);
374 }
375
376 int
377 yylex(void)
378 {
379 int c;
380
381 while ((c = getchar()) == ' ')
382 { /* skip over blanks */
383 }
384
385 if (isupper(c))
386 {
387 yylval.ival = c - 'A';
388 return (VREG);
389 }
390 if (islower(c))
391 {
392 yylval.ival = c - 'a';
393 return (DREG);
394 }
395
396 if (isdigit(c) || c == '.')
397 {
398 /* gobble up digits, points, exponents */
399 char buf[BSZ + 1], *cp = buf;
400 int dot = 0, expr = 0;
401
402 for (; (cp - buf) < BSZ; ++cp, c = getchar())
403 {
404
405 *cp = (char) c;
406 if (isdigit(c))
407 continue;
408 if (c == '.')
409 {
410 if (dot++ || expr)
411 return ('.'); /* will cause syntax error */
412 continue;
413 }
414
415 if (c == 'e')
416 {
417 if (expr++)
418 return ('e'); /* will cause syntax error */
419 continue;
420 }
421
422 /* end of number */
423 break;
424 }
425 *cp = '\0';
426
427 if ((cp - buf) >= BSZ)
428 printf("constant too long: truncated\n");
429 else
430 ungetc(c, stdin); /* push back last char read */
431 yylval.dval = atof(buf);
432 return (CONST);
433 }
434 return (c);
435 }
436
437 static INTERVAL
438 hilo(double a, double b, double c, double d)
439 {
440 /* returns the smallest interval containing a, b, c, and d */
441 /* used by *, / routines */
442 INTERVAL v;
443
444 if (a > b)
445 {
446 v.hi = a;
447 v.lo = b;
448 }
449 else
450 {
451 v.hi = b;
452 v.lo = a;
453 }
454
455 if (c > d)
456 {
457 if (c > v.hi)
458 v.hi = c;
459 if (d < v.lo)
460 v.lo = d;
461 }
462 else
463 {
464 if (d > v.hi)
465 v.hi = d;
466 if (c < v.lo)
467 v.lo = c;
468 }
469 return (v);
470 }
471
472 INTERVAL
473 vmul(double a, double b, INTERVAL v)
474 {
475 return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
476 }
477
478 int
479 dcheck(INTERVAL v)
480 {
481 if (v.hi >= 0. && v.lo <= 0.)
482 {
483 printf("divisor interval contains 0.\n");
484 return (1);
485 }
486 return (0);
487 }
488
489 INTERVAL
490 vdiv(double a, double b, INTERVAL v)
491 {
492 return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
493 }
494 #line 493 "calc1.tab.c"
495
496 #if YYDEBUG
497 #include <stdio.h> /* needed for printf */
498 #endif
499
500 #include <stdlib.h> /* needed for malloc, etc */
501 #include <string.h> /* needed for memset */
502
503 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
504 static int yygrowstack(YYSTACKDATA *data)
505 {
506 int i;
507 unsigned newsize;
508 YYINT *newss;
509 YYSTYPE *newvs;
510
511 if ((newsize = data->stacksize) == 0)
512 newsize = YYINITSTACKSIZE;
513 else if (newsize >= YYMAXDEPTH)
514 return YYENOMEM;
515 else if ((newsize *= 2) > YYMAXDEPTH)
516 newsize = YYMAXDEPTH;
517
518 i = (int) (data->s_mark - data->s_base);
519 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss));
520 if (newss == 0)
521 return YYENOMEM;
522
523 data->s_base = newss;
524 data->s_mark = newss + i;
525
526 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
527 if (newvs == 0)
528 return YYENOMEM;
529
530 data->l_base = newvs;
531 data->l_mark = newvs + i;
532
533 data->stacksize = newsize;
534 data->s_last = data->s_base + newsize - 1;
535 return 0;
536 }
537
538 #if YYPURE || defined(YY_NO_LEAKS)
539 static void yyfreestack(YYSTACKDATA *data)
540 {
541 free(data->s_base);
542 free(data->l_base);
543 memset(data, 0, sizeof(*data));
544 }
545 #else
546 #define yyfreestack(data) /* nothing */
547 #endif
548
549 #define YYABORT goto yyabort
550 #define YYREJECT goto yyabort
551 #define YYACCEPT goto yyaccept
552 #define YYERROR goto yyerrlab
553
554 int
555 YYPARSE_DECL()
556 {
557 int yym, yyn, yystate;
558 #if YYDEBUG
559 const char *yys;
560
561 if ((yys = getenv("YYDEBUG")) != 0)
562 {
563 yyn = *yys;
564 if (yyn >= '0' && yyn <= '9')
565 yydebug = yyn - '0';
566 }
567 #endif
568
569 /* yym is set below */
570 /* yyn is set below */
571 yynerrs = 0;
572 yyerrflag = 0;
573 yychar = YYEMPTY;
574 yystate = 0;
575
576 #if YYPURE
577 memset(&yystack, 0, sizeof(yystack));
578 #endif
579
580 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
581 yystack.s_mark = yystack.s_base;
582 yystack.l_mark = yystack.l_base;
583 yystate = 0;
584 *yystack.s_mark = 0;
585
586 yyloop:
587 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
588 if (yychar < 0)
589 {
590 yychar = YYLEX;
591 if (yychar < 0) yychar = YYEOF;
592 #if YYDEBUG
593 if (yydebug)
594 {
595 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
596 printf("%sdebug: state %d, reading %d (%s)\n",
597 YYPREFIX, yystate, yychar, yys);
598 }
599 #endif
600 }
601 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
602 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
603 {
604 #if YYDEBUG
605 if (yydebug)
606 printf("%sdebug: state %d, shifting to state %d\n",
607 YYPREFIX, yystate, yytable[yyn]);
608 #endif
609 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
610 yystate = yytable[yyn];
611 *++yystack.s_mark = yytable[yyn];
612 *++yystack.l_mark = yylval;
613 yychar = YYEMPTY;
614 if (yyerrflag > 0) --yyerrflag;
615 goto yyloop;
616 }
617 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 &&
618 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar)
619 {
620 yyn = yytable[yyn];
621 goto yyreduce;
622 }
623 if (yyerrflag != 0) goto yyinrecovery;
624
625 YYERROR_CALL("syntax error");
626
627 goto yyerrlab; /* redundant goto avoids 'unused label' warning */
628 yyerrlab:
629 ++yynerrs;
630
631 yyinrecovery:
632 if (yyerrflag < 3)
633 {
634 yyerrflag = 3;
635 for (;;)
636 {
637 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 &&
638 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE)
639 {
640 #if YYDEBUG
641 if (yydebug)
642 printf("%sdebug: state %d, error recovery shifting\
643 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
644 #endif
645 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
646 yystate = yytable[yyn];
647 *++yystack.s_mark = yytable[yyn];
648 *++yystack.l_mark = yylval;
649 goto yyloop;
650 }
651 else
652 {
653 #if YYDEBUG
654 if (yydebug)
655 printf("%sdebug: error recovery discarding state %d\n",
656 YYPREFIX, *yystack.s_mark);
657 #endif
658 if (yystack.s_mark <= yystack.s_base) goto yyabort;
659 --yystack.s_mark;
660 --yystack.l_mark;
661 }
662 }
663 }
664 else
665 {
666 if (yychar == YYEOF) goto yyabort;
667 #if YYDEBUG
668 if (yydebug)
669 {
670 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
671 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
672 YYPREFIX, yystate, yychar, yys);
673 }
674 #endif
675 yychar = YYEMPTY;
676 goto yyloop;
677 }
678
679 yyreduce:
680 #if YYDEBUG
681 if (yydebug)
682 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
683 YYPREFIX, yystate, yyn, yyrule[yyn]);
684 #endif
685 yym = yylen[yyn];
686 if (yym > 0)
687 yyval = yystack.l_mark[1-yym];
688 else
689 memset(&yyval, 0, sizeof yyval);
690
691 switch (yyn)
692 {
693 case 3:
694 #line 57 "calc1.y"
695 {
696 (void) printf("%15.8f\n", yystack.l_mark[-1].dval);
697 }
698 #line 697 "calc1.tab.c"
699 break;
700 case 4:
701 #line 61 "calc1.y"
702 {
703 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
704 }
705 #line 704 "calc1.tab.c"
706 break;
707 case 5:
708 #line 65 "calc1.y"
709 {
710 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
711 }
712 #line 711 "calc1.tab.c"
713 break;
714 case 6:
715 #line 69 "calc1.y"
716 {
717 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
718 }
719 #line 718 "calc1.tab.c"
720 break;
721 case 7:
722 #line 73 "calc1.y"
723 {
724 yyerrok;
725 }
726 #line 725 "calc1.tab.c"
727 break;
728 case 9:
729 #line 80 "calc1.y"
730 {
731 yyval.dval = dreg[yystack.l_mark[0].ival];
732 }
733 #line 732 "calc1.tab.c"
734 break;
735 case 10:
736 #line 84 "calc1.y"
737 {
738 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
739 }
740 #line 739 "calc1.tab.c"
741 break;
742 case 11:
743 #line 88 "calc1.y"
744 {
745 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
746 }
747 #line 746 "calc1.tab.c"
748 break;
749 case 12:
750 #line 92 "calc1.y"
751 {
752 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
753 }
754 #line 753 "calc1.tab.c"
755 break;
756 case 13:
757 #line 96 "calc1.y"
758 {
759 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
760 }
761 #line 760 "calc1.tab.c"
762 break;
763 case 14:
764 #line 100 "calc1.y"
765 {
766 yyval.dval = -yystack.l_mark[0].dval;
767 }
768 #line 767 "calc1.tab.c"
769 break;
770 case 15:
771 #line 104 "calc1.y"
772 {
773 yyval.dval = yystack.l_mark[-1].dval;
774 }
775 #line 774 "calc1.tab.c"
776 break;
777 case 16:
778 #line 110 "calc1.y"
779 {
780 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
781 }
782 #line 781 "calc1.tab.c"
783 break;
784 case 17:
785 #line 114 "calc1.y"
786 {
787 yyval.vval.lo = yystack.l_mark[-3].dval;
788 yyval.vval.hi = yystack.l_mark[-1].dval;
789 if ( yyval.vval.lo > yyval.vval.hi )
790 {
791 (void) printf("interval out of order\n");
792 YYERROR;
793 }
794 }
795 #line 794 "calc1.tab.c"
796 break;
797 case 18:
798 #line 124 "calc1.y"
799 {
800 yyval.vval = vreg[yystack.l_mark[0].ival];
801 }
802 #line 801 "calc1.tab.c"
803 break;
804 case 19:
805 #line 128 "calc1.y"
806 {
807 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
808 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
809 }
810 #line 809 "calc1.tab.c"
811 break;
812 case 20:
813 #line 133 "calc1.y"
814 {
815 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
816 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
817 }
818 #line 817 "calc1.tab.c"
819 break;
820 case 21:
821 #line 138 "calc1.y"
822 {
823 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
824 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
825 }
826 #line 825 "calc1.tab.c"
827 break;
828 case 22:
829 #line 143 "calc1.y"
830 {
831 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
832 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
833 }
834 #line 833 "calc1.tab.c"
835 break;
836 case 23:
837 #line 148 "calc1.y"
838 {
839 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
840 }
841 #line 840 "calc1.tab.c"
842 break;
843 case 24:
844 #line 152 "calc1.y"
845 {
846 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
847 }
848 #line 847 "calc1.tab.c"
849 break;
850 case 25:
851 #line 156 "calc1.y"
852 {
853 if (dcheck(yystack.l_mark[0].vval)) YYERROR;
854 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
855 }
856 #line 855 "calc1.tab.c"
857 break;
858 case 26:
859 #line 161 "calc1.y"
860 {
861 if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
862 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
863 }
864 #line 863 "calc1.tab.c"
865 break;
866 case 27:
867 #line 166 "calc1.y"
868 {
869 yyval.vval.hi = -yystack.l_mark[0].vval.lo;
870 yyval.vval.lo = -yystack.l_mark[0].vval.hi;
871 }
872 #line 871 "calc1.tab.c"
873 break;
874 case 28:
875 #line 171 "calc1.y"
876 {
877 yyval.vval = yystack.l_mark[-1].vval;
878 }
879 #line 878 "calc1.tab.c"
880 break;
881 #line 880 "calc1.tab.c"
882 }
883 yystack.s_mark -= yym;
884 yystate = *yystack.s_mark;
885 yystack.l_mark -= yym;
886 yym = yylhs[yyn];
887 if (yystate == 0 && yym == 0)
888 {
889 #if YYDEBUG
890 if (yydebug)
891 printf("%sdebug: after reduction, shifting from state 0 to\
892 state %d\n", YYPREFIX, YYFINAL);
893 #endif
894 yystate = YYFINAL;
895 *++yystack.s_mark = YYFINAL;
896 *++yystack.l_mark = yyval;
897 if (yychar < 0)
898 {
899 yychar = YYLEX;
900 if (yychar < 0) yychar = YYEOF;
901 #if YYDEBUG
902 if (yydebug)
903 {
904 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN];
905 printf("%sdebug: state %d, reading %d (%s)\n",
906 YYPREFIX, YYFINAL, yychar, yys);
907 }
908 #endif
909 }
910 if (yychar == YYEOF) goto yyaccept;
911 goto yyloop;
912 }
913 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 &&
914 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate)
915 yystate = yytable[yyn];
916 else
917 yystate = yydgoto[yym];
918 #if YYDEBUG
919 if (yydebug)
920 printf("%sdebug: after reduction, shifting from state %d \
921 to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
922 #endif
923 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow;
924 *++yystack.s_mark = (YYINT) yystate;
925 *++yystack.l_mark = yyval;
926 goto yyloop;
927
928 yyoverflow:
929 YYERROR_CALL("yacc stack overflow");
930
931 yyabort:
932 yyfreestack(&yystack);
933 return (1);
934
935 yyaccept:
936 yyfreestack(&yystack);
937 return (0);
938 }
939