1264790Sbapt/* original parser id follows */ 2264790Sbapt/* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */ 3264790Sbapt/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */ 4264790Sbapt 5264790Sbapt#define YYBYACC 1 6264790Sbapt#define YYMAJOR 1 7264790Sbapt#define YYMINOR 9 8264790Sbapt#define YYCHECK "yyyymmdd" 9264790Sbapt 10264790Sbapt#define YYEMPTY (-1) 11264790Sbapt#define yyclearin (yychar = YYEMPTY) 12264790Sbapt#define yyerrok (yyerrflag = 0) 13264790Sbapt#define YYRECOVERING() (yyerrflag != 0) 14264790Sbapt#define YYENOMEM (-2) 15264790Sbapt#define YYEOF 0 16264790Sbapt 17264790Sbapt#ifndef yyparse 18264790Sbapt#define yyparse calc1_parse 19264790Sbapt#endif /* yyparse */ 20264790Sbapt 21264790Sbapt#ifndef yylex 22264790Sbapt#define yylex calc1_lex 23264790Sbapt#endif /* yylex */ 24264790Sbapt 25264790Sbapt#ifndef yyerror 26264790Sbapt#define yyerror calc1_error 27264790Sbapt#endif /* yyerror */ 28264790Sbapt 29264790Sbapt#ifndef yychar 30264790Sbapt#define yychar calc1_char 31264790Sbapt#endif /* yychar */ 32264790Sbapt 33264790Sbapt#ifndef yyval 34264790Sbapt#define yyval calc1_val 35264790Sbapt#endif /* yyval */ 36264790Sbapt 37264790Sbapt#ifndef yylval 38264790Sbapt#define yylval calc1_lval 39264790Sbapt#endif /* yylval */ 40264790Sbapt 41264790Sbapt#ifndef yydebug 42264790Sbapt#define yydebug calc1_debug 43264790Sbapt#endif /* yydebug */ 44264790Sbapt 45264790Sbapt#ifndef yynerrs 46264790Sbapt#define yynerrs calc1_nerrs 47264790Sbapt#endif /* yynerrs */ 48264790Sbapt 49264790Sbapt#ifndef yyerrflag 50264790Sbapt#define yyerrflag calc1_errflag 51264790Sbapt#endif /* yyerrflag */ 52264790Sbapt 53264790Sbapt#ifndef yylhs 54264790Sbapt#define yylhs calc1_lhs 55264790Sbapt#endif /* yylhs */ 56264790Sbapt 57264790Sbapt#ifndef yylen 58264790Sbapt#define yylen calc1_len 59264790Sbapt#endif /* yylen */ 60264790Sbapt 61264790Sbapt#ifndef yydefred 62264790Sbapt#define yydefred calc1_defred 63264790Sbapt#endif /* yydefred */ 64264790Sbapt 65264790Sbapt#ifndef yydgoto 66264790Sbapt#define yydgoto calc1_dgoto 67264790Sbapt#endif /* yydgoto */ 68264790Sbapt 69264790Sbapt#ifndef yysindex 70264790Sbapt#define yysindex calc1_sindex 71264790Sbapt#endif /* yysindex */ 72264790Sbapt 73264790Sbapt#ifndef yyrindex 74264790Sbapt#define yyrindex calc1_rindex 75264790Sbapt#endif /* yyrindex */ 76264790Sbapt 77264790Sbapt#ifndef yygindex 78264790Sbapt#define yygindex calc1_gindex 79264790Sbapt#endif /* yygindex */ 80264790Sbapt 81264790Sbapt#ifndef yytable 82264790Sbapt#define yytable calc1_table 83264790Sbapt#endif /* yytable */ 84264790Sbapt 85264790Sbapt#ifndef yycheck 86264790Sbapt#define yycheck calc1_check 87264790Sbapt#endif /* yycheck */ 88264790Sbapt 89264790Sbapt#ifndef yyname 90264790Sbapt#define yyname calc1_name 91264790Sbapt#endif /* yyname */ 92264790Sbapt 93264790Sbapt#ifndef yyrule 94264790Sbapt#define yyrule calc1_rule 95264790Sbapt#endif /* yyrule */ 96264790Sbapt#define YYPREFIX "calc1_" 97264790Sbapt 98264790Sbapt#define YYPURE 0 99264790Sbapt 100264790Sbapt#line 2 "calc1.y" 101264790Sbapt 102264790Sbapt/* http://dinosaur.compilertools.net/yacc/index.html */ 103264790Sbapt 104264790Sbapt#include <stdlib.h> 105264790Sbapt#include <stdio.h> 106264790Sbapt#include <ctype.h> 107264790Sbapt#include <math.h> 108264790Sbapt 109264790Sbapttypedef struct interval 110264790Sbapt{ 111264790Sbapt double lo, hi; 112264790Sbapt} 113264790SbaptINTERVAL; 114264790Sbapt 115264790SbaptINTERVAL vmul(double, double, INTERVAL); 116264790SbaptINTERVAL vdiv(double, double, INTERVAL); 117264790Sbapt 118264790Sbaptextern int yylex(void); 119264790Sbaptstatic void yyerror(const char *s); 120264790Sbapt 121264790Sbaptint dcheck(INTERVAL); 122264790Sbapt 123264790Sbaptdouble dreg[26]; 124264790SbaptINTERVAL vreg[26]; 125264790Sbapt 126264790Sbapt#line 31 "calc1.y" 127264790Sbapt#ifdef YYSTYPE 128264790Sbapt#undef YYSTYPE_IS_DECLARED 129264790Sbapt#define YYSTYPE_IS_DECLARED 1 130264790Sbapt#endif 131264790Sbapt#ifndef YYSTYPE_IS_DECLARED 132264790Sbapt#define YYSTYPE_IS_DECLARED 1 133264790Sbapttypedef union 134264790Sbapt{ 135264790Sbapt int ival; 136264790Sbapt double dval; 137264790Sbapt INTERVAL vval; 138264790Sbapt} YYSTYPE; 139264790Sbapt#endif /* !YYSTYPE_IS_DECLARED */ 140264790Sbapt#line 141 "calc1.tab.c" 141264790Sbapt 142264790Sbapt/* compatibility with bison */ 143264790Sbapt#ifdef YYPARSE_PARAM 144264790Sbapt/* compatibility with FreeBSD */ 145264790Sbapt# ifdef YYPARSE_PARAM_TYPE 146264790Sbapt# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) 147264790Sbapt# else 148264790Sbapt# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) 149264790Sbapt# endif 150264790Sbapt#else 151264790Sbapt# define YYPARSE_DECL() yyparse(void) 152264790Sbapt#endif 153264790Sbapt 154264790Sbapt/* Parameters sent to lex. */ 155264790Sbapt#ifdef YYLEX_PARAM 156264790Sbapt# define YYLEX_DECL() yylex(void *YYLEX_PARAM) 157264790Sbapt# define YYLEX yylex(YYLEX_PARAM) 158264790Sbapt#else 159264790Sbapt# define YYLEX_DECL() yylex(void) 160264790Sbapt# define YYLEX yylex() 161264790Sbapt#endif 162264790Sbapt 163264790Sbapt/* Parameters sent to yyerror. */ 164264790Sbapt#ifndef YYERROR_DECL 165264790Sbapt#define YYERROR_DECL() yyerror(const char *s) 166264790Sbapt#endif 167264790Sbapt#ifndef YYERROR_CALL 168264790Sbapt#define YYERROR_CALL(msg) yyerror(msg) 169264790Sbapt#endif 170264790Sbapt 171264790Sbaptextern int YYPARSE_DECL(); 172264790Sbapt 173264790Sbapt#define DREG 257 174264790Sbapt#define VREG 258 175264790Sbapt#define CONST 259 176264790Sbapt#define UMINUS 260 177264790Sbapt#define YYERRCODE 256 178274475Sjkimtypedef int YYINT; 179264790Sbaptstatic const YYINT calc1_lhs[] = { -1, 180264790Sbapt 3, 3, 0, 0, 0, 0, 0, 1, 1, 1, 181264790Sbapt 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 182264790Sbapt 2, 2, 2, 2, 2, 2, 2, 2, 183264790Sbapt}; 184264790Sbaptstatic const YYINT calc1_len[] = { 2, 185264790Sbapt 0, 2, 2, 2, 4, 4, 2, 1, 1, 3, 186264790Sbapt 3, 3, 3, 2, 3, 1, 5, 1, 3, 3, 187264790Sbapt 3, 3, 3, 3, 3, 3, 2, 3, 188264790Sbapt}; 189264790Sbaptstatic const YYINT calc1_defred[] = { 0, 190264790Sbapt 0, 0, 0, 8, 0, 0, 0, 0, 0, 7, 191264790Sbapt 0, 0, 9, 18, 14, 27, 0, 0, 0, 0, 192264790Sbapt 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 193264790Sbapt 0, 0, 0, 15, 0, 28, 0, 0, 0, 0, 194264790Sbapt 12, 24, 13, 26, 0, 0, 23, 25, 14, 0, 195264790Sbapt 0, 0, 0, 0, 5, 6, 0, 0, 0, 12, 196264790Sbapt 13, 17, 197264790Sbapt}; 198264790Sbaptstatic const YYINT calc1_dgoto[] = { 7, 199264790Sbapt 32, 9, 0, 200264790Sbapt}; 201264790Sbaptstatic const YYINT calc1_sindex[] = { -40, 202264790Sbapt -8, -48, -47, 0, -37, -37, 0, 2, 17, 0, 203264790Sbapt -34, -37, 0, 0, 0, 0, -25, 90, -37, -37, 204264790Sbapt -37, -37, 0, -37, -37, -37, -37, 0, -34, -34, 205264790Sbapt 25, 125, 31, 0, -34, 0, -11, 37, -11, 37, 206264790Sbapt 0, 0, 0, 0, 37, 37, 0, 0, 0, 111, 207264790Sbapt -34, -34, -34, -34, 0, 0, 118, 69, 69, 0, 208264790Sbapt 0, 0, 209264790Sbapt}; 210264790Sbaptstatic const YYINT calc1_rindex[] = { 0, 211264790Sbapt 0, 38, 44, 0, 0, 0, 0, 0, 0, 0, 212264790Sbapt 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213264790Sbapt 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214264790Sbapt 0, -9, 0, 0, 0, 0, 51, -3, 56, 61, 215264790Sbapt 0, 0, 0, 0, 67, 72, 0, 0, 0, 0, 216264790Sbapt 0, 0, 0, 0, 0, 0, 0, 78, 83, 0, 217264790Sbapt 0, 0, 218264790Sbapt}; 219264790Sbaptstatic const YYINT calc1_gindex[] = { 0, 220264790Sbapt 4, 124, 0, 221264790Sbapt}; 222264790Sbapt#define YYTABLESIZE 225 223264790Sbaptstatic const YYINT calc1_table[] = { 6, 224264790Sbapt 16, 10, 6, 8, 5, 30, 20, 5, 15, 17, 225264790Sbapt 29, 23, 11, 12, 31, 34, 21, 19, 35, 20, 226264790Sbapt 0, 22, 37, 39, 41, 43, 28, 0, 0, 0, 227264790Sbapt 21, 16, 49, 50, 55, 22, 0, 20, 57, 20, 228264790Sbapt 56, 20, 0, 21, 19, 0, 20, 9, 22, 0, 229264790Sbapt 0, 0, 0, 18, 58, 59, 60, 61, 26, 24, 230264790Sbapt 10, 25, 0, 27, 0, 11, 53, 51, 0, 52, 231264790Sbapt 22, 54, 26, 24, 0, 25, 19, 27, 26, 9, 232264790Sbapt 9, 21, 9, 27, 9, 18, 18, 10, 18, 0, 233264790Sbapt 18, 10, 11, 10, 10, 10, 11, 0, 11, 11, 234264790Sbapt 11, 22, 0, 22, 0, 22, 0, 19, 0, 19, 235264790Sbapt 53, 19, 21, 0, 21, 54, 21, 0, 10, 0, 236264790Sbapt 10, 0, 10, 11, 0, 11, 0, 11, 16, 18, 237264790Sbapt 36, 26, 24, 0, 25, 33, 27, 0, 0, 0, 238264790Sbapt 0, 0, 38, 40, 42, 44, 0, 45, 46, 47, 239264790Sbapt 48, 34, 53, 51, 0, 52, 0, 54, 62, 53, 240264790Sbapt 51, 0, 52, 0, 54, 0, 21, 19, 0, 20, 241264790Sbapt 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 242264790Sbapt 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243264790Sbapt 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244264790Sbapt 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245264790Sbapt 0, 0, 0, 0, 0, 1, 2, 3, 4, 13, 246264790Sbapt 14, 4, 13, 0, 4, 247264790Sbapt}; 248264790Sbaptstatic const YYINT calc1_check[] = { 40, 249264790Sbapt 10, 10, 40, 0, 45, 40, 10, 45, 5, 6, 250264790Sbapt 45, 10, 61, 61, 11, 41, 42, 43, 44, 45, 251264790Sbapt -1, 47, 19, 20, 21, 22, 10, -1, -1, -1, 252264790Sbapt 42, 41, 29, 30, 10, 47, -1, 41, 35, 43, 253264790Sbapt 10, 45, -1, 42, 43, -1, 45, 10, 47, -1, 254264790Sbapt -1, -1, -1, 10, 51, 52, 53, 54, 42, 43, 255264790Sbapt 10, 45, -1, 47, -1, 10, 42, 43, -1, 45, 256264790Sbapt 10, 47, 42, 43, -1, 45, 10, 47, 42, 42, 257264790Sbapt 43, 10, 45, 47, 47, 42, 43, 10, 45, -1, 258264790Sbapt 47, 41, 10, 43, 44, 45, 41, -1, 43, 44, 259264790Sbapt 45, 41, -1, 43, -1, 45, -1, 41, -1, 43, 260264790Sbapt 42, 45, 41, -1, 43, 47, 45, -1, 41, -1, 261264790Sbapt 43, -1, 45, 41, -1, 43, -1, 45, 5, 6, 262264790Sbapt 41, 42, 43, -1, 45, 12, 47, -1, -1, -1, 263264790Sbapt -1, -1, 19, 20, 21, 22, -1, 24, 25, 26, 264264790Sbapt 27, 41, 42, 43, -1, 45, -1, 47, 41, 42, 265264790Sbapt 43, -1, 45, -1, 47, -1, 42, 43, -1, 45, 266264790Sbapt -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, 267264790Sbapt -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 268264790Sbapt -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 269264790Sbapt -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 270264790Sbapt -1, -1, -1, -1, -1, 256, 257, 258, 259, 257, 271264790Sbapt 258, 259, 257, -1, 259, 272264790Sbapt}; 273264790Sbapt#define YYFINAL 7 274264790Sbapt#ifndef YYDEBUG 275264790Sbapt#define YYDEBUG 0 276264790Sbapt#endif 277264790Sbapt#define YYMAXTOKEN 260 278264790Sbapt#define YYUNDFTOKEN 266 279264790Sbapt#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a)) 280264790Sbapt#if YYDEBUG 281264790Sbaptstatic const char *const calc1_name[] = { 282264790Sbapt 283264790Sbapt"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, 284264790Sbapt0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0, 285264790Sbapt0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 286264790Sbapt0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 287264790Sbapt0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 288264790Sbapt0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 289264790Sbapt0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 290264790Sbapt0,0,"DREG","VREG","CONST","UMINUS",0,0,0,0,0,"illegal-symbol", 291264790Sbapt}; 292264790Sbaptstatic const char *const calc1_rule[] = { 293264790Sbapt"$accept : line", 294264790Sbapt"lines :", 295264790Sbapt"lines : lines line", 296264790Sbapt"line : dexp '\\n'", 297264790Sbapt"line : vexp '\\n'", 298264790Sbapt"line : DREG '=' dexp '\\n'", 299264790Sbapt"line : VREG '=' vexp '\\n'", 300264790Sbapt"line : error '\\n'", 301264790Sbapt"dexp : CONST", 302264790Sbapt"dexp : DREG", 303264790Sbapt"dexp : dexp '+' dexp", 304264790Sbapt"dexp : dexp '-' dexp", 305264790Sbapt"dexp : dexp '*' dexp", 306264790Sbapt"dexp : dexp '/' dexp", 307264790Sbapt"dexp : '-' dexp", 308264790Sbapt"dexp : '(' dexp ')'", 309264790Sbapt"vexp : dexp", 310264790Sbapt"vexp : '(' dexp ',' dexp ')'", 311264790Sbapt"vexp : VREG", 312264790Sbapt"vexp : vexp '+' vexp", 313264790Sbapt"vexp : dexp '+' vexp", 314264790Sbapt"vexp : vexp '-' vexp", 315264790Sbapt"vexp : dexp '-' vexp", 316264790Sbapt"vexp : vexp '*' vexp", 317264790Sbapt"vexp : dexp '*' vexp", 318264790Sbapt"vexp : vexp '/' vexp", 319264790Sbapt"vexp : dexp '/' vexp", 320264790Sbapt"vexp : '-' vexp", 321264790Sbapt"vexp : '(' vexp ')'", 322264790Sbapt 323264790Sbapt}; 324264790Sbapt#endif 325264790Sbapt 326264790Sbaptint yydebug; 327264790Sbaptint yynerrs; 328264790Sbapt 329264790Sbaptint yyerrflag; 330264790Sbaptint yychar; 331264790SbaptYYSTYPE yyval; 332264790SbaptYYSTYPE yylval; 333264790Sbapt 334264790Sbapt/* define the initial stack-sizes */ 335264790Sbapt#ifdef YYSTACKSIZE 336264790Sbapt#undef YYMAXDEPTH 337264790Sbapt#define YYMAXDEPTH YYSTACKSIZE 338264790Sbapt#else 339264790Sbapt#ifdef YYMAXDEPTH 340264790Sbapt#define YYSTACKSIZE YYMAXDEPTH 341264790Sbapt#else 342264790Sbapt#define YYSTACKSIZE 10000 343264790Sbapt#define YYMAXDEPTH 10000 344264790Sbapt#endif 345264790Sbapt#endif 346264790Sbapt 347264790Sbapt#define YYINITSTACKSIZE 200 348264790Sbapt 349264790Sbapttypedef struct { 350264790Sbapt unsigned stacksize; 351264790Sbapt YYINT *s_base; 352264790Sbapt YYINT *s_mark; 353264790Sbapt YYINT *s_last; 354264790Sbapt YYSTYPE *l_base; 355264790Sbapt YYSTYPE *l_mark; 356264790Sbapt} YYSTACKDATA; 357264790Sbapt/* variables for the parser stack */ 358264790Sbaptstatic YYSTACKDATA yystack; 359264790Sbapt#line 176 "calc1.y" 360264790Sbapt /* beginning of subroutines section */ 361264790Sbapt 362264790Sbapt#define BSZ 50 /* buffer size for floating point numbers */ 363264790Sbapt 364264790Sbapt /* lexical analysis */ 365264790Sbapt 366264790Sbaptstatic void 367264790Sbaptyyerror(const char *s) 368264790Sbapt{ 369264790Sbapt fprintf(stderr, "%s\n", s); 370264790Sbapt} 371264790Sbapt 372264790Sbaptint 373264790Sbaptyylex(void) 374264790Sbapt{ 375264790Sbapt int c; 376264790Sbapt 377264790Sbapt while ((c = getchar()) == ' ') 378264790Sbapt { /* skip over blanks */ 379264790Sbapt } 380264790Sbapt 381264790Sbapt if (isupper(c)) 382264790Sbapt { 383264790Sbapt yylval.ival = c - 'A'; 384264790Sbapt return (VREG); 385264790Sbapt } 386264790Sbapt if (islower(c)) 387264790Sbapt { 388264790Sbapt yylval.ival = c - 'a'; 389264790Sbapt return (DREG); 390264790Sbapt } 391264790Sbapt 392264790Sbapt if (isdigit(c) || c == '.') 393264790Sbapt { 394264790Sbapt /* gobble up digits, points, exponents */ 395264790Sbapt char buf[BSZ + 1], *cp = buf; 396264790Sbapt int dot = 0, expr = 0; 397264790Sbapt 398264790Sbapt for (; (cp - buf) < BSZ; ++cp, c = getchar()) 399264790Sbapt { 400264790Sbapt 401264790Sbapt *cp = (char) c; 402264790Sbapt if (isdigit(c)) 403264790Sbapt continue; 404264790Sbapt if (c == '.') 405264790Sbapt { 406264790Sbapt if (dot++ || expr) 407264790Sbapt return ('.'); /* will cause syntax error */ 408264790Sbapt continue; 409264790Sbapt } 410264790Sbapt 411264790Sbapt if (c == 'e') 412264790Sbapt { 413264790Sbapt if (expr++) 414264790Sbapt return ('e'); /* will cause syntax error */ 415264790Sbapt continue; 416264790Sbapt } 417264790Sbapt 418264790Sbapt /* end of number */ 419264790Sbapt break; 420264790Sbapt } 421264790Sbapt *cp = '\0'; 422264790Sbapt 423264790Sbapt if ((cp - buf) >= BSZ) 424264790Sbapt printf("constant too long: truncated\n"); 425264790Sbapt else 426264790Sbapt ungetc(c, stdin); /* push back last char read */ 427264790Sbapt yylval.dval = atof(buf); 428264790Sbapt return (CONST); 429264790Sbapt } 430264790Sbapt return (c); 431264790Sbapt} 432264790Sbapt 433264790Sbaptstatic INTERVAL 434264790Sbapthilo(double a, double b, double c, double d) 435264790Sbapt{ 436264790Sbapt /* returns the smallest interval containing a, b, c, and d */ 437264790Sbapt /* used by *, / routines */ 438264790Sbapt INTERVAL v; 439264790Sbapt 440264790Sbapt if (a > b) 441264790Sbapt { 442264790Sbapt v.hi = a; 443264790Sbapt v.lo = b; 444264790Sbapt } 445264790Sbapt else 446264790Sbapt { 447264790Sbapt v.hi = b; 448264790Sbapt v.lo = a; 449264790Sbapt } 450264790Sbapt 451264790Sbapt if (c > d) 452264790Sbapt { 453264790Sbapt if (c > v.hi) 454264790Sbapt v.hi = c; 455264790Sbapt if (d < v.lo) 456264790Sbapt v.lo = d; 457264790Sbapt } 458264790Sbapt else 459264790Sbapt { 460264790Sbapt if (d > v.hi) 461264790Sbapt v.hi = d; 462264790Sbapt if (c < v.lo) 463264790Sbapt v.lo = c; 464264790Sbapt } 465264790Sbapt return (v); 466264790Sbapt} 467264790Sbapt 468264790SbaptINTERVAL 469264790Sbaptvmul(double a, double b, INTERVAL v) 470264790Sbapt{ 471264790Sbapt return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo)); 472264790Sbapt} 473264790Sbapt 474264790Sbaptint 475264790Sbaptdcheck(INTERVAL v) 476264790Sbapt{ 477264790Sbapt if (v.hi >= 0. && v.lo <= 0.) 478264790Sbapt { 479264790Sbapt printf("divisor interval contains 0.\n"); 480264790Sbapt return (1); 481264790Sbapt } 482264790Sbapt return (0); 483264790Sbapt} 484264790Sbapt 485264790SbaptINTERVAL 486264790Sbaptvdiv(double a, double b, INTERVAL v) 487264790Sbapt{ 488264790Sbapt return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo)); 489264790Sbapt} 490264790Sbapt#line 491 "calc1.tab.c" 491264790Sbapt 492264790Sbapt#if YYDEBUG 493264790Sbapt#include <stdio.h> /* needed for printf */ 494264790Sbapt#endif 495264790Sbapt 496264790Sbapt#include <stdlib.h> /* needed for malloc, etc */ 497264790Sbapt#include <string.h> /* needed for memset */ 498264790Sbapt 499264790Sbapt/* allocate initial stack or double stack size, up to YYMAXDEPTH */ 500264790Sbaptstatic int yygrowstack(YYSTACKDATA *data) 501264790Sbapt{ 502264790Sbapt int i; 503264790Sbapt unsigned newsize; 504264790Sbapt YYINT *newss; 505264790Sbapt YYSTYPE *newvs; 506264790Sbapt 507264790Sbapt if ((newsize = data->stacksize) == 0) 508264790Sbapt newsize = YYINITSTACKSIZE; 509264790Sbapt else if (newsize >= YYMAXDEPTH) 510264790Sbapt return YYENOMEM; 511264790Sbapt else if ((newsize *= 2) > YYMAXDEPTH) 512264790Sbapt newsize = YYMAXDEPTH; 513264790Sbapt 514264790Sbapt i = (int) (data->s_mark - data->s_base); 515264790Sbapt newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); 516264790Sbapt if (newss == 0) 517264790Sbapt return YYENOMEM; 518264790Sbapt 519264790Sbapt data->s_base = newss; 520264790Sbapt data->s_mark = newss + i; 521264790Sbapt 522264790Sbapt newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); 523264790Sbapt if (newvs == 0) 524264790Sbapt return YYENOMEM; 525264790Sbapt 526264790Sbapt data->l_base = newvs; 527264790Sbapt data->l_mark = newvs + i; 528264790Sbapt 529264790Sbapt data->stacksize = newsize; 530264790Sbapt data->s_last = data->s_base + newsize - 1; 531264790Sbapt return 0; 532264790Sbapt} 533264790Sbapt 534264790Sbapt#if YYPURE || defined(YY_NO_LEAKS) 535264790Sbaptstatic void yyfreestack(YYSTACKDATA *data) 536264790Sbapt{ 537264790Sbapt free(data->s_base); 538264790Sbapt free(data->l_base); 539264790Sbapt memset(data, 0, sizeof(*data)); 540264790Sbapt} 541264790Sbapt#else 542264790Sbapt#define yyfreestack(data) /* nothing */ 543264790Sbapt#endif 544264790Sbapt 545264790Sbapt#define YYABORT goto yyabort 546264790Sbapt#define YYREJECT goto yyabort 547264790Sbapt#define YYACCEPT goto yyaccept 548264790Sbapt#define YYERROR goto yyerrlab 549264790Sbapt 550264790Sbaptint 551264790SbaptYYPARSE_DECL() 552264790Sbapt{ 553264790Sbapt int yym, yyn, yystate; 554264790Sbapt#if YYDEBUG 555264790Sbapt const char *yys; 556264790Sbapt 557264790Sbapt if ((yys = getenv("YYDEBUG")) != 0) 558264790Sbapt { 559264790Sbapt yyn = *yys; 560264790Sbapt if (yyn >= '0' && yyn <= '9') 561264790Sbapt yydebug = yyn - '0'; 562264790Sbapt } 563264790Sbapt#endif 564264790Sbapt 565264790Sbapt yynerrs = 0; 566264790Sbapt yyerrflag = 0; 567264790Sbapt yychar = YYEMPTY; 568264790Sbapt yystate = 0; 569264790Sbapt 570264790Sbapt#if YYPURE 571264790Sbapt memset(&yystack, 0, sizeof(yystack)); 572264790Sbapt#endif 573264790Sbapt 574264790Sbapt if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 575264790Sbapt yystack.s_mark = yystack.s_base; 576264790Sbapt yystack.l_mark = yystack.l_base; 577264790Sbapt yystate = 0; 578264790Sbapt *yystack.s_mark = 0; 579264790Sbapt 580264790Sbaptyyloop: 581264790Sbapt if ((yyn = yydefred[yystate]) != 0) goto yyreduce; 582264790Sbapt if (yychar < 0) 583264790Sbapt { 584264790Sbapt if ((yychar = YYLEX) < 0) yychar = YYEOF; 585264790Sbapt#if YYDEBUG 586264790Sbapt if (yydebug) 587264790Sbapt { 588264790Sbapt yys = yyname[YYTRANSLATE(yychar)]; 589264790Sbapt printf("%sdebug: state %d, reading %d (%s)\n", 590264790Sbapt YYPREFIX, yystate, yychar, yys); 591264790Sbapt } 592264790Sbapt#endif 593264790Sbapt } 594264790Sbapt if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && 595264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == yychar) 596264790Sbapt { 597264790Sbapt#if YYDEBUG 598264790Sbapt if (yydebug) 599264790Sbapt printf("%sdebug: state %d, shifting to state %d\n", 600264790Sbapt YYPREFIX, yystate, yytable[yyn]); 601264790Sbapt#endif 602264790Sbapt if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) 603264790Sbapt { 604264790Sbapt goto yyoverflow; 605264790Sbapt } 606264790Sbapt yystate = yytable[yyn]; 607264790Sbapt *++yystack.s_mark = yytable[yyn]; 608264790Sbapt *++yystack.l_mark = yylval; 609264790Sbapt yychar = YYEMPTY; 610264790Sbapt if (yyerrflag > 0) --yyerrflag; 611264790Sbapt goto yyloop; 612264790Sbapt } 613264790Sbapt if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && 614264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == yychar) 615264790Sbapt { 616264790Sbapt yyn = yytable[yyn]; 617264790Sbapt goto yyreduce; 618264790Sbapt } 619264790Sbapt if (yyerrflag) goto yyinrecovery; 620264790Sbapt 621264790Sbapt YYERROR_CALL("syntax error"); 622264790Sbapt 623264790Sbapt goto yyerrlab; 624264790Sbapt 625264790Sbaptyyerrlab: 626264790Sbapt ++yynerrs; 627264790Sbapt 628264790Sbaptyyinrecovery: 629264790Sbapt if (yyerrflag < 3) 630264790Sbapt { 631264790Sbapt yyerrflag = 3; 632264790Sbapt for (;;) 633264790Sbapt { 634264790Sbapt if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && 635264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) 636264790Sbapt { 637264790Sbapt#if YYDEBUG 638264790Sbapt if (yydebug) 639264790Sbapt printf("%sdebug: state %d, error recovery shifting\ 640264790Sbapt to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); 641264790Sbapt#endif 642264790Sbapt if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) 643264790Sbapt { 644264790Sbapt goto yyoverflow; 645264790Sbapt } 646264790Sbapt yystate = yytable[yyn]; 647264790Sbapt *++yystack.s_mark = yytable[yyn]; 648264790Sbapt *++yystack.l_mark = yylval; 649264790Sbapt goto yyloop; 650264790Sbapt } 651264790Sbapt else 652264790Sbapt { 653264790Sbapt#if YYDEBUG 654264790Sbapt if (yydebug) 655264790Sbapt printf("%sdebug: error recovery discarding state %d\n", 656264790Sbapt YYPREFIX, *yystack.s_mark); 657264790Sbapt#endif 658264790Sbapt if (yystack.s_mark <= yystack.s_base) goto yyabort; 659264790Sbapt --yystack.s_mark; 660264790Sbapt --yystack.l_mark; 661264790Sbapt } 662264790Sbapt } 663264790Sbapt } 664264790Sbapt else 665264790Sbapt { 666264790Sbapt if (yychar == YYEOF) goto yyabort; 667264790Sbapt#if YYDEBUG 668264790Sbapt if (yydebug) 669264790Sbapt { 670264790Sbapt yys = yyname[YYTRANSLATE(yychar)]; 671264790Sbapt printf("%sdebug: state %d, error recovery discards token %d (%s)\n", 672264790Sbapt YYPREFIX, yystate, yychar, yys); 673264790Sbapt } 674264790Sbapt#endif 675264790Sbapt yychar = YYEMPTY; 676264790Sbapt goto yyloop; 677264790Sbapt } 678264790Sbapt 679264790Sbaptyyreduce: 680264790Sbapt#if YYDEBUG 681264790Sbapt if (yydebug) 682264790Sbapt printf("%sdebug: state %d, reducing by rule %d (%s)\n", 683264790Sbapt YYPREFIX, yystate, yyn, yyrule[yyn]); 684264790Sbapt#endif 685264790Sbapt yym = yylen[yyn]; 686264790Sbapt if (yym) 687264790Sbapt yyval = yystack.l_mark[1-yym]; 688264790Sbapt else 689264790Sbapt memset(&yyval, 0, sizeof yyval); 690264790Sbapt switch (yyn) 691264790Sbapt { 692264790Sbaptcase 3: 693264790Sbapt#line 57 "calc1.y" 694264790Sbapt { 695264790Sbapt (void) printf("%15.8f\n", yystack.l_mark[-1].dval); 696264790Sbapt } 697264790Sbaptbreak; 698264790Sbaptcase 4: 699264790Sbapt#line 61 "calc1.y" 700264790Sbapt { 701264790Sbapt (void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi); 702264790Sbapt } 703264790Sbaptbreak; 704264790Sbaptcase 5: 705264790Sbapt#line 65 "calc1.y" 706264790Sbapt { 707264790Sbapt dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval; 708264790Sbapt } 709264790Sbaptbreak; 710264790Sbaptcase 6: 711264790Sbapt#line 69 "calc1.y" 712264790Sbapt { 713264790Sbapt vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval; 714264790Sbapt } 715264790Sbaptbreak; 716264790Sbaptcase 7: 717264790Sbapt#line 73 "calc1.y" 718264790Sbapt { 719264790Sbapt yyerrok; 720264790Sbapt } 721264790Sbaptbreak; 722264790Sbaptcase 9: 723264790Sbapt#line 80 "calc1.y" 724264790Sbapt { 725264790Sbapt yyval.dval = dreg[yystack.l_mark[0].ival]; 726264790Sbapt } 727264790Sbaptbreak; 728264790Sbaptcase 10: 729264790Sbapt#line 84 "calc1.y" 730264790Sbapt { 731264790Sbapt yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval; 732264790Sbapt } 733264790Sbaptbreak; 734264790Sbaptcase 11: 735264790Sbapt#line 88 "calc1.y" 736264790Sbapt { 737264790Sbapt yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval; 738264790Sbapt } 739264790Sbaptbreak; 740264790Sbaptcase 12: 741264790Sbapt#line 92 "calc1.y" 742264790Sbapt { 743264790Sbapt yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval; 744264790Sbapt } 745264790Sbaptbreak; 746264790Sbaptcase 13: 747264790Sbapt#line 96 "calc1.y" 748264790Sbapt { 749264790Sbapt yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval; 750264790Sbapt } 751264790Sbaptbreak; 752264790Sbaptcase 14: 753264790Sbapt#line 100 "calc1.y" 754264790Sbapt { 755264790Sbapt yyval.dval = -yystack.l_mark[0].dval; 756264790Sbapt } 757264790Sbaptbreak; 758264790Sbaptcase 15: 759264790Sbapt#line 104 "calc1.y" 760264790Sbapt { 761264790Sbapt yyval.dval = yystack.l_mark[-1].dval; 762264790Sbapt } 763264790Sbaptbreak; 764264790Sbaptcase 16: 765264790Sbapt#line 110 "calc1.y" 766264790Sbapt { 767264790Sbapt yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval; 768264790Sbapt } 769264790Sbaptbreak; 770264790Sbaptcase 17: 771264790Sbapt#line 114 "calc1.y" 772264790Sbapt { 773264790Sbapt yyval.vval.lo = yystack.l_mark[-3].dval; 774264790Sbapt yyval.vval.hi = yystack.l_mark[-1].dval; 775264790Sbapt if ( yyval.vval.lo > yyval.vval.hi ) 776264790Sbapt { 777264790Sbapt (void) printf("interval out of order\n"); 778264790Sbapt YYERROR; 779264790Sbapt } 780264790Sbapt } 781264790Sbaptbreak; 782264790Sbaptcase 18: 783264790Sbapt#line 124 "calc1.y" 784264790Sbapt { 785264790Sbapt yyval.vval = vreg[yystack.l_mark[0].ival]; 786264790Sbapt } 787264790Sbaptbreak; 788264790Sbaptcase 19: 789264790Sbapt#line 128 "calc1.y" 790264790Sbapt { 791264790Sbapt yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi; 792264790Sbapt yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo; 793264790Sbapt } 794264790Sbaptbreak; 795264790Sbaptcase 20: 796264790Sbapt#line 133 "calc1.y" 797264790Sbapt { 798264790Sbapt yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi; 799264790Sbapt yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo; 800264790Sbapt } 801264790Sbaptbreak; 802264790Sbaptcase 21: 803264790Sbapt#line 138 "calc1.y" 804264790Sbapt { 805264790Sbapt yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo; 806264790Sbapt yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi; 807264790Sbapt } 808264790Sbaptbreak; 809264790Sbaptcase 22: 810264790Sbapt#line 143 "calc1.y" 811264790Sbapt { 812264790Sbapt yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo; 813264790Sbapt yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi; 814264790Sbapt } 815264790Sbaptbreak; 816264790Sbaptcase 23: 817264790Sbapt#line 148 "calc1.y" 818264790Sbapt { 819264790Sbapt yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); 820264790Sbapt } 821264790Sbaptbreak; 822264790Sbaptcase 24: 823264790Sbapt#line 152 "calc1.y" 824264790Sbapt { 825264790Sbapt yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); 826264790Sbapt } 827264790Sbaptbreak; 828264790Sbaptcase 25: 829264790Sbapt#line 156 "calc1.y" 830264790Sbapt { 831264790Sbapt if (dcheck(yystack.l_mark[0].vval)) YYERROR; 832264790Sbapt yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval ); 833264790Sbapt } 834264790Sbaptbreak; 835264790Sbaptcase 26: 836264790Sbapt#line 161 "calc1.y" 837264790Sbapt { 838264790Sbapt if (dcheck ( yystack.l_mark[0].vval )) YYERROR; 839264790Sbapt yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval ); 840264790Sbapt } 841264790Sbaptbreak; 842264790Sbaptcase 27: 843264790Sbapt#line 166 "calc1.y" 844264790Sbapt { 845264790Sbapt yyval.vval.hi = -yystack.l_mark[0].vval.lo; 846264790Sbapt yyval.vval.lo = -yystack.l_mark[0].vval.hi; 847264790Sbapt } 848264790Sbaptbreak; 849264790Sbaptcase 28: 850264790Sbapt#line 171 "calc1.y" 851264790Sbapt { 852264790Sbapt yyval.vval = yystack.l_mark[-1].vval; 853264790Sbapt } 854264790Sbaptbreak; 855264790Sbapt#line 856 "calc1.tab.c" 856264790Sbapt } 857264790Sbapt yystack.s_mark -= yym; 858264790Sbapt yystate = *yystack.s_mark; 859264790Sbapt yystack.l_mark -= yym; 860264790Sbapt yym = yylhs[yyn]; 861264790Sbapt if (yystate == 0 && yym == 0) 862264790Sbapt { 863264790Sbapt#if YYDEBUG 864264790Sbapt if (yydebug) 865264790Sbapt printf("%sdebug: after reduction, shifting from state 0 to\ 866264790Sbapt state %d\n", YYPREFIX, YYFINAL); 867264790Sbapt#endif 868264790Sbapt yystate = YYFINAL; 869264790Sbapt *++yystack.s_mark = YYFINAL; 870264790Sbapt *++yystack.l_mark = yyval; 871264790Sbapt if (yychar < 0) 872264790Sbapt { 873264790Sbapt if ((yychar = YYLEX) < 0) yychar = YYEOF; 874264790Sbapt#if YYDEBUG 875264790Sbapt if (yydebug) 876264790Sbapt { 877264790Sbapt yys = yyname[YYTRANSLATE(yychar)]; 878264790Sbapt printf("%sdebug: state %d, reading %d (%s)\n", 879264790Sbapt YYPREFIX, YYFINAL, yychar, yys); 880264790Sbapt } 881264790Sbapt#endif 882264790Sbapt } 883264790Sbapt if (yychar == YYEOF) goto yyaccept; 884264790Sbapt goto yyloop; 885264790Sbapt } 886264790Sbapt if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && 887264790Sbapt yyn <= YYTABLESIZE && yycheck[yyn] == yystate) 888264790Sbapt yystate = yytable[yyn]; 889264790Sbapt else 890264790Sbapt yystate = yydgoto[yym]; 891264790Sbapt#if YYDEBUG 892264790Sbapt if (yydebug) 893264790Sbapt printf("%sdebug: after reduction, shifting from state %d \ 894264790Sbaptto state %d\n", YYPREFIX, *yystack.s_mark, yystate); 895264790Sbapt#endif 896264790Sbapt if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) 897264790Sbapt { 898264790Sbapt goto yyoverflow; 899264790Sbapt } 900264790Sbapt *++yystack.s_mark = (YYINT) yystate; 901264790Sbapt *++yystack.l_mark = yyval; 902264790Sbapt goto yyloop; 903264790Sbapt 904264790Sbaptyyoverflow: 905264790Sbapt YYERROR_CALL("yacc stack overflow"); 906264790Sbapt 907264790Sbaptyyabort: 908264790Sbapt yyfreestack(&yystack); 909264790Sbapt return (1); 910264790Sbapt 911264790Sbaptyyaccept: 912264790Sbapt yyfreestack(&yystack); 913264790Sbapt return (0); 914264790Sbapt} 915