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.
600 lines
16 KiB
Plaintext
600 lines
16 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 "pure_calc.y"
|
|
# include <stdio.h>
|
|
# include <ctype.h>
|
|
|
|
int regs[26];
|
|
int base;
|
|
|
|
#ifdef YYBISON
|
|
#define YYSTYPE int
|
|
#define YYLEX_PARAM &yylval
|
|
#define YYLEX_DECL() yylex(YYSTYPE *yylval)
|
|
#define YYERROR_DECL() yyerror(const char *s)
|
|
int YYLEX_DECL();
|
|
static void YYERROR_DECL();
|
|
#endif
|
|
|
|
#line 35 "/dev/stdout"
|
|
|
|
#ifndef YYSTYPE
|
|
typedef int YYSTYPE;
|
|
#endif
|
|
|
|
/* 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 DIGIT 257
|
|
#define LETTER 258
|
|
#define UMINUS 259
|
|
#define YYERRCODE 256
|
|
static const short yylhs[] = { -1,
|
|
0, 0, 0, 1, 1, 2, 2, 2, 2, 2,
|
|
2, 2, 2, 2, 2, 2, 3, 3,
|
|
};
|
|
static const short yylen[] = { 2,
|
|
0, 3, 3, 1, 3, 3, 3, 3, 3, 3,
|
|
3, 3, 3, 2, 1, 1, 1, 2,
|
|
};
|
|
static const short yydefred[] = { 1,
|
|
0, 0, 17, 0, 0, 0, 0, 0, 0, 3,
|
|
0, 15, 14, 0, 2, 0, 0, 0, 0, 0,
|
|
0, 0, 18, 0, 6, 0, 0, 0, 0, 9,
|
|
10, 11,
|
|
};
|
|
static const short yydgoto[] = { 1,
|
|
7, 8, 9,
|
|
};
|
|
static const short yysindex[] = { 0,
|
|
-40, -7, 0, -55, -38, -38, 1, -29, -247, 0,
|
|
-38, 0, 0, 22, 0, -38, -38, -38, -38, -38,
|
|
-38, -38, 0, -29, 0, 51, 60, -20, -20, 0,
|
|
0, 0,
|
|
};
|
|
static const short yyrindex[] = { 0,
|
|
0, 0, 0, 2, 0, 0, 0, 9, -9, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 10, 0, -6, 14, 5, 13, 0,
|
|
0, 0,
|
|
};
|
|
static const short yygindex[] = { 0,
|
|
0, 65, 0,
|
|
};
|
|
#define YYTABLESIZE 220
|
|
static const short yytable[] = { 6,
|
|
16, 6, 10, 13, 5, 11, 5, 22, 17, 23,
|
|
15, 15, 20, 18, 7, 19, 22, 21, 4, 5,
|
|
0, 20, 8, 12, 0, 0, 21, 16, 16, 0,
|
|
0, 16, 16, 16, 13, 16, 0, 16, 15, 15,
|
|
0, 0, 7, 15, 15, 7, 15, 7, 15, 7,
|
|
8, 12, 0, 8, 12, 8, 0, 8, 22, 17,
|
|
0, 0, 25, 20, 18, 0, 19, 0, 21, 13,
|
|
14, 0, 0, 0, 0, 24, 0, 0, 0, 0,
|
|
26, 27, 28, 29, 30, 31, 32, 22, 17, 0,
|
|
0, 0, 20, 18, 16, 19, 22, 21, 0, 0,
|
|
0, 20, 18, 0, 19, 0, 21, 0, 0, 0,
|
|
0, 0, 0, 0, 16, 0, 0, 13, 0, 0,
|
|
0, 0, 0, 0, 0, 15, 0, 0, 7, 0,
|
|
0, 0, 0, 0, 0, 0, 8, 12, 0, 0,
|
|
0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 2, 3, 4, 3, 12,
|
|
};
|
|
static const short yycheck[] = { 40,
|
|
10, 40, 10, 10, 45, 61, 45, 37, 38, 257,
|
|
10, 10, 42, 43, 10, 45, 37, 47, 10, 10,
|
|
-1, 42, 10, 10, -1, -1, 47, 37, 38, -1,
|
|
-1, 41, 42, 43, 41, 45, -1, 47, 37, 38,
|
|
-1, -1, 38, 42, 43, 41, 45, 43, 47, 45,
|
|
38, 38, -1, 41, 41, 43, -1, 45, 37, 38,
|
|
-1, -1, 41, 42, 43, -1, 45, -1, 47, 5,
|
|
6, -1, -1, -1, -1, 11, -1, -1, -1, -1,
|
|
16, 17, 18, 19, 20, 21, 22, 37, 38, -1,
|
|
-1, -1, 42, 43, 124, 45, 37, 47, -1, -1,
|
|
-1, 42, 43, -1, 45, -1, 47, -1, -1, -1,
|
|
-1, -1, -1, -1, 124, -1, -1, 124, -1, -1,
|
|
-1, -1, -1, -1, -1, 124, -1, -1, 124, -1,
|
|
-1, -1, -1, -1, -1, -1, 124, 124, -1, -1,
|
|
-1, -1, -1, -1, -1, 124, -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, -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, 257, 258,
|
|
};
|
|
#define YYFINAL 1
|
|
#ifndef YYDEBUG
|
|
#define YYDEBUG 0
|
|
#endif
|
|
#define YYMAXTOKEN 259
|
|
#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,"DIGIT","LETTER","UMINUS","illegal-symbol",
|
|
};
|
|
static const char *yyrule[] = {
|
|
"$accept : list",
|
|
"list :",
|
|
"list : list stat '\\n'",
|
|
"list : list error '\\n'",
|
|
"stat : expr",
|
|
"stat : LETTER '=' expr",
|
|
"expr : '(' expr ')'",
|
|
"expr : expr '+' expr",
|
|
"expr : expr '-' expr",
|
|
"expr : expr '*' expr",
|
|
"expr : expr '/' expr",
|
|
"expr : expr '%' expr",
|
|
"expr : expr '&' expr",
|
|
"expr : expr '|' expr",
|
|
"expr : '-' expr",
|
|
"expr : LETTER",
|
|
"expr : number",
|
|
"number : DIGIT",
|
|
"number : number DIGIT",
|
|
|
|
};
|
|
#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 72 "pure_calc.y"
|
|
/* start of programs */
|
|
|
|
#ifdef YYBYACC
|
|
static int YYLEX_DECL();
|
|
#endif
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
while(!feof(stdin)) {
|
|
yyparse();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
YYERROR_DECL()
|
|
{
|
|
fprintf(stderr, "%s\n", s);
|
|
}
|
|
|
|
int
|
|
YYLEX_DECL()
|
|
{
|
|
/* lexical analysis routine */
|
|
/* returns LETTER for a lower case letter, yylval = 0 through 25 */
|
|
/* return DIGIT for a digit, yylval = 0 through 9 */
|
|
/* all other characters are returned immediately */
|
|
|
|
int c;
|
|
|
|
while( (c=getchar()) == ' ' ) { /* skip blanks */ }
|
|
|
|
/* c is now nonblank */
|
|
|
|
if( islower( c )) {
|
|
*yylval = c - 'a';
|
|
return ( LETTER );
|
|
}
|
|
if( isdigit( c )) {
|
|
*yylval = c - '0';
|
|
return ( DIGIT );
|
|
}
|
|
return( c );
|
|
}
|
|
#line 277 "/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 34 "pure_calc.y"
|
|
{ yyerrok ; }
|
|
break;
|
|
case 4:
|
|
#line 38 "pure_calc.y"
|
|
{ printf("%d\n",yystack.l_mark[0]);}
|
|
break;
|
|
case 5:
|
|
#line 40 "pure_calc.y"
|
|
{ regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
|
|
break;
|
|
case 6:
|
|
#line 44 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-1]; }
|
|
break;
|
|
case 7:
|
|
#line 46 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
|
|
break;
|
|
case 8:
|
|
#line 48 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
|
|
break;
|
|
case 9:
|
|
#line 50 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
|
|
break;
|
|
case 10:
|
|
#line 52 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
|
|
break;
|
|
case 11:
|
|
#line 54 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
|
|
break;
|
|
case 12:
|
|
#line 56 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
|
|
break;
|
|
case 13:
|
|
#line 58 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
|
|
break;
|
|
case 14:
|
|
#line 60 "pure_calc.y"
|
|
{ yyval = - yystack.l_mark[0]; }
|
|
break;
|
|
case 15:
|
|
#line 62 "pure_calc.y"
|
|
{ yyval = regs[yystack.l_mark[0]]; }
|
|
break;
|
|
case 17:
|
|
#line 67 "pure_calc.y"
|
|
{ yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
|
|
break;
|
|
case 18:
|
|
#line 69 "pure_calc.y"
|
|
{ yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
|
|
break;
|
|
#line 539 "/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);
|
|
}
|