summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2020-04-26 09:17:32 +0200
committerAkim Demaille <akim.demaille@gmail.com>2020-04-26 15:09:52 +0200
commit7fec669e42df1d81c41a2f40664ef9e2437b72d0 (patch)
tree9725d8e2ef60c402247c6d69ce9c3b3f3a4100fc
parentcbbbe12e023a34352881fa7f0d597c7b2342eaad (diff)
downloadbison-7fec669e42df1d81c41a2f40664ef9e2437b72d0.tar.gz
c++: always define symbol_name
* data/skeletons/lalr1.cc (symbol_name): Always define it, even when it's actually yytname which is used.
-rw-r--r--data/skeletons/lalr1.cc84
-rw-r--r--doc/bison.texi4
2 files changed, 56 insertions, 32 deletions
diff --git a/data/skeletons/lalr1.cc b/data/skeletons/lalr1.cc
index a44090af..a7c5d684 100644
--- a/data/skeletons/lalr1.cc
+++ b/data/skeletons/lalr1.cc
@@ -305,27 +305,36 @@ m4_define([b4_shared_declarations],
/// In theory \a t should be a token_kind_type, but character literals
/// are valid, yet not members of the token_type enum.
static symbol_kind_type yytranslate_ (int t);
-]b4_parse_error_bmatch([custom\|detailed], [[
- /// The user-facing name of the symbol whose (internal) number is
- /// YYSYMBOL. No bounds checking.
- static const char *symbol_name (symbol_kind_type yysymbol);
-]])[
- // Tables.
-]b4_parser_tables_declare[
-]b4_parse_error_case([verbose], [[
- /// Convert the symbol name \a n to a form suitable for a diagnostic.
- static std::string yytnamerr_ (const char *n);
+]b4_parse_error_bmatch(
+[custom\|detailed],
+[[ /// The user-facing name of the symbol whose (internal) number is
+ /// YYSYMBOL. No bounds checking.
+ static const char *symbol_name (symbol_kind_type yysymbol);]],
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+ /// The user-facing name of the symbol whose (internal) number is
+ /// YYSYMBOL. No bounds checking.
+ static const char *symbol_name (symbol_kind_type yysymbol);
/// For a symbol, its name in clear.
static const char* const yytname_[];
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
]],
-[b4_token_table_if([], [[
-#if ]b4_api_PREFIX[DEBUG
+[verbose],
+[[ /// The user-facing name of the symbol whose (internal) number is
+ /// YYSYMBOL. No bounds checking.
+ static std::string symbol_name (symbol_kind_type yysymbol);
+
+ /// Convert the symbol name \a n to a form suitable for a diagnostic.
+ static std::string yytnamerr_ (const char *yystr);
+
/// For a symbol, its name in clear.
static const char* const yytname_[];
-#endif
-]])])[
+]])[
+
+ // Tables.
+]b4_parser_tables_declare[
#if ]b4_api_PREFIX[DEBUG
]b4_integral_parser_table_declare([rline], [b4_rline],
@@ -587,16 +596,15 @@ m4_if(b4_prefix, [yy], [],
#define YYERROR goto yyerrorlab
#define YYRECOVERING() (!!yyerrstatus_)
-]b4_namespace_open[]b4_parse_error_bmatch([custom\|detailed], [[
- /* The user-facing name of the symbol whose (internal) number is
- YYSYMBOL. No bounds checking. */
- const char *
+]b4_namespace_open[
+]b4_parse_error_bmatch([custom\|detailed],
+[[ const char *
]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
{
static const char *const yy_sname[] =
{
]b4_symbol_names[
- };]m4_ifdef([b4_translatable], [[
+ };]b4_has_translations_if([[
/* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
internationalizable. */
static ]b4_int_type_for([b4_translatable])[ yytranslatable[] =
@@ -608,10 +616,18 @@ m4_if(b4_prefix, [yy], [],
: yy_sname[yysymbol]);]], [[
return yy_sname[yysymbol];]])[
}
-]])
-b4_parse_error_case([verbose], [[
-
- /* Return YYSTR after stripping away unnecessary quotes and
+]],
+[simple],
+[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+ const char *
+ ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+ {
+ return yytname_[yysymbol];
+ }
+#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
+]],
+[verbose],
+[[ /* Return YYSTR after stripping away unnecessary quotes and
backslashes, so that it's suitable for yyerror. The heuristic is
that double-quoting is unnecessary unless the string contains an
apostrophe, a comma, or backslash (other than backslash-backslash).
@@ -650,6 +666,12 @@ b4_parse_error_case([verbose], [[
return yystr;
}
+
+ std::string
+ ]b4_parser_class[::symbol_name (symbol_kind_type yysymbol)
+ {
+ return yytnamerr_ (yytname_[yysymbol]);
+ }
]])[
/// Build a parser object.
@@ -786,7 +808,7 @@ b4_parse_error_case([verbose], [[
std::abort ();
#endif
yyo << (yykind < YYNTOKENS ? "token" : "nterm")
- << ' ' << yytname_[yykind] << " ("]b4_locations_if([
+ << ' ' << symbol_name (yykind) << " ("]b4_locations_if([
<< yysym.location << ": "])[;
]b4_symbol_actions([printer])[
yyo << ')';
@@ -1298,7 +1320,7 @@ b4_dollar_popdef])[]dnl
yylac_stack_.clear ();
// Reduce until we encounter a shift and thereby accept the token.
#if ]b4_api_PREFIX[DEBUG
- YYCDEBUG << "LAC: checking lookahead " << yytname_[yytoken] << ':';
+ YYCDEBUG << "LAC: checking lookahead " << symbol_name (yytoken) << ':';
#endif
std::ptrdiff_t lac_top = 0;
while (true)
@@ -1398,7 +1420,7 @@ b4_dollar_popdef])[]dnl
{
#if ]b4_api_PREFIX[DEBUG
YYCDEBUG << "LAC: initial context established for "
- << yytname_[yytoken] << '\n';
+ << symbol_name (yytoken) << '\n';
#endif
yy_lac_established_ = true;
return yy_lac_check_ (yytoken);
@@ -1507,9 +1529,7 @@ b4_dollar_popdef])[]dnl
for (char const* yyp = yyformat; *yyp; ++yyp)
if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
{
- yyres += ]b4_parse_error_case([verbose],
- [[yytnamerr_ (yytname_[yyarg[yyi++]])]],
- [[symbol_name (yyarg[yyi++])]])[;
+ yyres += symbol_name (yyarg[yyi++]);
++yyp;
}
else
@@ -1524,7 +1544,8 @@ b4_dollar_popdef])[]dnl
]b4_parser_tables_define[
-]b4_tname_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
+]b4_parse_error_bmatch([simple\|verbose],
+[[#if ]b4_api_PREFIX[DEBUG]b4_tname_if([[ || 1]])[
// YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
// First, the terminals, then, starting at \a YYNTOKENS, nonterminals.
const char*
@@ -1532,7 +1553,8 @@ b4_dollar_popdef])[]dnl
{
]b4_tname[
};
-]b4_tname_if([], [[#endif]])[
+#endif
+]])[
#if ]b4_api_PREFIX[DEBUG][
]b4_integral_parser_table_define([rline], [b4_rline])[
diff --git a/doc/bison.texi b/doc/bison.texi
index 7fae3b36..84186b72 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -7510,8 +7510,10 @@ If @var{argv} is null, return the size needed to store all the possible
values, which is always less than @code{YYNTOKENS}.
@end deftypefun
-@deftypefun {const char *} yysymbol_name (@code{symbol_kind_t} @var{symbol})
+@deftypefun {@r{string type}} yysymbol_name (@code{symbol_kind_t} @var{symbol})
The name of the symbol whose kind is @var{symbol}, possibly translated.
+Depending on the options, may return a @code{const char*} or a
+@code{std::string}.
@end deftypefun
A custom syntax error function looks as follows. This implementation is