mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-22 02:33:03 +00:00
glr2.cc: introduce the yytranslate_ member function
* data/skeletons/c++.m4 (b4_yytranslate_define): Use static_cast rather than the YY_CAST macro. Avoids the need to define YY_CAST in the header. * data/skeletons/glr2.cc: Fix calls to b4_shared_declarations: pass the type of file we are in. Don't define YYTRANSLATE. (parser::yytranslate_): New, as in lalr1.cc. Adjust to use it. * tests/glr-regression.at: Adjust.
This commit is contained in:
@@ -602,7 +602,7 @@ m4_define([b4_yytranslate_define],
|
|||||||
if (t <= 0)
|
if (t <= 0)
|
||||||
return symbol_kind::]b4_symbol_prefix[YYEOF;
|
return symbol_kind::]b4_symbol_prefix[YYEOF;
|
||||||
else if (t <= code_max)
|
else if (t <= code_max)
|
||||||
return YY_CAST (symbol_kind_type, translate_table[t]);
|
return static_cast <symbol_kind_type> (translate_table[t]);
|
||||||
else
|
else
|
||||||
return symbol_kind::]b4_symbol_prefix[YYUNDEF;]])[
|
return symbol_kind::]b4_symbol_prefix[YYUNDEF;]])[
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -354,6 +354,11 @@ const std::ptrdiff_t strong_index_alias<T>::INVALID_INDEX =
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
public: // FIXME: Private
|
public: // FIXME: Private
|
||||||
|
/// Convert a scanner token kind \a t to a symbol kind.
|
||||||
|
/// 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(
|
]b4_parse_error_bmatch(
|
||||||
[simple],
|
[simple],
|
||||||
[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
|
[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[
|
||||||
@@ -404,7 +409,7 @@ const std::ptrdiff_t strong_index_alias<T>::INVALID_INDEX =
|
|||||||
|
|
||||||
]b4_disclaimer[
|
]b4_disclaimer[
|
||||||
]b4_cpp_guard_open([b4_spec_mapped_header_file])[
|
]b4_cpp_guard_open([b4_spec_mapped_header_file])[
|
||||||
]b4_shared_declarations[
|
]b4_shared_declarations([hh])[
|
||||||
]b4_cpp_guard_close([b4_spec_mapped_header_file])[
|
]b4_cpp_guard_close([b4_spec_mapped_header_file])[
|
||||||
]b4_output_end])[
|
]b4_output_end])[
|
||||||
|
|
||||||
@@ -434,7 +439,7 @@ const std::ptrdiff_t strong_index_alias<T>::INVALID_INDEX =
|
|||||||
]b4_null_define[
|
]b4_null_define[
|
||||||
|
|
||||||
]b4_header_if([[#include "@basename(]b4_spec_header_file[@)"]],
|
]b4_header_if([[#include "@basename(]b4_spec_header_file[@)"]],
|
||||||
[b4_shared_declarations])[
|
[b4_shared_declarations([cc])])[
|
||||||
|
|
||||||
typedef ]b4_namespace_ref[::]b4_parser_class[::symbol_kind_type yysymbol_kind_t;
|
typedef ]b4_namespace_ref[::]b4_parser_class[::symbol_kind_type yysymbol_kind_t;
|
||||||
|
|
||||||
@@ -529,22 +534,6 @@ static ]b4_namespace_ref[::]b4_parser_class[::location_type yyloc_default][]b4_y
|
|||||||
accessed by $0, $-1, etc., in any rule. */
|
accessed by $0, $-1, etc., in any rule. */
|
||||||
#define YYMAXLEFT ]b4_max_left_semantic_context[
|
#define YYMAXLEFT ]b4_max_left_semantic_context[
|
||||||
|
|
||||||
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
|
|
||||||
as returned by yylex, with out-of-bounds checking. */
|
|
||||||
]b4_api_token_raw_if(dnl
|
|
||||||
[[#define YYTRANSLATE(YYX) static_cast<yysymbol_kind_t>(YYX)]],
|
|
||||||
[[#define YYTRANSLATE(YYX) \
|
|
||||||
(0 <= (YYX) && (YYX) <= ]b4_code_max[ \
|
|
||||||
? static_cast<yysymbol_kind_t>(yytranslate[YYX]) \
|
|
||||||
: ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol(empty, kind)[)
|
|
||||||
|
|
||||||
/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
|
|
||||||
as returned by yylex. */
|
|
||||||
static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
|
|
||||||
{
|
|
||||||
]b4_translate[
|
|
||||||
};]])[
|
|
||||||
|
|
||||||
#if ]b4_api_PREFIX[DEBUG
|
#if ]b4_api_PREFIX[DEBUG
|
||||||
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
||||||
static const ]b4_int_type_for([b4_rline])[ yyrline[] =
|
static const ]b4_int_type_for([b4_rline])[ yyrline[] =
|
||||||
@@ -2936,9 +2925,7 @@ yygetToken (]b4_namespace_ref[::]b4_parser_class[& yyparser, glr_stack& yystack]
|
|||||||
}
|
}
|
||||||
#endif // YY_EXCEPTIONS
|
#endif // YY_EXCEPTIONS
|
||||||
yystack.yytoken
|
yystack.yytoken
|
||||||
= (yychar <= ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(eof, id)[)
|
= ]b4_namespace_ref[::]b4_parser_class[::yytranslate_ (yychar);
|
||||||
? ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol(eof, kind)[
|
|
||||||
: YYTRANSLATE (yychar);
|
|
||||||
}
|
}
|
||||||
if (yystack.yytoken == ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol(eof, kind)[)
|
if (yystack.yytoken == ]b4_namespace_ref[::]b4_parser_class[::]b4_symbol(eof, kind)[)
|
||||||
YYCDEBUG << "Now at end of input.\n";
|
YYCDEBUG << "Now at end of input.\n";
|
||||||
@@ -3433,8 +3420,9 @@ b4_dollar_popdef])[]dnl
|
|||||||
// Actually, it is yydebug which is really used.
|
// Actually, it is yydebug which is really used.
|
||||||
yydebug = l;
|
yydebug = l;
|
||||||
}
|
}
|
||||||
|
#endif // ]b4_api_PREFIX[DEBUG
|
||||||
|
|
||||||
#endif
|
]b4_token_ctor_if([], [b4_yytranslate_define([cc])])[
|
||||||
]m4_popdef([b4_parse_param])dnl
|
]m4_popdef([b4_parse_param])dnl
|
||||||
b4_namespace_close[]dnl
|
b4_namespace_close[]dnl
|
||||||
b4_epilogue[]dnl
|
b4_epilogue[]dnl
|
||||||
|
|||||||
@@ -69,11 +69,22 @@ print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
|
|||||||
]])[
|
]])[
|
||||||
{
|
{
|
||||||
]AT_GLR2_CC_IF([[
|
]AT_GLR2_CC_IF([[
|
||||||
|
// We use -2 and 0 to avoid this warning:
|
||||||
|
//
|
||||||
|
// glr-regr13.y:114:53: error: enumeral and non-enumeral type in conditional expression [-Werror=extra]
|
||||||
|
// 114 | : yytoken == yy::parser::symbol_kind::S_YYEOF ? yy::parser::token::YYEOF
|
||||||
|
// | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// 115 | : yytoken == yy::parser::yytranslate_ ('a') ? 'a'
|
||||||
|
// | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// 116 | : yytoken == yy::parser::yytranslate_ ('b') ? 'b'
|
||||||
|
// | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// 117 | : '?';
|
||||||
|
// | ~~~~~
|
||||||
int yychr
|
int yychr
|
||||||
= yytoken == YYTRANSLATE (]AT_TOKEN([YYEMPTY])[) ? -2
|
= yytoken == yy::parser::symbol_kind::S_YYEMPTY ? -2
|
||||||
: yytoken == YYTRANSLATE (]AT_TOKEN([YYEOF])[) ? 0
|
: yytoken == yy::parser::symbol_kind::S_YYEOF ? 0
|
||||||
: yytoken == YYTRANSLATE ('a') ? 'a'
|
: yytoken == yy::parser::yytranslate_ ('a') ? 'a'
|
||||||
: yytoken == YYTRANSLATE ('b') ? 'b'
|
: yytoken == yy::parser::yytranslate_ ('b') ? 'b'
|
||||||
: '?';
|
: '?';
|
||||||
]])[
|
]])[
|
||||||
printf ("%s:\n yychar=", reduction);
|
printf ("%s:\n yychar=", reduction);
|
||||||
@@ -1383,7 +1394,7 @@ nondefstate:
|
|||||||
change_lookahead:
|
change_lookahead:
|
||||||
%empty
|
%empty
|
||||||
{
|
{
|
||||||
]AT_GLR2_CC_IF([[yytoken = YYTRANSLATE ('a')]], [[yychar = 'a']])[;
|
]AT_GLR2_CC_IF([[yytoken = yy::parser::yytranslate_ ('a')]], [[yychar = 'a']])[;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -1564,7 +1575,7 @@ alt1:
|
|||||||
{
|
{
|
||||||
USE ($][1);
|
USE ($][1);
|
||||||
if (]AT_GLR2_CC_IF(
|
if (]AT_GLR2_CC_IF(
|
||||||
[[yytoken != YYTRANSLATE('d') && yytoken != symbol_kind::S_YYEOF]],
|
[[yytoken != yy::parser::yytranslate_ ('d') && yytoken != symbol_kind::S_YYEOF]],
|
||||||
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
|
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
|
||||||
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
|
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
|
||||||
}
|
}
|
||||||
@@ -1575,7 +1586,7 @@ alt2:
|
|||||||
{
|
{
|
||||||
USE ($][1);
|
USE ($][1);
|
||||||
if (]AT_GLR2_CC_IF(
|
if (]AT_GLR2_CC_IF(
|
||||||
[[yytoken != YYTRANSLATE('d') && yytoken != symbol_kind::S_YYEOF]],
|
[[yytoken != yy::parser::yytranslate_ ('d') && yytoken != symbol_kind::S_YYEOF]],
|
||||||
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
|
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
|
||||||
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
|
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
|
||||||
}
|
}
|
||||||
@@ -1586,7 +1597,7 @@ alt3:
|
|||||||
{
|
{
|
||||||
USE ($][1);
|
USE ($][1);
|
||||||
if (]AT_GLR2_CC_IF(
|
if (]AT_GLR2_CC_IF(
|
||||||
[[yytoken != YYTRANSLATE('d') && yytoken != symbol_kind::S_YYEOF]],
|
[[yytoken != yy::parser::yytranslate_ ('d') && yytoken != symbol_kind::S_YYEOF]],
|
||||||
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
|
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([token::])[YYEOF]])[)
|
||||||
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
|
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user