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.
596 lines
16 KiB
Plaintext
596 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 "code_calc.y"
|
|
# include <stdio.h>
|
|
# include <ctype.h>
|
|
|
|
int regs[26];
|
|
int base;
|
|
|
|
#ifdef YYBISON
|
|
int yylex(void);
|
|
static void yyerror(const char *s);
|
|
#endif
|
|
|
|
#line 31 "/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 68 "code_calc.y"
|
|
/* start of programs */
|
|
|
|
#ifdef YYBYACC
|
|
extern int YYLEX_DECL();
|
|
#endif
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
while(!feof(stdin)) {
|
|
yyparse();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
yyerror(const char *s)
|
|
{
|
|
fprintf(stderr, "%s\n", s);
|
|
}
|
|
|
|
int
|
|
yylex(void)
|
|
{
|
|
/* 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 273 "/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 30 "code_calc.y"
|
|
{ yyerrok ; }
|
|
break;
|
|
case 4:
|
|
#line 34 "code_calc.y"
|
|
{ printf("%d\n",yystack.l_mark[0]);}
|
|
break;
|
|
case 5:
|
|
#line 36 "code_calc.y"
|
|
{ regs[yystack.l_mark[-2]] = yystack.l_mark[0]; }
|
|
break;
|
|
case 6:
|
|
#line 40 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-1]; }
|
|
break;
|
|
case 7:
|
|
#line 42 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-2] + yystack.l_mark[0]; }
|
|
break;
|
|
case 8:
|
|
#line 44 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-2] - yystack.l_mark[0]; }
|
|
break;
|
|
case 9:
|
|
#line 46 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-2] * yystack.l_mark[0]; }
|
|
break;
|
|
case 10:
|
|
#line 48 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-2] / yystack.l_mark[0]; }
|
|
break;
|
|
case 11:
|
|
#line 50 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-2] % yystack.l_mark[0]; }
|
|
break;
|
|
case 12:
|
|
#line 52 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-2] & yystack.l_mark[0]; }
|
|
break;
|
|
case 13:
|
|
#line 54 "code_calc.y"
|
|
{ yyval = yystack.l_mark[-2] | yystack.l_mark[0]; }
|
|
break;
|
|
case 14:
|
|
#line 56 "code_calc.y"
|
|
{ yyval = - yystack.l_mark[0]; }
|
|
break;
|
|
case 15:
|
|
#line 58 "code_calc.y"
|
|
{ yyval = regs[yystack.l_mark[0]]; }
|
|
break;
|
|
case 17:
|
|
#line 63 "code_calc.y"
|
|
{ yyval = yystack.l_mark[0]; base = (yystack.l_mark[0]==0) ? 8 : 10; }
|
|
break;
|
|
case 18:
|
|
#line 65 "code_calc.y"
|
|
{ yyval = base * yystack.l_mark[-1] + yystack.l_mark[0]; }
|
|
break;
|
|
#line 535 "/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);
|
|
}
|