java: provide Context with a more OO interface

* data/skeletons/lalr1.java (yyexpectedTokens)
(yysyntaxErrorArguments): Make them methods of Context.
(Context.yysymbolName): New.
* tests/local.at: Adjust.
This commit is contained in:
Akim Demaille
2020-02-08 15:36:18 +01:00
parent ef097719ea
commit 80a4389377
4 changed files with 90 additions and 79 deletions

8
TODO
View File

@@ -18,6 +18,14 @@ We should be able to redefine EOF like we do in C.
** Java: calc.at
Stop hard-coding "Calc". Adjust local.at (look for FIXME).
** Java: _
We must not use _ in Java, it is becoming a keyword in Java 9.
examples/java/calc/Calc.java:998: warning: '_' used as an identifier
"$end", "error", "$undefined", _("end of line"), _("number"), "'='",
^
(use of '_' as an identifier might not be supported in releases after Java SE 8)
** doc
I feel it's ugly to use the GNU style to declare functions in the doc. It
generates tons of white space in the page, and may contribute to bad page

View File

@@ -866,18 +866,15 @@ b4_dollar_popdef[]dnl
public int yytoken;]b4_locations_if([[
public ]b4_location_type[ yylocation;]])[
public static final int yyntokens = ]b4_parser_class[.yyntokens_;
};
/* Put in YYARG at most YYARGN of the expected tokens given the
current YYCTX, and return the number of tokens stored in YYARG. If
YYARG is null, return the number of expected tokens (guaranteed to
be less than YYNTOKENS_). */
static int
yyexpectedTokens (Context yyctx,
int yyarg[], int yyoffset, int yyargn)
be less than YYNTOKENS). */
int yyexpectedTokens (int yyarg[], int yyoffset, int yyargn)
{
int yycount = yyoffset;
int yyn = yypact_[yyctx.yystack.stateAt (0)];
int yyn = yypact_[this.yystack.stateAt (0)];
if (!yyPactValueIsDefault (yyn))
{
/* Start YYX at -YYN if negative to avoid negative
@@ -887,7 +884,7 @@ b4_dollar_popdef[]dnl
int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */
int yychecklim = yylast_ - yyn + 1;
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
int yyxend = yychecklim < yyntokens ? yychecklim : yyntokens;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yy_error_token_
&& !yyTableValueIsError (yytable_[x + yyn]))
@@ -903,9 +900,14 @@ b4_dollar_popdef[]dnl
return yycount - yyoffset;
}
static int
yysyntaxErrorArguments (Context yyctx,
int[] yyarg, int yyargn)
/* The user-facing name of the symbol whose (internal) number is
YYSYMBOL. No bounds checking. */
static String yysymbolName (int yysymbol)
{
return ]b4_parser_class[.yysymbolName (yysymbol);
}
int yysyntaxErrorArguments (int[] yyarg, int yyargn)
{
/* There are many possibilities here to consider:
- If this state is a consistent state with a default action,
@@ -934,13 +936,14 @@ b4_dollar_popdef[]dnl
to an error action in a later state.
*/
int yycount = 0;
if (yyctx.yytoken != yyempty_)
if (this.yytoken != yyempty_)
{
yyarg[yycount++] = yyctx.yytoken;
yycount += yyexpectedTokens (yyctx, yyarg, 1, yyargn);
yyarg[yycount++] = this.yytoken;
yycount += this.yyexpectedTokens (yyarg, 1, yyargn);
}
return yycount;
}
}
/**
* Report a syntax error.
@@ -954,7 +957,7 @@ b4_dollar_popdef[]dnl
{
final int argmax = 5;
int[] yyarg = new int[argmax];
int yycount = yysyntaxErrorArguments (yyctx, yyarg, argmax);
int yycount = yyctx.yysyntaxErrorArguments (yyarg, argmax);
String[] yystr = new String[yycount];
for (int yyi = 0; yyi < yycount; ++yyi)
yystr[yyi] = yysymbolName (yyarg[yyi]);

View File

@@ -110,13 +110,13 @@ class CalcLexer implements Calc.Lexer {
{
final int ARGMAX = 10;
int[] arg = new int[ARGMAX];
int n = Calc.yysyntaxErrorArguments (ctx, arg, ARGMAX);
int n = ctx.yysyntaxErrorArguments (arg, ARGMAX);
System.err.print (ctx.yylocation + ": syntax error");
for (int i = 1; i < n; ++i)
System.err.print ((i == 1 ? ": expected " : " or ")
+ Calc.yysymbolName (arg[i]));
+ ctx.yysymbolName (arg[i]));
if (n != 0)
System.err.print (" before " + Calc.yysymbolName (arg[0]));
System.err.print (" before " + ctx.yysymbolName (arg[0]));
System.err.println ("");
}

View File

@@ -934,14 +934,14 @@ m4_define([AT_YYERROR_DEFINE(java)],
public void yyreportSyntaxError (Calc.Context ctx)
{
int[] arg = new int[ctx.yyntokens];
int n = Calc.yysyntaxErrorArguments (ctx, arg, ctx.yyntokens);
int n = ctx.yysyntaxErrorArguments (arg, ctx.yyntokens);
System.err.print (]AT_LOCATION_IF([[ctx.yylocation + ": "]]
+ )["syntax error on token @<:@" + Calc.yysymbolName(arg[0]) + "@:>@");
+ )["syntax error on token @<:@" + ctx.yysymbolName (arg[0]) + "@:>@");
if (1 < n)
{
System.err.print (" (expected:");
for (int i = 1; i < n; ++i)
System.err.print (" @<:@" + Calc.yysymbolName (arg[i]) + "@:>@");
System.err.print (" @<:@" + ctx.yysymbolName (arg[i]) + "@:>@");
System.err.print (")");
}
System.err.println ("");