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