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