Finer input type for yytranslate.

This patch is debatable: the tradition expects yylex to return an int
which happens to correspond to token_number (which is an enum).  This
allows for instance to return characters (such as '*' etc.).  But this
goes against the stronger typing I am trying to have with the new
lex interface which return a symbol_type.  So in this case, feed
yytranslate_ with a token_type.

	* data/lalr1.cc (yytranslate_): When in %define lex-symbol,
	expect a token_type.
This commit is contained in:
Akim Demaille
2008-08-28 10:32:14 +02:00
parent dd735e4ee6
commit 4654b0c0a8
2 changed files with 18 additions and 3 deletions

View File

@@ -1,3 +1,16 @@
2008-11-13 Akim Demaille <demaille@gostai.com>
Finer input type for yytranslate.
This patch is debatable: the tradition expects yylex to return an int
which happens to correspond to token_number (which is an enum). This
allows for instance to return characters (such as '*' etc.). But this
goes against the stronger typing I am trying to have with the new
lex interface which return a symbol_type. So in this case, feed
yytranslate_ with a token_type.
* data/lalr1.cc (yytranslate_): When in %define lex-symbol,
expect a token_type.
2008-11-13 Akim Demaille <demaille@gostai.com>
Honor lex-params in %define lex_symbol mode.

View File

@@ -635,7 +635,8 @@ m4_ifdef([b4_stype],
#endif
/// Convert a scanner token number \a t to a symbol number.
static inline token_number_type yytranslate_ (int t);
static inline token_number_type yytranslate_ (]b4_lex_symbol_if(
[token_type], [int])[ t);
/// A complete symbol, with its type.
template <typename Exact>
@@ -1587,7 +1588,8 @@ b4_error_verbose_if([int yystate, int yytoken],
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
]b4_parser_class_name[::token_number_type
]b4_parser_class_name[::yytranslate_ (int t)
]b4_parser_class_name[::yytranslate_ (]b4_lex_symbol_if([token_type],
[int])[ t)
{
static
const token_number_type
@@ -1598,7 +1600,7 @@ b4_error_verbose_if([int yystate, int yytoken],
const unsigned int user_token_number_max_ = ]b4_user_token_number_max[;
const token_number_type undef_token_ = ]b4_undef_token_number[;
if (t <= yyeof_)
if (static_cast<int>(t) <= yyeof_)
return yyeof_;
else if (static_cast<unsigned int> (t) <= user_token_number_max_)
return translate_table[t];