3a92d97ff0
I'm starting with the easy cases. The leftovers need to be looked at a bit more closely. Note that this change _does_ modify the code of the old tests. This is required in order to allow the code to locate the data files in the source directory instead of the current directory, because Kyua automatically changes the latter to a temporary directory. Also note that at least one test is known to be broken here. Actually, the test is not really broken: it's marked as a TODO but unfortunately Kyua's TAP parser currently does not understand that. Will have to be fixed separately.
832 lines
20 KiB
Plaintext
832 lines
20 KiB
Plaintext
#ifndef lint
|
|
static const char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
|
|
#endif
|
|
|
|
#define YYBYACC 1
|
|
#define YYMAJOR 1
|
|
#define YYMINOR 9
|
|
#define YYPATCH 20140101
|
|
|
|
#define YYEMPTY (-1)
|
|
#define yyclearin (yychar = YYEMPTY)
|
|
#define yyerrok (yyerrflag = 0)
|
|
#define YYRECOVERING() (yyerrflag != 0)
|
|
|
|
#define YYPREFIX "yy"
|
|
|
|
#define YYPURE 0
|
|
|
|
#line 2 "calc1.y"
|
|
|
|
/* http://dinosaur.compilertools.net/yacc/index.html */
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
|
|
typedef struct interval
|
|
{
|
|
double lo, hi;
|
|
}
|
|
INTERVAL;
|
|
|
|
INTERVAL vmul(double, double, INTERVAL);
|
|
INTERVAL vdiv(double, double, INTERVAL);
|
|
|
|
extern int yylex(void);
|
|
static void yyerror(const char *s);
|
|
|
|
int dcheck(INTERVAL);
|
|
|
|
double dreg[26];
|
|
INTERVAL vreg[26];
|
|
|
|
#line 31 "calc1.y"
|
|
#ifdef YYSTYPE
|
|
#undef YYSTYPE_IS_DECLARED
|
|
#define YYSTYPE_IS_DECLARED 1
|
|
#endif
|
|
#ifndef YYSTYPE_IS_DECLARED
|
|
#define YYSTYPE_IS_DECLARED 1
|
|
typedef union
|
|
{
|
|
int ival;
|
|
double dval;
|
|
INTERVAL vval;
|
|
} YYSTYPE;
|
|
#endif /* !YYSTYPE_IS_DECLARED */
|
|
#line 59 "/dev/stdout"
|
|
|
|
/* compatibility with bison */
|
|
#ifdef YYPARSE_PARAM
|
|
/* compatibility with FreeBSD */
|
|
# ifdef YYPARSE_PARAM_TYPE
|
|
# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM)
|
|
# else
|
|
# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM)
|
|
# endif
|
|
#else
|
|
# define YYPARSE_DECL() yyparse(void)
|
|
#endif
|
|
|
|
/* Parameters sent to lex. */
|
|
#ifdef YYLEX_PARAM
|
|
# define YYLEX_DECL() yylex(void *YYLEX_PARAM)
|
|
# define YYLEX yylex(YYLEX_PARAM)
|
|
#else
|
|
# define YYLEX_DECL() yylex(void)
|
|
# define YYLEX yylex()
|
|
#endif
|
|
|
|
/* Parameters sent to yyerror. */
|
|
#ifndef YYERROR_DECL
|
|
#define YYERROR_DECL() yyerror(const char *s)
|
|
#endif
|
|
#ifndef YYERROR_CALL
|
|
#define YYERROR_CALL(msg) yyerror(msg)
|
|
#endif
|
|
|
|
extern int YYPARSE_DECL();
|
|
|
|
#define DREG 257
|
|
#define VREG 258
|
|
#define CONST 259
|
|
#define UMINUS 260
|
|
#define YYERRCODE 256
|
|
static const short yylhs[] = { -1,
|
|
3, 3, 0, 0, 0, 0, 0, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
|
|
2, 2, 2, 2, 2, 2, 2, 2,
|
|
};
|
|
static const short yylen[] = { 2,
|
|
0, 2, 2, 2, 4, 4, 2, 1, 1, 3,
|
|
3, 3, 3, 2, 3, 1, 5, 1, 3, 3,
|
|
3, 3, 3, 3, 3, 3, 2, 3,
|
|
};
|
|
static const short yydefred[] = { 0,
|
|
0, 0, 0, 8, 0, 0, 0, 0, 0, 7,
|
|
0, 0, 9, 18, 14, 27, 0, 0, 0, 0,
|
|
0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
|
|
0, 0, 0, 15, 0, 28, 0, 0, 0, 0,
|
|
12, 24, 13, 26, 0, 0, 23, 25, 14, 0,
|
|
0, 0, 0, 0, 5, 6, 0, 0, 0, 12,
|
|
13, 17,
|
|
};
|
|
static const short yydgoto[] = { 7,
|
|
32, 9, 0,
|
|
};
|
|
static const short yysindex[] = { -40,
|
|
-8, -48, -47, 0, -37, -37, 0, 2, 17, 0,
|
|
-34, -37, 0, 0, 0, 0, -25, 90, -37, -37,
|
|
-37, -37, 0, -37, -37, -37, -37, 0, -34, -34,
|
|
25, 125, 31, 0, -34, 0, -11, 37, -11, 37,
|
|
0, 0, 0, 0, 37, 37, 0, 0, 0, 111,
|
|
-34, -34, -34, -34, 0, 0, 118, 69, 69, 0,
|
|
0, 0,
|
|
};
|
|
static const short yyrindex[] = { 0,
|
|
0, 38, 44, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, -9, 0, 0, 0, 0, 51, -3, 56, 61,
|
|
0, 0, 0, 0, 67, 72, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 78, 83, 0,
|
|
0, 0,
|
|
};
|
|
static const short yygindex[] = { 0,
|
|
4, 124, 0,
|
|
};
|
|
#define YYTABLESIZE 225
|
|
static const short yytable[] = { 6,
|
|
16, 10, 6, 8, 5, 30, 20, 5, 15, 17,
|
|
29, 23, 11, 12, 31, 34, 21, 19, 35, 20,
|
|
0, 22, 37, 39, 41, 43, 28, 0, 0, 0,
|
|
21, 16, 49, 50, 55, 22, 0, 20, 57, 20,
|
|
56, 20, 0, 21, 19, 0, 20, 9, 22, 0,
|
|
0, 0, 0, 18, 58, 59, 60, 61, 26, 24,
|
|
10, 25, 0, 27, 0, 11, 53, 51, 0, 52,
|
|
22, 54, 26, 24, 0, 25, 19, 27, 26, 9,
|
|
9, 21, 9, 27, 9, 18, 18, 10, 18, 0,
|
|
18, 10, 11, 10, 10, 10, 11, 0, 11, 11,
|
|
11, 22, 0, 22, 0, 22, 0, 19, 0, 19,
|
|
53, 19, 21, 0, 21, 54, 21, 0, 10, 0,
|
|
10, 0, 10, 11, 0, 11, 0, 11, 16, 18,
|
|
36, 26, 24, 0, 25, 33, 27, 0, 0, 0,
|
|
0, 0, 38, 40, 42, 44, 0, 45, 46, 47,
|
|
48, 34, 53, 51, 0, 52, 0, 54, 62, 53,
|
|
51, 0, 52, 0, 54, 0, 21, 19, 0, 20,
|
|
0, 22, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 1, 2, 3, 4, 13,
|
|
14, 4, 13, 0, 4,
|
|
};
|
|
static const short yycheck[] = { 40,
|
|
10, 10, 40, 0, 45, 40, 10, 45, 5, 6,
|
|
45, 10, 61, 61, 11, 41, 42, 43, 44, 45,
|
|
-1, 47, 19, 20, 21, 22, 10, -1, -1, -1,
|
|
42, 41, 29, 30, 10, 47, -1, 41, 35, 43,
|
|
10, 45, -1, 42, 43, -1, 45, 10, 47, -1,
|
|
-1, -1, -1, 10, 51, 52, 53, 54, 42, 43,
|
|
10, 45, -1, 47, -1, 10, 42, 43, -1, 45,
|
|
10, 47, 42, 43, -1, 45, 10, 47, 42, 42,
|
|
43, 10, 45, 47, 47, 42, 43, 10, 45, -1,
|
|
47, 41, 10, 43, 44, 45, 41, -1, 43, 44,
|
|
45, 41, -1, 43, -1, 45, -1, 41, -1, 43,
|
|
42, 45, 41, -1, 43, 47, 45, -1, 41, -1,
|
|
43, -1, 45, 41, -1, 43, -1, 45, 5, 6,
|
|
41, 42, 43, -1, 45, 12, 47, -1, -1, -1,
|
|
-1, -1, 19, 20, 21, 22, -1, 24, 25, 26,
|
|
27, 41, 42, 43, -1, 45, -1, 47, 41, 42,
|
|
43, -1, 45, -1, 47, -1, 42, 43, -1, 45,
|
|
-1, 47, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
-1, -1, -1, -1, -1, 256, 257, 258, 259, 257,
|
|
258, 259, 257, -1, 259,
|
|
};
|
|
#define YYFINAL 7
|
|
#ifndef YYDEBUG
|
|
#define YYDEBUG 0
|
|
#endif
|
|
#define YYMAXTOKEN 260
|
|
#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? (YYMAXTOKEN + 1) : (a))
|
|
#if YYDEBUG
|
|
static const char *yyname[] = {
|
|
|
|
"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,
|
|
0,0,0,0,0,0,0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,"DREG","VREG","CONST","UMINUS","illegal-symbol",
|
|
};
|
|
static const char *yyrule[] = {
|
|
"$accept : line",
|
|
"lines :",
|
|
"lines : lines line",
|
|
"line : dexp '\\n'",
|
|
"line : vexp '\\n'",
|
|
"line : DREG '=' dexp '\\n'",
|
|
"line : VREG '=' vexp '\\n'",
|
|
"line : error '\\n'",
|
|
"dexp : CONST",
|
|
"dexp : DREG",
|
|
"dexp : dexp '+' dexp",
|
|
"dexp : dexp '-' dexp",
|
|
"dexp : dexp '*' dexp",
|
|
"dexp : dexp '/' dexp",
|
|
"dexp : '-' dexp",
|
|
"dexp : '(' dexp ')'",
|
|
"vexp : dexp",
|
|
"vexp : '(' dexp ',' dexp ')'",
|
|
"vexp : VREG",
|
|
"vexp : vexp '+' vexp",
|
|
"vexp : dexp '+' vexp",
|
|
"vexp : vexp '-' vexp",
|
|
"vexp : dexp '-' vexp",
|
|
"vexp : vexp '*' vexp",
|
|
"vexp : dexp '*' vexp",
|
|
"vexp : vexp '/' vexp",
|
|
"vexp : dexp '/' vexp",
|
|
"vexp : '-' vexp",
|
|
"vexp : '(' vexp ')'",
|
|
|
|
};
|
|
#endif
|
|
|
|
int yydebug;
|
|
int yynerrs;
|
|
|
|
int yyerrflag;
|
|
int yychar;
|
|
YYSTYPE yyval;
|
|
YYSTYPE yylval;
|
|
|
|
/* define the initial stack-sizes */
|
|
#ifdef YYSTACKSIZE
|
|
#undef YYMAXDEPTH
|
|
#define YYMAXDEPTH YYSTACKSIZE
|
|
#else
|
|
#ifdef YYMAXDEPTH
|
|
#define YYSTACKSIZE YYMAXDEPTH
|
|
#else
|
|
#define YYSTACKSIZE 10000
|
|
#define YYMAXDEPTH 10000
|
|
#endif
|
|
#endif
|
|
|
|
#define YYINITSTACKSIZE 200
|
|
|
|
typedef struct {
|
|
unsigned stacksize;
|
|
short *s_base;
|
|
short *s_mark;
|
|
short *s_last;
|
|
YYSTYPE *l_base;
|
|
YYSTYPE *l_mark;
|
|
} YYSTACKDATA;
|
|
/* variables for the parser stack */
|
|
static YYSTACKDATA yystack;
|
|
#line 176 "calc1.y"
|
|
/* beginning of subroutines section */
|
|
|
|
#define BSZ 50 /* buffer size for floating point numbers */
|
|
|
|
/* lexical analysis */
|
|
|
|
static void
|
|
yyerror(const char *s)
|
|
{
|
|
fprintf(stderr, "%s\n", s);
|
|
}
|
|
|
|
int
|
|
yylex(void)
|
|
{
|
|
int c;
|
|
|
|
while ((c = getchar()) == ' ')
|
|
{ /* skip over blanks */
|
|
}
|
|
|
|
if (isupper(c))
|
|
{
|
|
yylval.ival = c - 'A';
|
|
return (VREG);
|
|
}
|
|
if (islower(c))
|
|
{
|
|
yylval.ival = c - 'a';
|
|
return (DREG);
|
|
}
|
|
|
|
if (isdigit(c) || c == '.')
|
|
{
|
|
/* gobble up digits, points, exponents */
|
|
char buf[BSZ + 1], *cp = buf;
|
|
int dot = 0, expr = 0;
|
|
|
|
for (; (cp - buf) < BSZ; ++cp, c = getchar())
|
|
{
|
|
|
|
*cp = c;
|
|
if (isdigit(c))
|
|
continue;
|
|
if (c == '.')
|
|
{
|
|
if (dot++ || expr)
|
|
return ('.'); /* will cause syntax error */
|
|
continue;
|
|
}
|
|
|
|
if (c == 'e')
|
|
{
|
|
if (expr++)
|
|
return ('e'); /* will cause syntax error */
|
|
continue;
|
|
}
|
|
|
|
/* end of number */
|
|
break;
|
|
}
|
|
*cp = '\0';
|
|
|
|
if ((cp - buf) >= BSZ)
|
|
printf("constant too long: truncated\n");
|
|
else
|
|
ungetc(c, stdin); /* push back last char read */
|
|
yylval.dval = atof(buf);
|
|
return (CONST);
|
|
}
|
|
return (c);
|
|
}
|
|
|
|
static INTERVAL
|
|
hilo(double a, double b, double c, double d)
|
|
{
|
|
/* returns the smallest interval containing a, b, c, and d */
|
|
/* used by *, / routines */
|
|
INTERVAL v;
|
|
|
|
if (a > b)
|
|
{
|
|
v.hi = a;
|
|
v.lo = b;
|
|
}
|
|
else
|
|
{
|
|
v.hi = b;
|
|
v.lo = a;
|
|
}
|
|
|
|
if (c > d)
|
|
{
|
|
if (c > v.hi)
|
|
v.hi = c;
|
|
if (d < v.lo)
|
|
v.lo = d;
|
|
}
|
|
else
|
|
{
|
|
if (d > v.hi)
|
|
v.hi = d;
|
|
if (c < v.lo)
|
|
v.lo = c;
|
|
}
|
|
return (v);
|
|
}
|
|
|
|
INTERVAL
|
|
vmul(double a, double b, INTERVAL v)
|
|
{
|
|
return (hilo(a * v.hi, a * v.lo, b * v.hi, b * v.lo));
|
|
}
|
|
|
|
int
|
|
dcheck(INTERVAL v)
|
|
{
|
|
if (v.hi >= 0. && v.lo <= 0.)
|
|
{
|
|
printf("divisor interval contains 0.\n");
|
|
return (1);
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
INTERVAL
|
|
vdiv(double a, double b, INTERVAL v)
|
|
{
|
|
return (hilo(a / v.hi, a / v.lo, b / v.hi, b / v.lo));
|
|
}
|
|
#line 406 "/dev/stdout"
|
|
|
|
#if YYDEBUG
|
|
#include <stdio.h> /* needed for printf */
|
|
#endif
|
|
|
|
#include <stdlib.h> /* needed for malloc, etc */
|
|
#include <string.h> /* needed for memset */
|
|
|
|
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
|
|
static int yygrowstack(YYSTACKDATA *data)
|
|
{
|
|
int i;
|
|
unsigned newsize;
|
|
short *newss;
|
|
YYSTYPE *newvs;
|
|
|
|
if ((newsize = data->stacksize) == 0)
|
|
newsize = YYINITSTACKSIZE;
|
|
else if (newsize >= YYMAXDEPTH)
|
|
return -1;
|
|
else if ((newsize *= 2) > YYMAXDEPTH)
|
|
newsize = YYMAXDEPTH;
|
|
|
|
i = (int) (data->s_mark - data->s_base);
|
|
newss = (short *)realloc(data->s_base, newsize * sizeof(*newss));
|
|
if (newss == 0)
|
|
return -1;
|
|
|
|
data->s_base = newss;
|
|
data->s_mark = newss + i;
|
|
|
|
newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs));
|
|
if (newvs == 0)
|
|
return -1;
|
|
|
|
data->l_base = newvs;
|
|
data->l_mark = newvs + i;
|
|
|
|
data->stacksize = newsize;
|
|
data->s_last = data->s_base + newsize - 1;
|
|
return 0;
|
|
}
|
|
|
|
#if YYPURE || defined(YY_NO_LEAKS)
|
|
static void yyfreestack(YYSTACKDATA *data)
|
|
{
|
|
free(data->s_base);
|
|
free(data->l_base);
|
|
memset(data, 0, sizeof(*data));
|
|
}
|
|
#else
|
|
#define yyfreestack(data) /* nothing */
|
|
#endif
|
|
|
|
#define YYABORT goto yyabort
|
|
#define YYREJECT goto yyabort
|
|
#define YYACCEPT goto yyaccept
|
|
#define YYERROR goto yyerrlab
|
|
|
|
int
|
|
YYPARSE_DECL()
|
|
{
|
|
int yym, yyn, yystate;
|
|
#if YYDEBUG
|
|
const char *yys;
|
|
|
|
if ((yys = getenv("YYDEBUG")) != 0)
|
|
{
|
|
yyn = *yys;
|
|
if (yyn >= '0' && yyn <= '9')
|
|
yydebug = yyn - '0';
|
|
}
|
|
#endif
|
|
|
|
yynerrs = 0;
|
|
yyerrflag = 0;
|
|
yychar = YYEMPTY;
|
|
yystate = 0;
|
|
|
|
#if YYPURE
|
|
memset(&yystack, 0, sizeof(yystack));
|
|
#endif
|
|
|
|
if (yystack.s_base == NULL && yygrowstack(&yystack)) goto yyoverflow;
|
|
yystack.s_mark = yystack.s_base;
|
|
yystack.l_mark = yystack.l_base;
|
|
yystate = 0;
|
|
*yystack.s_mark = 0;
|
|
|
|
yyloop:
|
|
if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
|
|
if (yychar < 0)
|
|
{
|
|
if ((yychar = YYLEX) < 0) yychar = 0;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = yyname[YYTRANSLATE(yychar)];
|
|
printf("%sdebug: state %d, reading %d (%s)\n",
|
|
YYPREFIX, yystate, yychar, yys);
|
|
}
|
|
#endif
|
|
}
|
|
if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, shifting to state %d\n",
|
|
YYPREFIX, yystate, yytable[yyn]);
|
|
#endif
|
|
if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
yystate = yytable[yyn];
|
|
*++yystack.s_mark = yytable[yyn];
|
|
*++yystack.l_mark = yylval;
|
|
yychar = YYEMPTY;
|
|
if (yyerrflag > 0) --yyerrflag;
|
|
goto yyloop;
|
|
}
|
|
if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
|
|
{
|
|
yyn = yytable[yyn];
|
|
goto yyreduce;
|
|
}
|
|
if (yyerrflag) goto yyinrecovery;
|
|
|
|
yyerror("syntax error");
|
|
|
|
goto yyerrlab;
|
|
|
|
yyerrlab:
|
|
++yynerrs;
|
|
|
|
yyinrecovery:
|
|
if (yyerrflag < 3)
|
|
{
|
|
yyerrflag = 3;
|
|
for (;;)
|
|
{
|
|
if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, error recovery shifting\
|
|
to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]);
|
|
#endif
|
|
if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
yystate = yytable[yyn];
|
|
*++yystack.s_mark = yytable[yyn];
|
|
*++yystack.l_mark = yylval;
|
|
goto yyloop;
|
|
}
|
|
else
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: error recovery discarding state %d\n",
|
|
YYPREFIX, *yystack.s_mark);
|
|
#endif
|
|
if (yystack.s_mark <= yystack.s_base) goto yyabort;
|
|
--yystack.s_mark;
|
|
--yystack.l_mark;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (yychar == 0) goto yyabort;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = yyname[YYTRANSLATE(yychar)];
|
|
printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
|
|
YYPREFIX, yystate, yychar, yys);
|
|
}
|
|
#endif
|
|
yychar = YYEMPTY;
|
|
goto yyloop;
|
|
}
|
|
|
|
yyreduce:
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: state %d, reducing by rule %d (%s)\n",
|
|
YYPREFIX, yystate, yyn, yyrule[yyn]);
|
|
#endif
|
|
yym = yylen[yyn];
|
|
if (yym)
|
|
yyval = yystack.l_mark[1-yym];
|
|
else
|
|
memset(&yyval, 0, sizeof yyval);
|
|
switch (yyn)
|
|
{
|
|
case 3:
|
|
#line 57 "calc1.y"
|
|
{
|
|
(void) printf("%15.8f\n", yystack.l_mark[-1].dval);
|
|
}
|
|
break;
|
|
case 4:
|
|
#line 61 "calc1.y"
|
|
{
|
|
(void) printf("(%15.8f, %15.8f)\n", yystack.l_mark[-1].vval.lo, yystack.l_mark[-1].vval.hi);
|
|
}
|
|
break;
|
|
case 5:
|
|
#line 65 "calc1.y"
|
|
{
|
|
dreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].dval;
|
|
}
|
|
break;
|
|
case 6:
|
|
#line 69 "calc1.y"
|
|
{
|
|
vreg[yystack.l_mark[-3].ival] = yystack.l_mark[-1].vval;
|
|
}
|
|
break;
|
|
case 7:
|
|
#line 73 "calc1.y"
|
|
{
|
|
yyerrok;
|
|
}
|
|
break;
|
|
case 9:
|
|
#line 80 "calc1.y"
|
|
{
|
|
yyval.dval = dreg[yystack.l_mark[0].ival];
|
|
}
|
|
break;
|
|
case 10:
|
|
#line 84 "calc1.y"
|
|
{
|
|
yyval.dval = yystack.l_mark[-2].dval + yystack.l_mark[0].dval;
|
|
}
|
|
break;
|
|
case 11:
|
|
#line 88 "calc1.y"
|
|
{
|
|
yyval.dval = yystack.l_mark[-2].dval - yystack.l_mark[0].dval;
|
|
}
|
|
break;
|
|
case 12:
|
|
#line 92 "calc1.y"
|
|
{
|
|
yyval.dval = yystack.l_mark[-2].dval * yystack.l_mark[0].dval;
|
|
}
|
|
break;
|
|
case 13:
|
|
#line 96 "calc1.y"
|
|
{
|
|
yyval.dval = yystack.l_mark[-2].dval / yystack.l_mark[0].dval;
|
|
}
|
|
break;
|
|
case 14:
|
|
#line 100 "calc1.y"
|
|
{
|
|
yyval.dval = -yystack.l_mark[0].dval;
|
|
}
|
|
break;
|
|
case 15:
|
|
#line 104 "calc1.y"
|
|
{
|
|
yyval.dval = yystack.l_mark[-1].dval;
|
|
}
|
|
break;
|
|
case 16:
|
|
#line 110 "calc1.y"
|
|
{
|
|
yyval.vval.hi = yyval.vval.lo = yystack.l_mark[0].dval;
|
|
}
|
|
break;
|
|
case 17:
|
|
#line 114 "calc1.y"
|
|
{
|
|
yyval.vval.lo = yystack.l_mark[-3].dval;
|
|
yyval.vval.hi = yystack.l_mark[-1].dval;
|
|
if ( yyval.vval.lo > yyval.vval.hi )
|
|
{
|
|
(void) printf("interval out of order\n");
|
|
YYERROR;
|
|
}
|
|
}
|
|
break;
|
|
case 18:
|
|
#line 124 "calc1.y"
|
|
{
|
|
yyval.vval = vreg[yystack.l_mark[0].ival];
|
|
}
|
|
break;
|
|
case 19:
|
|
#line 128 "calc1.y"
|
|
{
|
|
yyval.vval.hi = yystack.l_mark[-2].vval.hi + yystack.l_mark[0].vval.hi;
|
|
yyval.vval.lo = yystack.l_mark[-2].vval.lo + yystack.l_mark[0].vval.lo;
|
|
}
|
|
break;
|
|
case 20:
|
|
#line 133 "calc1.y"
|
|
{
|
|
yyval.vval.hi = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.hi;
|
|
yyval.vval.lo = yystack.l_mark[-2].dval + yystack.l_mark[0].vval.lo;
|
|
}
|
|
break;
|
|
case 21:
|
|
#line 138 "calc1.y"
|
|
{
|
|
yyval.vval.hi = yystack.l_mark[-2].vval.hi - yystack.l_mark[0].vval.lo;
|
|
yyval.vval.lo = yystack.l_mark[-2].vval.lo - yystack.l_mark[0].vval.hi;
|
|
}
|
|
break;
|
|
case 22:
|
|
#line 143 "calc1.y"
|
|
{
|
|
yyval.vval.hi = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.lo;
|
|
yyval.vval.lo = yystack.l_mark[-2].dval - yystack.l_mark[0].vval.hi;
|
|
}
|
|
break;
|
|
case 23:
|
|
#line 148 "calc1.y"
|
|
{
|
|
yyval.vval = vmul( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
|
|
}
|
|
break;
|
|
case 24:
|
|
#line 152 "calc1.y"
|
|
{
|
|
yyval.vval = vmul (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
|
|
}
|
|
break;
|
|
case 25:
|
|
#line 156 "calc1.y"
|
|
{
|
|
if (dcheck(yystack.l_mark[0].vval)) YYERROR;
|
|
yyval.vval = vdiv ( yystack.l_mark[-2].vval.lo, yystack.l_mark[-2].vval.hi, yystack.l_mark[0].vval );
|
|
}
|
|
break;
|
|
case 26:
|
|
#line 161 "calc1.y"
|
|
{
|
|
if (dcheck ( yystack.l_mark[0].vval )) YYERROR;
|
|
yyval.vval = vdiv (yystack.l_mark[-2].dval, yystack.l_mark[-2].dval, yystack.l_mark[0].vval );
|
|
}
|
|
break;
|
|
case 27:
|
|
#line 166 "calc1.y"
|
|
{
|
|
yyval.vval.hi = -yystack.l_mark[0].vval.lo;
|
|
yyval.vval.lo = -yystack.l_mark[0].vval.hi;
|
|
}
|
|
break;
|
|
case 28:
|
|
#line 171 "calc1.y"
|
|
{
|
|
yyval.vval = yystack.l_mark[-1].vval;
|
|
}
|
|
break;
|
|
#line 771 "/dev/stdout"
|
|
}
|
|
yystack.s_mark -= yym;
|
|
yystate = *yystack.s_mark;
|
|
yystack.l_mark -= yym;
|
|
yym = yylhs[yyn];
|
|
if (yystate == 0 && yym == 0)
|
|
{
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: after reduction, shifting from state 0 to\
|
|
state %d\n", YYPREFIX, YYFINAL);
|
|
#endif
|
|
yystate = YYFINAL;
|
|
*++yystack.s_mark = YYFINAL;
|
|
*++yystack.l_mark = yyval;
|
|
if (yychar < 0)
|
|
{
|
|
if ((yychar = YYLEX) < 0) yychar = 0;
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
{
|
|
yys = yyname[YYTRANSLATE(yychar)];
|
|
printf("%sdebug: state %d, reading %d (%s)\n",
|
|
YYPREFIX, YYFINAL, yychar, yys);
|
|
}
|
|
#endif
|
|
}
|
|
if (yychar == 0) goto yyaccept;
|
|
goto yyloop;
|
|
}
|
|
if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
|
|
yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
|
|
yystate = yytable[yyn];
|
|
else
|
|
yystate = yydgoto[yym];
|
|
#if YYDEBUG
|
|
if (yydebug)
|
|
printf("%sdebug: after reduction, shifting from state %d \
|
|
to state %d\n", YYPREFIX, *yystack.s_mark, yystate);
|
|
#endif
|
|
if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack))
|
|
{
|
|
goto yyoverflow;
|
|
}
|
|
*++yystack.s_mark = (short) yystate;
|
|
*++yystack.l_mark = yyval;
|
|
goto yyloop;
|
|
|
|
yyoverflow:
|
|
yyerror("yacc stack overflow");
|
|
|
|
yyabort:
|
|
yyfreestack(&yystack);
|
|
return (1);
|
|
|
|
yyaccept:
|
|
yyfreestack(&yystack);
|
|
return (0);
|
|
}
|