java: add support for parse.error custom

* data/skeletons/lalr1.java: Add support for custom parse errors.
(yyntokens_): Make it public.  Under...
(yyntokens): this name.
(Context): Capture the location too.
* examples/c/bistromathic/parse.y,
* examples/c/bistromathic/bistromathic.test:
Improve error message.
* examples/java/calc/Calc.test, examples/java/calc/Calc.y: Use custom
error messages.
* tests/calc.at, tests/local.at: Check custom error messages.
This commit is contained in:
Akim Demaille
2020-02-08 14:19:03 +01:00
parent 0c90c59795
commit ef097719ea
8 changed files with 95 additions and 29 deletions

View File

@@ -45,9 +45,9 @@ run 0 '0.16
cat >input <<EOF
*
EOF
run 0 "err: 1.1: syntax error expected end of file or - or ( or end of line or double precision number or function or variable before *"
run 0 "err: 1.1: syntax error: expected end of file or - or ( or end of line or double precision number or function or variable before *"
cat >input <<EOF
1 + 2 * * 3
EOF
run 0 "err: 1.9: syntax error expected - or ( or double precision number or function or variable before *"
run 0 "err: 1.9: syntax error: expected - or ( or double precision number or function or variable before *"

View File

@@ -200,8 +200,8 @@ yyreport_syntax_error (const yyparse_context_t *ctx)
YY_LOCATION_PRINT (stderr, *yyparse_context_location (ctx));
fprintf (stderr, ": syntax error");
for (int i = 1; i < n; ++i)
fprintf (stderr, " %s %s",
i == 1 ? "expected" : "or", yysymbol_name (arg[i]));
fprintf (stderr, "%s %s",
i == 1 ? ": expected" : " or", yysymbol_name (arg[i]));
if (n)
fprintf (stderr, " before %s", yysymbol_name (arg[0]));
fprintf (stderr, "\n");

View File

@@ -30,9 +30,9 @@ run 0 '7
cat >input <<EOF
1 + 2 * * 3
EOF
run 0 "err: 1.9-1.10: syntax error, unexpected '*', expecting number or '-' or '(' or '!'"
run 0 "err: 1.9-1.10: syntax error: expected number or '-' or '(' or '!' before '*'"
cat >input <<EOF
12 222
EOF
run 0 "err: 1.6-1.9: syntax error, unexpected number"
run 0 "err: 1.6-1.9: syntax error: expected end of line or '=' or '-' or '+' or '*' or '/' or '^' before number"

View File

@@ -3,7 +3,7 @@
%define api.parser.class {Calc}
%define api.parser.public
%define parse.error detailed
%define parse.error custom
%define parse.trace
%locations
@@ -29,10 +29,17 @@
if (!p.parse ())
System.exit (1);
}
static String _ (String s)
{
return s;
}
}
/* Bison Declarations */
%token <Integer> NUM "number"
%token
'\n' _("end of line")
<Integer> NUM _("number")
%type <Integer> exp
%nonassoc '=' /* comparison */
@@ -73,7 +80,6 @@ exp:
| '-' error { $$ = 0; return YYERROR; }
;
%%
class CalcLexer implements Calc.Lexer {
@@ -100,6 +106,20 @@ class CalcLexer implements Calc.Lexer {
return end;
}
public void yyreportSyntaxError (Calc.Context ctx)
{
final int ARGMAX = 10;
int[] arg = new int[ARGMAX];
int n = Calc.yysyntaxErrorArguments (ctx, 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]));
if (n != 0)
System.err.print (" before " + Calc.yysymbolName (arg[0]));
System.err.println ("");
}
public void yyerror (Calc.Location l, String s)
{
if (l == null)