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