335 lines
6.3 KiB
Plaintext
335 lines
6.3 KiB
Plaintext
|
|
extern int timeclock;
|
|
|
|
|
|
int yyerror; /* Yyerror and yycost are set by guards. */
|
|
int yycost; /* If yyerror is set to a nonzero value by a */
|
|
/* guard, the reduction with which the guard */
|
|
/* is associated is not performed, and the */
|
|
/* error recovery mechanism is invoked. */
|
|
/* Yycost indicates the cost of performing */
|
|
/* the reduction given the attributes of the */
|
|
/* symbols. */
|
|
|
|
|
|
/* YYMAXDEPTH indicates the size of the parser's state and value */
|
|
/* stacks. */
|
|
|
|
#ifndef YYMAXDEPTH
|
|
#define YYMAXDEPTH 500
|
|
#endif
|
|
|
|
/* YYMAXRULES must be at least as large as the number of rules that */
|
|
/* could be placed in the rule queue. That number could be determined */
|
|
/* from the grammar and the size of the stack, but, as yet, it is not. */
|
|
|
|
#ifndef YYMAXRULES
|
|
#define YYMAXRULES 100
|
|
#endif
|
|
|
|
#ifndef YYMAXBACKUP
|
|
#define YYMAXBACKUP 100
|
|
#endif
|
|
|
|
|
|
short yyss[YYMAXDEPTH]; /* the state stack */
|
|
YYSTYPE yyvs[YYMAXDEPTH]; /* the semantic value stack */
|
|
YYLTYPE yyls[YYMAXDEPTH]; /* the location stack */
|
|
short yyrq[YYMAXRULES]; /* the rule queue */
|
|
int yychar; /* the lookahead symbol */
|
|
|
|
YYSTYPE yylval; /* the semantic value of the */
|
|
/* lookahead symbol */
|
|
|
|
YYSTYPE yytval; /* the semantic value for the state */
|
|
/* at the top of the state stack. */
|
|
|
|
YYSTYPE yyval; /* the variable used to return */
|
|
/* semantic values from the action */
|
|
/* routines */
|
|
|
|
YYLTYPE yylloc; /* location data for the lookahead */
|
|
/* symbol */
|
|
|
|
YYLTYPE yytloc; /* location data for the state at the */
|
|
/* top of the state stack */
|
|
|
|
|
|
int yynunlexed;
|
|
short yyunchar[YYMAXBACKUP];
|
|
YYSTYPE yyunval[YYMAXBACKUP];
|
|
YYLTYPE yyunloc[YYMAXBACKUP];
|
|
|
|
short *yygssp; /* a pointer to the top of the state */
|
|
/* stack; only set during error */
|
|
/* recovery. */
|
|
|
|
YYSTYPE *yygvsp; /* a pointer to the top of the value */
|
|
/* stack; only set during error */
|
|
/* recovery. */
|
|
|
|
YYLTYPE *yyglsp; /* a pointer to the top of the */
|
|
/* location stack; only set during */
|
|
/* error recovery. */
|
|
|
|
|
|
/* Yyget is an interface between the parser and the lexical analyzer. */
|
|
/* It is costly to provide such an interface, but it avoids requiring */
|
|
/* the lexical analyzer to be able to back up the scan. */
|
|
|
|
yyget()
|
|
{
|
|
if (yynunlexed > 0)
|
|
{
|
|
yynunlexed--;
|
|
yychar = yyunchar[yynunlexed];
|
|
yylval = yyunval[yynunlexed];
|
|
yylloc = yyunloc[yynunlexed];
|
|
}
|
|
else if (yychar <= 0)
|
|
yychar = 0;
|
|
else
|
|
{
|
|
yychar = yylex();
|
|
if (yychar < 0)
|
|
yychar = 0;
|
|
else yychar = YYTRANSLATE(yychar);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
yyunlex(chr, val, loc)
|
|
int chr;
|
|
YYSTYPE val;
|
|
YYLTYPE loc;
|
|
{
|
|
yyunchar[yynunlexed] = chr;
|
|
yyunval[yynunlexed] = val;
|
|
yyunloc[yynunlexed] = loc;
|
|
yynunlexed++;
|
|
}
|
|
|
|
|
|
|
|
yyrestore(first, last)
|
|
register short *first;
|
|
register short *last;
|
|
{
|
|
register short *ssp;
|
|
register short *rp;
|
|
register int symbol;
|
|
register int state;
|
|
register int tvalsaved;
|
|
|
|
ssp = yygssp;
|
|
yyunlex(yychar, yylval, yylloc);
|
|
|
|
tvalsaved = 0;
|
|
while (first != last)
|
|
{
|
|
symbol = yystos[*ssp];
|
|
if (symbol < YYNTBASE)
|
|
{
|
|
yyunlex(symbol, yytval, yytloc);
|
|
tvalsaved = 1;
|
|
ssp--;
|
|
}
|
|
|
|
ssp--;
|
|
|
|
if (first == yyrq)
|
|
first = yyrq + YYMAXRULES;
|
|
|
|
first--;
|
|
|
|
for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++)
|
|
{
|
|
if (symbol < YYNTBASE)
|
|
state = yytable[yypact[*ssp] + symbol];
|
|
else
|
|
{
|
|
state = yypgoto[symbol - YYNTBASE] + *ssp;
|
|
|
|
if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp)
|
|
state = yytable[state];
|
|
else
|
|
state = yydefgoto[symbol - YYNTBASE];
|
|
}
|
|
|
|
*++ssp = state;
|
|
}
|
|
}
|
|
|
|
if ( ! tvalsaved && ssp > yyss)
|
|
{
|
|
yyunlex(yystos[*ssp], yytval, yytloc);
|
|
ssp--;
|
|
}
|
|
|
|
yygssp = ssp;
|
|
}
|
|
|
|
|
|
|
|
int
|
|
yyparse()
|
|
{
|
|
register int yystate;
|
|
register int yyn;
|
|
register short *yyssp;
|
|
register short *yyrq0;
|
|
register short *yyptr;
|
|
register YYSTYPE *yyvsp;
|
|
|
|
int yylen;
|
|
YYLTYPE *yylsp;
|
|
short *yyrq1;
|
|
short *yyrq2;
|
|
|
|
yystate = 0;
|
|
yyssp = yyss - 1;
|
|
yyvsp = yyvs - 1;
|
|
yylsp = yyls - 1;
|
|
yyrq0 = yyrq;
|
|
yyrq1 = yyrq0;
|
|
yyrq2 = yyrq0;
|
|
|
|
yychar = yylex();
|
|
if (yychar < 0)
|
|
yychar = 0;
|
|
else yychar = YYTRANSLATE(yychar);
|
|
|
|
yynewstate:
|
|
|
|
if (yyssp >= yyss + YYMAXDEPTH - 1)
|
|
{
|
|
yyabort("Parser Stack Overflow");
|
|
YYABORT;
|
|
}
|
|
|
|
*++yyssp = yystate;
|
|
|
|
yyresume:
|
|
|
|
yyn = yypact[yystate];
|
|
if (yyn == YYFLAG)
|
|
goto yydefault;
|
|
|
|
yyn += yychar;
|
|
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar)
|
|
goto yydefault;
|
|
|
|
yyn = yytable[yyn];
|
|
if (yyn < 0)
|
|
{
|
|
yyn = -yyn;
|
|
goto yyreduce;
|
|
}
|
|
else if (yyn == 0)
|
|
goto yyerrlab;
|
|
|
|
yystate = yyn;
|
|
|
|
yyptr = yyrq2;
|
|
while (yyptr != yyrq1)
|
|
{
|
|
yyn = *yyptr++;
|
|
yylen = yyr2[yyn];
|
|
yyvsp -= yylen;
|
|
yylsp -= yylen;
|
|
|
|
yyguard(yyn, yyvsp, yylsp);
|
|
if (yyerror)
|
|
goto yysemerr;
|
|
|
|
yyaction(yyn, yyvsp, yylsp);
|
|
*++yyvsp = yyval;
|
|
|
|
yylsp++;
|
|
if (yylen == 0)
|
|
{
|
|
yylsp->timestamp = timeclock;
|
|
yylsp->first_line = yytloc.first_line;
|
|
yylsp->first_column = yytloc.first_column;
|
|
yylsp->last_line = (yylsp-1)->last_line;
|
|
yylsp->last_column = (yylsp-1)->last_column;
|
|
yylsp->text = 0;
|
|
}
|
|
else
|
|
{
|
|
yylsp->last_line = (yylsp+yylen-1)->last_line;
|
|
yylsp->last_column = (yylsp+yylen-1)->last_column;
|
|
}
|
|
|
|
if (yyptr == yyrq + YYMAXRULES)
|
|
yyptr = yyrq;
|
|
}
|
|
|
|
if (yystate == YYFINAL)
|
|
YYACCEPT;
|
|
|
|
yyrq2 = yyptr;
|
|
yyrq1 = yyrq0;
|
|
|
|
*++yyvsp = yytval;
|
|
*++yylsp = yytloc;
|
|
yytval = yylval;
|
|
yytloc = yylloc;
|
|
yyget();
|
|
|
|
goto yynewstate;
|
|
|
|
yydefault:
|
|
|
|
yyn = yydefact[yystate];
|
|
if (yyn == 0)
|
|
goto yyerrlab;
|
|
|
|
yyreduce:
|
|
|
|
*yyrq0++ = yyn;
|
|
|
|
if (yyrq0 == yyrq + YYMAXRULES)
|
|
yyrq0 = yyrq;
|
|
|
|
if (yyrq0 == yyrq2)
|
|
{
|
|
yyabort("Parser Rule Queue Overflow");
|
|
YYABORT;
|
|
}
|
|
|
|
yyssp -= yyr2[yyn];
|
|
yyn = yyr1[yyn];
|
|
|
|
yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
|
|
if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
|
|
yystate = yytable[yystate];
|
|
else
|
|
yystate = yydefgoto[yyn - YYNTBASE];
|
|
|
|
goto yynewstate;
|
|
|
|
yysemerr:
|
|
*--yyptr = yyn;
|
|
yyrq2 = yyptr;
|
|
yyvsp += yyr2[yyn];
|
|
|
|
yyerrlab:
|
|
|
|
yygssp = yyssp;
|
|
yygvsp = yyvsp;
|
|
yyglsp = yylsp;
|
|
yyrestore(yyrq0, yyrq2);
|
|
yyrecover();
|
|
yystate = *yygssp;
|
|
yyssp = yygssp;
|
|
yyvsp = yygvsp;
|
|
yyrq0 = yyrq;
|
|
yyrq1 = yyrq0;
|
|
yyrq2 = yyrq0;
|
|
goto yyresume;
|
|
}
|
|
|
|
$
|