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