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