java: make yysyntaxErrorArguments a private detail

* data/skeletons/lalr1.java (yysyntaxErrorArguments): Move it from the
context, to the parser object.
Generate only for detailed and verbose error messages.
* tests/local.at (AT_YYERROR_DEFINE(java)): Use yyexpectedTokens
instead.
This commit is contained in:
Akim Demaille
2020-03-26 08:35:50 +01:00
parent ee56b6e0f2
commit b7045aa706
2 changed files with 59 additions and 49 deletions

View File

@@ -933,8 +933,11 @@ b4_dollar_popdef[]dnl
{ {
return ]b4_parser_class[.yysymbolName (yysymbol); return ]b4_parser_class[.yysymbolName (yysymbol);
} }
}
int yysyntaxErrorArguments (int[] yyarg, int yyargn) ]b4_parse_error_bmatch(
[detailed\|verbose], [[
private int yysyntaxErrorArguments (Context yyctx, int[] yyarg, int yyargn)
{ {
/* There are many possibilities here to consider: /* There are many possibilities here to consider:
- If this state is a consistent state with a default action, - If this state is a consistent state with a default action,
@@ -963,14 +966,14 @@ b4_dollar_popdef[]dnl
to an error action in a later state. to an error action in a later state.
*/ */
int yycount = 0; int yycount = 0;
if (this.yytoken != yyempty_) if (yyctx.getToken () != yyempty_)
{ {
yyarg[yycount++] = this.yytoken; yyarg[yycount++] = yyctx.getToken ();
yycount += this.yyexpectedTokens (yyarg, 1, yyargn); yycount += yyctx.yyexpectedTokens (yyarg, 1, yyargn);
} }
return yycount; return yycount;
} }
} ]])[
/** /**
* Report a syntax error. * Report a syntax error.
@@ -984,7 +987,7 @@ b4_dollar_popdef[]dnl
{ {
final int argmax = 5; final int argmax = 5;
int[] yyarg = new int[argmax]; int[] yyarg = new int[argmax];
int yycount = yyctx.yysyntaxErrorArguments (yyarg, argmax); int yycount = yysyntaxErrorArguments (yyctx, yyarg, argmax);
String[] yystr = new String[yycount]; String[] yystr = new String[yycount];
for (int yyi = 0; yyi < yycount; ++yyi) for (int yyi = 0; yyi < yycount; ++yyi)
yystr[yyi] = yysymbolName (yyarg[yyi]); yystr[yyi] = yysymbolName (yyarg[yyi]);

View File

@@ -972,17 +972,24 @@ m4_define([AT_YYERROR_DEFINE(java)],
]AT_ERROR_CUSTOM_IF([[ ]AT_ERROR_CUSTOM_IF([[
public void yyreportSyntaxError (Calc.Context ctx) public void yyreportSyntaxError (Calc.Context ctx)
{ {
int[] arg = new int[ctx.NTOKENS];
int n = ctx.yysyntaxErrorArguments (arg, ctx.NTOKENS);
System.err.print (]AT_LOCATION_IF([[ctx.getLocation () + ": "]] System.err.print (]AT_LOCATION_IF([[ctx.getLocation () + ": "]]
+ )["syntax error on token @<:@" + ctx.yysymbolName (arg[0]) + "@:>@"); + )["syntax error");
if (1 < n) {
int token = ctx.getToken ();
if (token != ctx.EMPTY)
System.err.print (" on token @<:@" + ctx.yysymbolName (token) + "@:>@");
}
{
int[] arg = new int[ctx.NTOKENS];
int n = ctx.yyexpectedTokens (arg, ctx.NTOKENS);
if (0 < n)
{ {
System.err.print (" (expected:"); System.err.print (" (expected:");
for (int i = 1; i < n; ++i) for (int i = 0; i < n; ++i)
System.err.print (" @<:@" + ctx.yysymbolName (arg[i]) + "@:>@"); System.err.print (" @<:@" + ctx.yysymbolName (arg[i]) + "@:>@");
System.err.print (")"); System.err.print (")");
} }
}
System.err.println (""); System.err.println ("");
} }
]]) ]])