1 /* $NetBSD: calc1.tab.c,v 1.4 2021/02/20 22:57:57 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 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 short 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 = 0; 570 yyn = 0; 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 break; 699 case 4: 700 #line 61 "calc1.y" 701 { 702 (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi); 703 } 704 break; 705 case 5: 706 #line 65 "calc1.y" 707 { 708 dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval; 709 } 710 break; 711 case 6: 712 #line 69 "calc1.y" 713 { 714 vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval; 715 } 716 break; 717 case 7: 718 #line 73 "calc1.y" 719 { 720 yyerrok; 721 } 722 break; 723 case 9: 724 #line 80 "calc1.y" 725 { 726 yyval.dval = dreg[yystack.l_mark[0].ival]; 727 } 728 break; 729 case 10: 730 #line 84 "calc1.y" 731 { 732 yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval; 733 } 734 break; 735 case 11: 736 #line 88 "calc1.y" 737 { 738 yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval; 739 } 740 break; 741 case 12: 742 #line 92 "calc1.y" 743 { 744 yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval; 745 } 746 break; 747 case 13: 748 #line 96 "calc1.y" 749 { 750 yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval; 751 } 752 break; 753 case 14: 754 #line 100 "calc1.y" 755 { 756 yyval.dval = -yystack.l_mark[0].dval; 757 } 758 break; 759 case 15: 760 #line 104 "calc1.y" 761 { 762 yyval.dval = yystack.l_mark[-1].dval; 763 } 764 break; 765 case 16: 766 #line 110 "calc1.y" 767 { 768 yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval; 769 } 770 break; 771 case 17: 772 #line 114 "calc1.y" 773 { 774 yyval.vval.lo = yystack.l_mark[-3].dval; 775 yyval.vval.hi = yystack.l_mark[-1].dval; 776 if ( yyval.vval.lo > yyval.vval.hi ) 777 { 778 (void) printf("interval out of order\n"); 779 YYERROR; 780 } 781 } 782 break; 783 case 18: 784 #line 124 "calc1.y" 785 { 786 yyval.vval = vreg[yystack.l_mark[0].ival]; 787 } 788 break; 789 case 19: 790 #line 128 "calc1.y" 791 { 792 yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi; 793 yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo; 794 } 795 break; 796 case 20: 797 #line 133 "calc1.y" 798 { 799 yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi; 800 yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo; 801 } 802 break; 803 case 21: 804 #line 138 "calc1.y" 805 { 806 yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo; 807 yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi; 808 } 809 break; 810 case 22: 811 #line 143 "calc1.y" 812 { 813 yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo; 814 yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi; 815 } 816 break; 817 case 23: 818 #line 148 "calc1.y" 819 { 820 yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); 821 } 822 break; 823 case 24: 824 #line 152 "calc1.y" 825 { 826 yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); 827 } 828 break; 829 case 25: 830 #line 156 "calc1.y" 831 { 832 if (dcheck(yystack.l_mark[0].vval)) YYERROR; 833 yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); 834 } 835 break; 836 case 26: 837 #line 161 "calc1.y" 838 { 839 if (dcheck ( yystack.l_mark[0].vval )) YYERROR; 840 yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); 841 } 842 break; 843 case 27: 844 #line 166 "calc1.y" 845 { 846 yyval.vval.hi = -yystack.l_mark[0].vval.lo; 847 yyval.vval.lo = -yystack.l_mark[0].vval.hi; 848 } 849 break; 850 case 28: 851 #line 171 "calc1.y" 852 { 853 yyval.vval = yystack.l_mark[-1].vval; 854 } 855 break; 856 #line 855 "calc1.tab.c" 857 } 858 yystack.s_mark -= yym; 859 yystate = *yystack.s_mark; 860 yystack.l_mark -= yym; 861 yym = yylhs[yyn]; 862 if (yystate == 0 && yym == 0) 863 { 864 #if YYDEBUG 865 if (yydebug) 866 printf("%sdebug: after reduction, shifting from state 0 to\ 867 state %d\n", YYPREFIX, YYFINAL); 868 #endif 869 yystate = YYFINAL; 870 *++yystack.s_mark = YYFINAL; 871 *++yystack.l_mark = yyval; 872 if (yychar < 0) 873 { 874 yychar = YYLEX; 875 if (yychar < 0) yychar = YYEOF; 876 #if YYDEBUG 877 if (yydebug) 878 { 879 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 880 printf("%sdebug: state %d, reading %d (%s)\n", 881 YYPREFIX, YYFINAL, yychar, yys); 882 } 883 #endif 884 } 885 if (yychar == YYEOF) goto yyaccept; 886 goto yyloop; 887 } 888 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 && 889 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate) 890 yystate = yytable[yyn]; 891 else 892 yystate = yydgoto[yym]; 893 #if YYDEBUG 894 if (yydebug) 895 printf("%sdebug: after reduction, shifting from state %d \ 896 to state %d\n", YYPREFIX, *yystack.s_mark, yystate); 897 #endif 898 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 899 *++yystack.s_mark = (YYINT) yystate; 900 *++yystack.l_mark = yyval; 901 goto yyloop; 902 903 yyoverflow: 904 YYERROR_CALL("yacc stack overflow"); 905 906 yyabort: 907 yyfreestack(&yystack); 908 return (1); 909 910 yyaccept: 911 yyfreestack(&yystack); 912 return (0); 913 } 914