summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2020-02-08 14:19:03 +0100
committerAkim Demaille <akim.demaille@gmail.com>2020-02-08 16:03:50 +0100
commitef097719eaf5ca80c18c101f21d57741f8178be9 (patch)
tree46fcf499033b8fbae1456d94c4716aee5ca661a1 /examples
parent0c90c597950759573ec08fd6669425bd41083e5e (diff)
downloadbison-ef097719eaf5ca80c18c101f21d57741f8178be9.tar.gz
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.
Diffstat (limited to 'examples')
-rwxr-xr-xexamples/c/bistromathic/bistromathic.test4
-rw-r--r--examples/c/bistromathic/parse.y4
-rw-r--r--examples/java/calc/Calc.test4
-rw-r--r--examples/java/calc/Calc.y26
4 files changed, 29 insertions, 9 deletions
diff --git a/examples/c/bistromathic/bistromathic.test b/examples/c/bistromathic/bistromathic.test
index 89ebcb40..116c7575 100755
--- a/examples/c/bistromathic/bistromathic.test
+++ b/examples/c/bistromathic/bistromathic.test
@@ -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 *"
diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y
index cac38f32..1fa9c081 100644
--- a/examples/c/bistromathic/parse.y
+++ b/examples/c/bistromathic/parse.y
@@ -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");
diff --git a/examples/java/calc/Calc.test b/examples/java/calc/Calc.test
index 8664e314..7d96015a 100644
--- a/examples/java/calc/Calc.test
+++ b/examples/java/calc/Calc.test
@@ -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"
diff --git a/examples/java/calc/Calc.y b/examples/java/calc/Calc.y
index 2ae09bad..bc832aba 100644
--- a/examples/java/calc/Calc.y
+++ b/examples/java/calc/Calc.y
@@ -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)