Home | History | Annotate | Line # | Download | only in yacc
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