mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
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:
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user