[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 4/7] examples: don't use yysyntax_error_arguments
From: |
Akim Demaille |
Subject: |
[PATCH 4/7] examples: don't use yysyntax_error_arguments |
Date: |
Sat, 21 Mar 2020 12:53:12 +0100 |
Suggested by Adrian Vogelsgesang.
https://lists.gnu.org/archive/html/bison-patches/2020-02/msg00069.html
* data/skeletons/lalr1.java (Context.EMPTY, Context.getToken): New.
(Context.yyntokens): Rename as...
(Context.NTOKENS): this.
Because (i) all the Java coding styles recommend upper case for
constants, and (ii) the Java Skeleton exposes Lexer.EOF, not
Lexer.YYEOF.
* data/skeletons/yacc.c (yyparse_context_token): New.
* examples/c/bistromathic/parse.y (yyreport_syntax_error): Don't use
yysyntax_error_arguments.
* examples/java/calc/Calc.y (yyreportSyntaxError): Likewise.
---
THANKS | 1 +
data/skeletons/lalr1.java | 22 ++++++++++++++++++++--
data/skeletons/yacc.c | 16 +++++++++++++++-
examples/c/bistromathic/parse.y | 30 +++++++++++++++++++-----------
examples/java/calc/Calc.y | 21 +++++++++++++--------
tests/local.at | 4 ++--
6 files changed, 70 insertions(+), 24 deletions(-)
diff --git a/THANKS b/THANKS
index d8ef2c0c..fbaf3237 100644
--- a/THANKS
+++ b/THANKS
@@ -4,6 +4,7 @@ it is today without the invaluable help of these people:
Aaro Koskinen address@hidden
Аскар Сафин address@hidden
Adam Sampson address@hidden
+Adrian Vogelsgesang address@hidden
Ahcheong Lee address@hidden
Airy Andre address@hidden
Akim Demaille address@hidden
diff --git a/data/skeletons/lalr1.java b/data/skeletons/lalr1.java
index 2bf17fd4..c5cbd1be 100644
--- a/data/skeletons/lalr1.java
+++ b/data/skeletons/lalr1.java
@@ -867,19 +867,37 @@ b4_dollar_popdef[]dnl
yytoken = token;]b4_locations_if([[
yylocation = loc;]])[
}
+
private YYStack yystack;
+
+ public int getToken ()
+ {
+ return yytoken;
+ }
+
+ /**
+ * Value returned by getToken when there is no token.
+ */
+ public static final int EMPTY = ]b4_parser_class[.yyempty_;
+
private int yytoken;]b4_locations_if([[
public ]b4_location_type[ getLocation ()
{
return yylocation;
}
+
private ]b4_location_type[ yylocation;]])[
- static final int yyntokens = ]b4_parser_class[.yyntokens_;
+ static final int NTOKENS = ]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). */
+ int yyexpectedTokens (int yyarg[], int yyargn)
+ {
+ return yyexpectedTokens (yyarg, 0, yyargn);
+ }
+
int yyexpectedTokens (int yyarg[], int yyoffset, int yyargn)
{
int yycount = yyoffset;
@@ -893,7 +911,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 < NTOKENS ? yychecklim : NTOKENS;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yy_error_token_
&& !yyTableValueIsError (yytable_[x + yyn]))
diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c
index 701dd30e..11898aa8 100644
--- a/data/skeletons/yacc.c
+++ b/data/skeletons/yacc.c
@@ -1198,6 +1198,10 @@ yyexpected_tokens (const yyparse_context_t *yyctx,
return yypstate_expected_tokens (yyctx->yyps, yyarg, yyargn);
}]])[
+static int
+yysyntax_error_arguments (const yyparse_context_t *yyctx,
+ int yyarg[], int yyargn) YY_ATTRIBUTE_UNUSED;
+
static int
yysyntax_error_arguments (const yyparse_context_t *yyctx,
int yyarg[], int yyargn)
@@ -1251,7 +1255,17 @@ yysyntax_error_arguments (const yyparse_context_t *yyctx,
]b4_parse_error_case(
[custom],
-[b4_locations_if([[/* The location of this context. */
+[[/* The token type of the lookahead of this context. */
+static int
+yyparse_context_token (const yyparse_context_t *yyctx) YY_ATTRIBUTE_UNUSED;
+
+static int
+yyparse_context_token (const yyparse_context_t *yyctx)
+{
+ return yyctx->yytoken;
+}
+
+]b4_locations_if([[/* The location of the lookahead of this context. */
static YYLTYPE *
yyparse_context_location (const yyparse_context_t *yyctx) YY_ATTRIBUTE_UNUSED;
diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y
index aa05e3bd..819313c9 100644
--- a/examples/c/bistromathic/parse.y
+++ b/examples/c/bistromathic/parse.y
@@ -284,20 +284,28 @@ yylex (const char **line, YYSTYPE *yylval, YYLTYPE
*yylloc)
int
yyreport_syntax_error (const yyparse_context_t *ctx)
{
- enum { ARGMAX = 10 };
- int arg[ARGMAX];
- int n = yysyntax_error_arguments (ctx, arg, ARGMAX);
- if (n < 0)
- return n;
+ int res = 0;
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]));
- if (n)
- fprintf (stderr, " before %s", yysymbol_name (arg[0]));
+ {
+ enum { TOKENMAX = 10 };
+ int expected[TOKENMAX];
+ int n = yyexpected_tokens (ctx, expected, TOKENMAX);
+ if (n < 0)
+ // Forward errors to yyparse.
+ res = n;
+ else
+ for (int i = 0; i < n; ++i)
+ fprintf (stderr, "%s %s",
+ i == 0 ? ": expected" : " or", yysymbol_name (expected[i]));
+ }
+ {
+ int lookahead = yyparse_context_token (ctx);
+ if (lookahead != YYEMPTY)
+ fprintf (stderr, " before %s", yysymbol_name (lookahead));
+ }
fprintf (stderr, "\n");
- return 0;
+ return res;
}
// Called by yyparse on error.
diff --git a/examples/java/calc/Calc.y b/examples/java/calc/Calc.y
index f634937d..4bb01c72 100644
--- a/examples/java/calc/Calc.y
+++ b/examples/java/calc/Calc.y
@@ -108,15 +108,20 @@ class CalcLexer implements Calc.Lexer {
public void yyreportSyntaxError (Calc.Context ctx)
{
- final int ARGMAX = 10;
- int[] arg = new int[ARGMAX];
- int n = ctx.yysyntaxErrorArguments (arg, ARGMAX);
System.err.print (ctx.getLocation () + ": syntax error");
- for (int i = 1; i < n; ++i)
- System.err.print ((i == 1 ? ": expected " : " or ")
- + ctx.yysymbolName (arg[i]));
- if (n != 0)
- System.err.print (" before " + ctx.yysymbolName (arg[0]));
+ {
+ final int TOKENMAX = 10;
+ int[] arg = new int[TOKENMAX];
+ int n = ctx.yyexpectedTokens (arg, TOKENMAX);
+ for (int i = 0; i < n; ++i)
+ System.err.print ((i == 0 ? ": expected " : " or ")
+ + ctx.yysymbolName (arg[i]));
+ }
+ {
+ int lookahead = ctx.getToken ();
+ if (lookahead != ctx.EMPTY)
+ System.err.print (" before " + ctx.yysymbolName (lookahead));
+ }
System.err.println ("");
}
diff --git a/tests/local.at b/tests/local.at
index 3ba84d0e..25f08462 100644
--- a/tests/local.at
+++ b/tests/local.at
@@ -964,8 +964,8 @@ m4_define([AT_YYERROR_DEFINE(java)],
]AT_ERROR_CUSTOM_IF([[
public void yyreportSyntaxError (Calc.Context ctx)
{
- int[] arg = new int[ctx.yyntokens];
- int n = ctx.yysyntaxErrorArguments (arg, ctx.yyntokens);
+ int[] arg = new int[ctx.NTOKENS];
+ int n = ctx.yysyntaxErrorArguments (arg, ctx.NTOKENS);
System.err.print (]AT_LOCATION_IF([[ctx.getLocation () + ": "]]
+ )["syntax error on token @<:@" + ctx.yysymbolName
(arg[0]) + "@:>@");
if (1 < n)
--
2.25.1
- [PATCH 0/7] Deprecate yysyntax_error_arguments, Akim Demaille, 2020/03/21
- [PATCH 1/7] doc: c++: promote api.token.raw, Akim Demaille, 2020/03/21
- [PATCH 2/7] style: reduce length of private constant, Akim Demaille, 2020/03/21
- [PATCH 5/7] tests: yacc.c: avoid yysyntax_error_arguments, Akim Demaille, 2020/03/21
- [PATCH 3/7] yacc.c: use negative numbers for errors in auxiliary functions, Akim Demaille, 2020/03/21
- [PATCH 4/7] examples: don't use yysyntax_error_arguments,
Akim Demaille <=
- [PATCH 7/7] lalr1.cc: avoid using yysyntax_error_arguments, Akim Demaille, 2020/03/21
- [PATCH 6/7] bison: avoid using yysyntax_error_arguments, Akim Demaille, 2020/03/21
- Re: [PATCH 0/7] Deprecate yysyntax_error_arguments, Akim Demaille, 2020/03/26