mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
all: fix the interface of yyexpected_tokens
The user gives yyexpected_tokens a limit: the max number of tokens she
wants to hear about. That's because an error message that reports a
bazillion of possible tokens is useless.
In that case yyexpected_tokens returned 0, so the user would not know
if there are too many expected tokens or none (yes, that's possible).
There are several ways to tell the user in which situation she's in:
- return some E2MANY, a negative value. Then it makes the pattern
int argsize = yypcontext_expected_tokens (ctx, arg, ARGS_MAX);
if (argsize < 0)
return argsize;
no longer valid, as for E2MANY (i) the user must generate the error
message anyway, and (ii) she should not return E2MANY
- return ARGS_MAX + 1. Then it makes it dangerous for the user, as
she has to iterate update `min (ARGS_MAX, argsize)`.
Returning 0 is definitely simpler and safer for the user, as it tells
her "this is not an error, just generate your message without a list
of expecting tokens". So let's still return 0, but set arg[0] to the
empty token when the list is really empty.
* data/skeletons/glr.c, data/skeletons/lalr1.cc, data/skeletons/lalr1.java
* data/skeletons/yacc.c (yyexpected_tokens): Put the empty symbol
first if there are no possible tokens at all.
* examples/c/bistromathic/parse.y: Demonstrate how to use that.
This commit is contained in:
committed by
Akim Demaille
parent
cb9f4cb543
commit
d9a9b054ae
@@ -7551,9 +7551,12 @@ Fill @var{argv} with the expected tokens, which never includes
|
||||
@code{YYSYMBOL_YYUNDEF}.
|
||||
|
||||
Never put more than @var{argc} elements into @var{argv}, and on success
|
||||
return the effective number of tokens stored in @var{argv}. Return 0 if
|
||||
there are more than @var{argc} expected tokens, yet fill @var{argv} up to
|
||||
@var{argc}. When LAC is enabled, may return a negative number on errors,
|
||||
return the number of tokens stored in @var{argv}. If there are more
|
||||
expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
|
||||
0. If there are no expected tokens, also return 0, but set @code{argv[0]}
|
||||
to @code{YYSYMBOL_YYEMPTY}.
|
||||
|
||||
When LAC is enabled, may return a negative number on errors,
|
||||
such as @code{YYENOMEM} on memory exhaustion.
|
||||
|
||||
If @var{argv} is null, return the size needed to store all the possible
|
||||
@@ -12137,9 +12140,10 @@ Fill @var{argv} with the expected tokens, which never includes
|
||||
@code{symbol_kind::S_YYUNDEF}.
|
||||
|
||||
Never put more than @var{argc} elements into @var{argv}, and on success
|
||||
return the effective number of tokens stored in @var{argv}. Return 0 if
|
||||
there are more than @var{argc} expected tokens, yet fill @var{argv} up to
|
||||
@var{argc}.
|
||||
return the number of tokens stored in @var{argv}. If there are more
|
||||
expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
|
||||
0. If there are no expected tokens, also return 0, but set @code{argv[0]}
|
||||
to @code{symbol_kind::S_YYEMPTY}.
|
||||
|
||||
If @var{argv} is null, return the size needed to store all the possible
|
||||
values, which is always less than @code{YYNTOKENS}.
|
||||
@@ -13298,9 +13302,10 @@ Fill @var{argv} with the expected tokens, which never includes
|
||||
@code{SymbolKind.S_YYERROR}, or @code{SymbolKind.S_YYUNDEF}.
|
||||
|
||||
Never put more than @var{argc} elements into @var{argv}, and on success
|
||||
return the effective number of tokens stored in @var{argv}. Return 0 if
|
||||
there are more than @var{argc} expected tokens, yet fill @var{argv} up to
|
||||
@var{argc}.
|
||||
return the number of tokens stored in @var{argv}. If there are more
|
||||
expected tokens than @var{argc}, fill @var{argv} up to @var{argc} and return
|
||||
0. If there are no expected tokens, also return 0, but set @code{argv[0]}
|
||||
to @code{null}.
|
||||
|
||||
If @var{argv} is null, return the size needed to store all the possible
|
||||
values, which is always less than @code{YYNTOKENS}.
|
||||
|
||||
Reference in New Issue
Block a user