ocaml/yacc/parsing.c

137 lines
3.3 KiB
C

int yydebug;
int yynerrs;
int yyerrflag;
int yychar;
short *yyssp;
YYSTYPE *yyvsp;
YYSTYPE yyval;
YYSTYPE yylval;
short yyss[YYSTACKSIZE];
YYSTYPE yyvs[YYSTACKSIZE];
#define yystacksize YYSTACKSIZE
#define YYABORT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
value yyparse(tables, entrypoint, lexbuf)
value tables, entrypoint, lexbuf;
{
register int yym, yyn, yystate;
#define yyact FIELD(tables,0)
#define yytransl FIELD(tables,1)
#define yylhs FIELD(tables, 2)
#define yylen FIELD(tables, 3)
#define yydefred FIELD(tables, 4)
#define yydgoto FIELD(tables, 5)
#define yysindex FIELD(tables, 6)
#define yyrindex FIELD(tables, 7)
#define yygindex FIELD(tables, 8)
#define YYTABLESIZE CINT(FIELD(tables, 9))
#define yytable FIELD(tables, 10)
#define yycheck FIELD(tables, 11)
yynerrs = 0;
yyerrflag = 0;
yychar = (-1);
yyssp = yyss;
yyvsp = yyvs;
*yyssp = yystate = 0;
yychar = CINT(entrypoint);
yyloop:
if (yyn = yydefred[yystate]) goto yyreduce;
if (yychar < 0) {
token = yylex(lexbuf);
yychar = CINT(yytransl[TAG(token)]);
yylval = FIELD(token, 0);
}
if ((yyn = CINT(yysindex[yystate])) && (yyn += yychar) >= 0 &&
yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == yychar)
{
if (yyssp >= yyss + yystacksize - 1) grow_stacks();
*++yyssp = yystate = CINT(yytable[yyn]);
*++yyvsp = yylval;
yychar = (-1);
if (yyerrflag > 0) --yyerrflag;
goto yyloop;
}
if ((yyn = CINT(yyrindex[yystate])) && (yyn += yychar) >= 0 &&
yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == yychar)
{
yyn = yytable[yyn];
goto yyreduce;
}
if (yyerrflag) goto yyinrecovery;
yynewerror:
v = alloc(1, EXN_PARSING);
FIELD(v, 0) = MLINT(yychar);
mlraise(v);
yyerrlab:
++yynerrs;
yyinrecovery:
if (yyerrflag < 3)
{
yyerrflag = 3;
for (;;)
{
if ((yyn = CINT(yysindex[*yyssp])) && (yyn += YYERRCODE) >= 0 &&
yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == YYERRCODE)
{
if (yyssp >= yyss + yystacksize - 1) grow_stacks();
*++yyssp = yystate = yytable[yyn];
*++yyvsp = yylval;
goto yyloop;
}
else
{
if (yyssp <= yyss) goto yyabort;
--yyssp;
--yyvsp;
}
}
}
else
{
if (yychar == 0) goto yyabort;
yychar = (-1);
goto yyloop;
}
yyreduce:
yym = yylen[yyn];
yyval = mlapply(FIELD(yyact, yyn), atom(0));
yyssp -= yym;
yystate = *yyssp;
yyvsp -= yym;
yym = yylhs[yyn];
if (yystate == 0 && yym == 0)
{
yystate = YYFINAL;
*++yyssp = YYFINAL;
*++yyvsp = yyval;
if (yychar < 0)
{
if ((yychar = yylex()) < 0) yychar = 0;
}
if (yychar == 0) goto yyaccept;
goto yyloop;
}
if ((yyn = CINT(yygindex[yym])) && (yyn += yystate) >= 0 &&
yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == yystate)
yystate = CINT(yytable[yyn]);
else
yystate = CINT(yydgoto[yym]);
if (yyssp >= yyss + yystacksize - 1) grow_stacks();
*++yyssp = yystate;
*++yyvsp = yyval;
goto yyloop;
}