mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 21:23:04 +01:00
478 lines
12 KiB
Plaintext
478 lines
12 KiB
Plaintext
|
%% banner
|
||
|
/*
|
||
|
** "@(#)push.skel, based on byacc 1.8 (Berkeley) 01/20/91";
|
||
|
*/
|
||
|
#define YYBTYACC 1
|
||
|
|
||
|
%% header
|
||
|
#define yyclearin (yychar=(-1))
|
||
|
#define yyerrok (yyerrflag=0)
|
||
|
/* #ifdef YYSTACKSIZE
|
||
|
#ifndef YYMAXDEPTH
|
||
|
#define YYMAXDEPTH YYSTACKSIZE
|
||
|
#endif
|
||
|
#else
|
||
|
#ifdef YYMAXDEPTH
|
||
|
#define YYSTACKSIZE YYMAXDEPTH
|
||
|
#else
|
||
|
#define YYSTACKSIZE 500
|
||
|
#define YYMAXDEPTH 500
|
||
|
#endif
|
||
|
#endif */
|
||
|
int yydebug;
|
||
|
static struct yyparsestate {
|
||
|
struct yyparsestate *save;
|
||
|
int state;
|
||
|
int errflag;
|
||
|
short *ssp;
|
||
|
YYSTYPE *vsp;
|
||
|
YYSTYPE val;
|
||
|
short *ss;
|
||
|
YYSTYPE *vs;
|
||
|
int lexeme;
|
||
|
unsigned short stacksize;
|
||
|
short ctry;
|
||
|
} *yypstate=0, *yypath=0;
|
||
|
#define yyerrflag (yypstate->errflag)
|
||
|
#define yyssp (yypstate->ssp)
|
||
|
#define yyvsp (yypstate->vsp)
|
||
|
#define yyval (yypstate->val)
|
||
|
#define yyss (yypstate->ss)
|
||
|
#define yyvs (yypstate->vs)
|
||
|
#define yystacksize (yypstate->stacksize)
|
||
|
static YYSTYPE *yylvals=0, *yylvp=0, *yylve=0, *yylvlim=0;
|
||
|
static short *yylexemes=0, *yylexp=0;
|
||
|
#define YYLEX (yylvp<yylve ? yylval=*yylvp++, *yylexp++ : \
|
||
|
yytrial ? (yylvp==yylvlim ? yyexpand() : 0), *yylexp = yylex(), \
|
||
|
*yylvp++ = yylval, yylve++, *yylexp++ \
|
||
|
: yylex())
|
||
|
extern int yylex(), yyparse();
|
||
|
#define yytrial (yypstate->save)
|
||
|
#ifndef __cplusplus
|
||
|
#define YYSCOPY(t, f, s) memcpy(t, f, (s)*sizeof(YYSTYPE))
|
||
|
#define YYMORESTACK do { int p = yyssp - yyss; \
|
||
|
yystacksize += 16; \
|
||
|
yyss = (short *)realloc(yyss, yystacksize * sizeof(short)); \
|
||
|
yyvs = (YYSTYPE *)realloc(yyvs, yystacksize * sizeof(YYSTYPE)); \
|
||
|
yyssp = yyss + p; \
|
||
|
yyvsp = yyvs + p; \
|
||
|
} while (0)
|
||
|
#else /* C++ */
|
||
|
#define YYSCOPY(to, from, size) do { int _i; \
|
||
|
for (_i = (size)-1; _i >= 0; _i--) \
|
||
|
(to)[_i] = (from)[_i]; \
|
||
|
} while(0)
|
||
|
#define YYMORESTACK do { int p = yyssp - yyss; \
|
||
|
short *tss = yyss; YYSTYPE *tvs = yyvs; \
|
||
|
yyss = new short[yystacksize + 16]; \
|
||
|
yyvs = new YYSTYPE[yystacksize + 16]; \
|
||
|
memcpy(yyss, tss, yystacksize * sizeof(short)); \
|
||
|
YYSCOPY(yyvs, tvs, yystacksize); \
|
||
|
yystacksize += 16; \
|
||
|
delete[] tss; \
|
||
|
delete[] tvs; \
|
||
|
yyssp = yyss + p; \
|
||
|
yyvsp = yyvs + p; \
|
||
|
} while (0)
|
||
|
#endif /* C++ */
|
||
|
|
||
|
%% body
|
||
|
|
||
|
#ifndef YYNEWSTATE
|
||
|
#ifdef __oldc
|
||
|
static struct yyparsestate *YYNEWSTATE(size)
|
||
|
int size;
|
||
|
#else
|
||
|
static struct yyparsestate *YYNEWSTATE(int size)
|
||
|
#endif /* __oldc */
|
||
|
{
|
||
|
struct yyparsestate *p;
|
||
|
|
||
|
#ifndef __cplusplus
|
||
|
p = (struct yyparsestate *)malloc(sizeof(struct yyparsestate));
|
||
|
p->stacksize = size+4;
|
||
|
p->ss = (short *)malloc((size+4)*sizeof(short));
|
||
|
p->vs = (YYSTYPE *)malloc((size+4)*sizeof(YYSTYPE));
|
||
|
#else /* C++ */
|
||
|
p = new yyparsestate;
|
||
|
p->stacksize = size+4;
|
||
|
p->ss = new short[size + 4];
|
||
|
p->vs = new YYSTYPE[size + 4];
|
||
|
#endif /* C++ */
|
||
|
return p;
|
||
|
}
|
||
|
#endif /* YYNEWSTATE */
|
||
|
#ifndef YYFREESTATE
|
||
|
#ifndef __cplusplus
|
||
|
#define YYFREESTATE(p) (free((p)->ss), free((p)->vs), free(p))
|
||
|
#else /* C++ */
|
||
|
#define YYFREESTATE(p) (delete[] (p)->ss, delete[] (p)->vs, delete (p))
|
||
|
#endif /* C++ */
|
||
|
#endif /* YYFREESTATE */
|
||
|
static int yyexpand()
|
||
|
{
|
||
|
int p = yylvp-yylvals;
|
||
|
int s = yylvlim-yylvals;
|
||
|
s += 16;
|
||
|
#ifndef __cplusplus
|
||
|
yylvals = (YYSTYPE *)realloc(yylvals, s*sizeof(YYSTYPE));
|
||
|
yylexemes = (short *)realloc(yylexemes, s*sizeof(short));
|
||
|
#else /* C++ */
|
||
|
{ short *tl = yylexemes; YYSTYPE *tv = yylvals;
|
||
|
yylvals = new YYSTYPE[s];
|
||
|
yylexemes = new short[s];
|
||
|
memcpy(yylexemes, tl, (s-16)*sizeof(short));
|
||
|
YYSCOPY(yylvals, tv, s-16);
|
||
|
delete[] tl;
|
||
|
delete[] tv; }
|
||
|
#endif /* C++ */
|
||
|
yylvp = yylve = yylvals + p;
|
||
|
yylvlim = yylvals + s;
|
||
|
yylexp = yylexemes + p;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#define YYABORT goto yyabort
|
||
|
#define YYACCEPT goto yyaccept
|
||
|
#define YYERROR goto yyerrlab
|
||
|
#define YYVALID do { if (yytrial) goto yyvalid; } while(0)
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" char *getenv(const char *);
|
||
|
#else
|
||
|
extern char *getenv();
|
||
|
#endif
|
||
|
int yyparse(int yychar, YYSTYPE yylval)
|
||
|
{
|
||
|
int yym, yyn, yystate, yynewerrflag;
|
||
|
#if YYDEBUG
|
||
|
char *yys;
|
||
|
#endif
|
||
|
|
||
|
if (yychar < 0) yychar = 0;
|
||
|
if (!yypstate) {
|
||
|
/* initialize the parser state */
|
||
|
yypstate = YYNEWSTATE(12);
|
||
|
yypath = 0;
|
||
|
yytrial = 0;
|
||
|
yyerrflag = 0;
|
||
|
yylvp = yylve = yylvals;
|
||
|
yylexp = yylexemes;
|
||
|
yyssp = yyss;
|
||
|
yyvsp = yyvs;
|
||
|
*yyssp = yypstate->state = 0; }
|
||
|
yystate = yypstate->state;
|
||
|
#if YYDEBUG
|
||
|
if (yydebug) {
|
||
|
yys = 0;
|
||
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
||
|
if (!yys) yys = "illegal-symbol";
|
||
|
printf("yydebug: state %d, input %d (%s)", yystate,
|
||
|
yychar, yys);
|
||
|
#ifdef YYDBPR
|
||
|
printf("<");
|
||
|
YYDBPR(yylval);
|
||
|
printf(">");
|
||
|
#endif
|
||
|
printf("\n"); }
|
||
|
#endif
|
||
|
if (yystate == YYFINAL && yychar == 0)
|
||
|
goto yyaccept;
|
||
|
if (yytrial) {
|
||
|
if (yylvp == yylvlim) yyexpand();
|
||
|
*yylvp++ = yylval;
|
||
|
yylve++;
|
||
|
*yylexp++ = yychar; }
|
||
|
yyloop:
|
||
|
if ((yyn = yydefred[yystate])) goto yyreduce;
|
||
|
if (yychar < 0) {
|
||
|
if (yylvp < yylve) {
|
||
|
yylval = *yylvp++;
|
||
|
yychar = *yylexp++; }
|
||
|
else {
|
||
|
yypstate->state = yystate;
|
||
|
return 0; }
|
||
|
#if YYDEBUG
|
||
|
if (yydebug) {
|
||
|
yys = 0;
|
||
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
||
|
if (!yys) yys = "illegal-symbol";
|
||
|
printf("yydebug: state %d, reading %d (%s)", yystate,
|
||
|
yychar, yys);
|
||
|
#ifdef YYDBPR
|
||
|
printf("<");
|
||
|
YYDBPR(yylval);
|
||
|
printf(">");
|
||
|
#endif
|
||
|
printf("\n"); }
|
||
|
#endif
|
||
|
}
|
||
|
if ((yyn = yycindex[yystate]) &&
|
||
|
(yyn += yychar) >= 0 &&
|
||
|
yyn <= YYTABLESIZE &&
|
||
|
yycheck[yyn] == yychar) {
|
||
|
int ctry;
|
||
|
struct yyparsestate *save;
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: state %d, conflict%s\n", yystate,
|
||
|
yypath ? ", following successful trial parse" :
|
||
|
yytrial ? "" : ", starting trial parse");
|
||
|
#endif
|
||
|
if (yypath) {
|
||
|
save = yypath;
|
||
|
yypath = save->save;
|
||
|
ctry = save->ctry;
|
||
|
if (save->state != yystate) goto yyabort;
|
||
|
YYFREESTATE(save); }
|
||
|
else {
|
||
|
save = YYNEWSTATE(yyssp - yyss);
|
||
|
save->save = yypstate->save;
|
||
|
save->state = yystate;
|
||
|
save->errflag = yypstate->errflag;
|
||
|
save->ssp = save->ss + (yyssp - yyss);
|
||
|
save->vsp = save->vs + (yyvsp - yyvs);
|
||
|
memcpy(save->ss, yyss, (yyssp - yyss + 1)*sizeof(short));
|
||
|
YYSCOPY(save->vs, yyvs, yyssp - yyss + 1);
|
||
|
ctry = yytable[yyn];
|
||
|
if (yyctable[ctry] == -1) {
|
||
|
#if YYDEBUG
|
||
|
if (yydebug && yychar >= 0)
|
||
|
printf("yydebug: backtracking 1 token\n");
|
||
|
#endif
|
||
|
ctry++; }
|
||
|
save->ctry = ctry;
|
||
|
if (!yytrial) {
|
||
|
if (!yylexemes) {
|
||
|
#ifndef __cplusplus
|
||
|
yylexemes = (short *)malloc(16*sizeof(short));
|
||
|
yylvals = (YYSTYPE *)malloc(16*sizeof(YYSTYPE));
|
||
|
#else /* C++ */
|
||
|
yylexemes = new short[16];
|
||
|
yylvals = new YYSTYPE[16];
|
||
|
#endif /* C++ */
|
||
|
yylvlim = yylvals + 16; }
|
||
|
if (yylvp == yylve) {
|
||
|
yylvp = yylve = yylvals;
|
||
|
yylexp = yylexemes;
|
||
|
if (yychar >= 0) {
|
||
|
*yylve++ = yylval;
|
||
|
*yylexp = yychar;
|
||
|
yychar = -1; } } }
|
||
|
if (yychar >= 0) {
|
||
|
yylvp--, yylexp--;
|
||
|
yychar = -1; }
|
||
|
save->lexeme = yylvp - yylvals;
|
||
|
yypstate->save = save; }
|
||
|
if (yytable[yyn] == ctry) {
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: state %d, shifting to state %d\n",
|
||
|
yystate, yyctable[ctry]);
|
||
|
#endif
|
||
|
if (yychar < 0)
|
||
|
yylvp++, yylexp++;
|
||
|
yychar = -1;
|
||
|
if (yyerrflag > 0) --yyerrflag;
|
||
|
yystate = yyctable[ctry];
|
||
|
goto yyshift; }
|
||
|
else {
|
||
|
yyn = yyctable[ctry];
|
||
|
goto yyreduce; } }
|
||
|
if ((yyn = yysindex[yystate]) &&
|
||
|
(yyn += yychar) >= 0 &&
|
||
|
yyn <= YYTABLESIZE &&
|
||
|
yycheck[yyn] == yychar) {
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: state %d, shifting to state %d\n",
|
||
|
yystate, yytable[yyn]);
|
||
|
#endif
|
||
|
yychar = (-1);
|
||
|
if (yyerrflag > 0) --yyerrflag;
|
||
|
yystate = yytable[yyn];
|
||
|
yyshift:
|
||
|
if (yyssp >= yyss + yystacksize - 1)
|
||
|
YYMORESTACK;
|
||
|
*++yyssp = yystate;
|
||
|
*++yyvsp = yylval;
|
||
|
goto yyloop; }
|
||
|
if ((yyn = yyrindex[yystate]) &&
|
||
|
(yyn += yychar) >= 0 &&
|
||
|
yyn <= YYTABLESIZE &&
|
||
|
yycheck[yyn] == yychar) {
|
||
|
yyn = yytable[yyn];
|
||
|
goto yyreduce; }
|
||
|
if (yyerrflag) goto yyinrecovery;
|
||
|
yynewerrflag = 1;
|
||
|
goto yyerrhandler;
|
||
|
yyerrlab:
|
||
|
yynewerrflag = 0;
|
||
|
yyerrhandler:
|
||
|
while (yytrial) { int ctry; struct yyparsestate *save;
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: error in state %d, %s state %d, %d tokens\n",
|
||
|
yystate, "backtracking to", yypstate->save->state,
|
||
|
(int)(yylvp - yylvals - yypstate->save->lexeme));
|
||
|
#endif
|
||
|
save = yypstate->save;
|
||
|
yylvp = yylvals + save->lexeme;
|
||
|
yylexp = yylexemes + save->lexeme;
|
||
|
yychar = -1;
|
||
|
yyssp = yyss + (save->ssp - save->ss);
|
||
|
yyvsp = yyvs + (save->vsp - save->vs);
|
||
|
memcpy(yyss, save->ss, (yyssp - yyss + 1) * sizeof(short));
|
||
|
YYSCOPY(yyvs, save->vs, yyvsp - yyvs + 1);
|
||
|
ctry = ++save->ctry;
|
||
|
yystate = save->state;
|
||
|
if ((yyn = yyctable[ctry]) >= 0) goto yyreduce;
|
||
|
yypstate->save = save->save;
|
||
|
YYFREESTATE(save);
|
||
|
#if YYDEBUG
|
||
|
if (yydebug && !yytrial)
|
||
|
printf("yydebug: trial parse failed, entering error mode\n");
|
||
|
#endif
|
||
|
yynewerrflag = 1; }
|
||
|
if (yynewerrflag)
|
||
|
yyerror("syntax error");
|
||
|
yyinrecovery:
|
||
|
if (yyerrflag < 3) {
|
||
|
yyerrflag = 3;
|
||
|
for (;;) {
|
||
|
if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
|
||
|
yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) {
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: state %d, error recovery %s state %d\n",
|
||
|
*yyssp, "shifting to", yytable[yyn]);
|
||
|
#endif
|
||
|
yystate = yytable[yyn];
|
||
|
goto yyshift; }
|
||
|
else {
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: error recovery discarding state %d\n",
|
||
|
*yyssp);
|
||
|
#endif
|
||
|
if (yyssp <= yyss) goto yyabort;
|
||
|
--yyssp;
|
||
|
--yyvsp; } } }
|
||
|
else {
|
||
|
if (yychar == 0) goto yyabort;
|
||
|
#if YYDEBUG
|
||
|
if (yydebug) {
|
||
|
yys = 0;
|
||
|
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
|
||
|
if (!yys) yys = "illegal-symbol";
|
||
|
printf("yydebug: state %d, error recovery discards token %d (%s)\n",
|
||
|
yystate, yychar, yys); }
|
||
|
#endif
|
||
|
yychar = (-1);
|
||
|
goto yyloop; }
|
||
|
yyreduce:
|
||
|
yym = yylen[yyn];
|
||
|
#if YYDEBUG
|
||
|
if (yydebug) {
|
||
|
printf("yydebug: state %d, reducing by rule %d (%s)",
|
||
|
yystate, yyn, yyrule[yyn]);
|
||
|
#ifdef YYDBPR
|
||
|
if (yym) {
|
||
|
int i;
|
||
|
printf("<");
|
||
|
for (i=yym; i>0; i--) {
|
||
|
if (i!=yym) printf(", ");
|
||
|
YYDBPR(yyvsp[1-i]); }
|
||
|
printf(">"); }
|
||
|
#endif
|
||
|
printf("\n"); }
|
||
|
#endif
|
||
|
if (yyssp + 1 - yym >= yyss + yystacksize)
|
||
|
YYMORESTACK;
|
||
|
yyval = yyvsp[1-yym];
|
||
|
switch (yyn) {
|
||
|
|
||
|
%% trailer
|
||
|
}
|
||
|
|
||
|
#if YYDEBUG && defined(YYDBPR)
|
||
|
if (yydebug) {
|
||
|
printf("yydebug: after reduction, result is ");
|
||
|
YYDBPR(yyval);
|
||
|
printf("\n"); }
|
||
|
#endif
|
||
|
yyssp -= yym;
|
||
|
yystate = *yyssp;
|
||
|
yyvsp -= yym;
|
||
|
yym = yylhs[yyn];
|
||
|
if (yystate == 0 && yym == 0) {
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: after reduction, %s from state 0 to state %d\n",
|
||
|
"shifting", YYFINAL);
|
||
|
#endif
|
||
|
yystate = YYFINAL;
|
||
|
*++yyssp = YYFINAL;
|
||
|
*++yyvsp = yyval;
|
||
|
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("yydebug: after reduction, %s from state %d to state %d\n",
|
||
|
"shifting", *yyssp, yystate);
|
||
|
#endif
|
||
|
if (yyssp >= yyss + yystacksize - 1)
|
||
|
YYMORESTACK;
|
||
|
*++yyssp = yystate;
|
||
|
*++yyvsp = yyval;
|
||
|
goto yyloop;
|
||
|
yyvalid:
|
||
|
if (yypath)
|
||
|
goto yyabort;
|
||
|
while (yypstate->save) {
|
||
|
struct yyparsestate *save = yypstate->save;
|
||
|
yypstate->save = save->save;
|
||
|
save->save = yypath;
|
||
|
yypath = save; }
|
||
|
#if YYDEBUG
|
||
|
if (yydebug)
|
||
|
printf("yydebug: trial successful, %s state %d, %d tokens\n",
|
||
|
"backtracking to", yypath->state,
|
||
|
(int)(yylvp - yylvals - yypath->lexeme));
|
||
|
#endif
|
||
|
yychar = -1;
|
||
|
yyssp = yyss + (yypath->ssp - yypath->ss);
|
||
|
yyvsp = yyvs + (yypath->vsp - yypath->vs);
|
||
|
memcpy(yyss, yypath->ss, (yyssp - yyss + 1) * sizeof(short));
|
||
|
YYSCOPY(yyvs, yypath->vs, yyvsp - yyvs + 1);
|
||
|
yylvp = yylvals + yypath->lexeme;
|
||
|
yylexp = yylexemes + yypath->lexeme;
|
||
|
yystate = yypath->state;
|
||
|
goto yyloop;
|
||
|
yyabort:
|
||
|
while (yypstate) {
|
||
|
struct yyparsestate *save = yypstate;
|
||
|
yypstate = save->save;
|
||
|
YYFREESTATE(save); }
|
||
|
while (yypath) {
|
||
|
struct yyparsestate *save = yypath;
|
||
|
yypath = save->save;
|
||
|
YYFREESTATE(save); }
|
||
|
return -1;
|
||
|
yyaccept:
|
||
|
if (yytrial) goto yyvalid;
|
||
|
while (yypstate) {
|
||
|
struct yyparsestate *save = yypstate;
|
||
|
yypstate = save->save;
|
||
|
YYFREESTATE(save); }
|
||
|
while (yypath) {
|
||
|
struct yyparsestate *save = yypath;
|
||
|
yypath = save->save;
|
||
|
YYFREESTATE(save); }
|
||
|
return 1;
|
||
|
}
|