# C++ skeleton for Bison
-# Copyright (C) 2002-2012 Free Software Foundation, Inc.
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
# --------------------------------------------------------------
-# Declare "parser::yy<TABLE-NAME>_" which contents is CONTENT.
+# Declare "parser::yy<TABLE-NAME>_" whose contents is CONTENT.
m4_define([b4_integral_parser_table_declare],
[m4_ifval([$3], [b4_comment([$3], [ ])
])dnl
# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
# -------------------------------------------------------------
-# Define "parser::yy<TABLE-NAME>_" which contents is CONTENT.
+# Define "parser::yy<TABLE-NAME>_" whose contents is CONTENT.
m4_define([b4_integral_parser_table_define],
[ const b4_int_type_for([$2])
b4_parser_class_name::yy$1_[[]] =
])])
+# b4_lex
+# ------
+# Call yylex.
+m4_define([b4_lex],
+[b4_token_ctor_if(
+[b4_function_call([yylex],
+ [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))],
+[b4_function_call([yylex], [int],
+ [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
+b4_locations_if([, [[location*], [&yyla.location]]])dnl
+m4_ifdef([b4_lex_param], [, ]b4_lex_param))])])
+
+
m4_pushdef([b4_copyright_years],
- [2002-2012])
+ [2002-2013])
m4_define([b4_parser_class_name],
[b4_percent_define_get([[parser_class_name]])])
m4_define([b4_shared_declarations],
[b4_percent_code_get([[requires]])[
]b4_parse_assert_if([# include <cassert>])[
-# include <deque>
+# include <vector>
# include <iostream>
# include <stdexcept>
# include <string>]b4_defines_if([[
# include "stack.hh"
]b4_bison_locations_if([[# include "location.hh"]])])[
+]b4_variant_if([b4_variant_includes])[
]b4_YYDEBUG_define[
/// Generate an error message.
/// \param yystate the state where the error occurred.
- /// \param yytoken the lookahead token.
- virtual std::string yysyntax_error_ (state_type yystate, int yytoken);
+ /// \param yytoken the lookahead token type, or yyempty_.
+ virtual std::string yysyntax_error_ (state_type yystate,
+ symbol_number_type yytoken) const;
/// Compute post-reduction state.
/// \param yystate the current state
/// \param yyvalue the value to check
static bool yy_table_value_is_error_ (int yyvalue);
- /// Internal symbol numbers.
- typedef ]b4_int_type_for([b4_translate])[ token_number_type;
static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
+ /// Convert a scanner token number \a t to a symbol number.
+ static token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t);
+
// Tables.
]b4_parser_tables_declare[]b4_error_verbose_if([
static const char* const yytname_[];
]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
]b4_integral_parser_table_declare([rline], [b4_rline],
- [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
+ [[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
/// Report on the debug stream that the rule \a r is going to be reduced.
virtual void yy_reduce_print_ (int r);
/// Print the state stack on the debug stream.
// Debugging.
int yydebug_;
std::ostream* yycdebug_;
-#endif // ]b4_api_PREFIX[DEBUG
-
- /// Convert a scanner token number \a t to a symbol number.
- static inline token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t);
-#if ]b4_api_PREFIX[DEBUG
/// \brief Display a symbol type, value and location.
/// \param yyo The output stream.
/// \param yysym The symbol.
- template <typename Exact>
- void yy_print_ (std::ostream& yyo,
- const symbol_base_type<Exact>& yysym) const;
+ template <typename Base>
+ void yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const;
#endif
/// \brief Reclaim the memory associated to a symbol.
/// \param yymsg Why this token is reclaimed.
/// If null, print nothing.
/// \param s The symbol.
- template <typename Exact>
- inline void yy_destroy_ (const char* yymsg,
- symbol_base_type<Exact>& yysym) const;
+ template <typename Base>
+ void yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const;
private:
- /// Element of the stack: a state and its attributes.
- struct stack_symbol_type : symbol_base_type<stack_symbol_type>
+ /// Type access provider for state based symbols.
+ struct by_state
{
- /// The parent class.
- typedef symbol_base_type<stack_symbol_type> super_type;
-
/// Default constructor.
- inline stack_symbol_type ();
+ by_state ();
+
+ /// The symbol type as needed by the constructor.
+ typedef state_type kind_type;
/// Constructor.
- inline stack_symbol_type (]b4_join([state_type s],
- [const semantic_type& v],
- b4_locations_if([const location_type& l]))[);
+ by_state (kind_type s);
+
+ /// Copy constructor.
+ by_state (const by_state& other);
+
+ /// Steal the symbol type from \a that.
+ void move (by_state& that);
+
+ /// The (internal) type number (corresponding to \a state).
+ /// "empty" when empty.
+ symbol_number_type type_get () const;
+
+ enum { empty = 0 };
/// The state.
state_type state;
+ };
- /// The type (corresponding to \a state).
- inline int type_get_ () const;
+ /// "Internal" symbol: element of the stack.
+ struct stack_symbol_type : basic_symbol<by_state>
+ {
+ /// Superclass.
+ typedef basic_symbol<by_state> super_type;
+ /// Construct an empty symbol.
+ stack_symbol_type ();
+ /// Steal the contents from \a sym to build this.
+ stack_symbol_type (state_type s, symbol_type& sym);
+ /// Assignment, needed by push_back.
+ stack_symbol_type& operator= (const stack_symbol_type& that);
};
/// Stack type.
/// if null, no trace is output.
/// \param s the symbol
/// \warning the contents of \a s.value is stolen.
- inline void yypush_ (const char* m, stack_symbol_type& s);
+ void yypush_ (const char* m, stack_symbol_type& s);
/// Push a new look ahead token on the state on the stack.
/// \param m a debug message to display
/// \param s the state
/// \param sym the symbol (for its value and location).
/// \warning the contents of \a s.value is stolen.
- inline void yypush_ (const char* m, state_type s, symbol_type& sym);
+ void yypush_ (const char* m, state_type s, symbol_type& sym);
/// Pop \a n symbols the three stacks.
- inline void yypop_ (unsigned int n = 1);
+ void yypop_ (unsigned int n = 1);
- /* Constants. */
+ // Constants.
enum
{
yyeof_ = 0,
[b4_token_defines
#ifndef ]b4_api_PREFIX[STYPE
- /* Redirection for backward compatibility. */
+ // Redirection for backward compatibility.
# define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type
#endif
])[
]b4_percent_code_get([[provides]])[
]])
-# We do want M4 expansion after # for CPP macros.
-m4_changecom()
b4_defines_if(
-[m4_divert_push(0)dnl
-@output(b4_spec_defines_file@)@
+[b4_output_begin([b4_spec_defines_file])
b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
[
/**
** Define the ]b4_namespace_ref[::parser class.
*/
-/* C++ LALR(1) parser skeleton written by Akim Demaille. */
+// C++ LALR(1) parser skeleton written by Akim Demaille.
]b4_cpp_guard_open([b4_spec_defines_file])[
]b4_shared_declarations[
]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
[b4_shared_declarations])[
-/* User implementation prologue. */
+// User implementation prologue.
]b4_user_post_prologue[
]b4_percent_code_get[
#ifndef YY_
# if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS
-# include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
+# include <libintl.h> // FIXME: INFRINGES ON USER NAME SPACE.
# define YY_(msgid) dgettext ("bison-runtime", msgid)
# endif
# endif
[#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
]b4_yylloc_default_define])[
-/* Suppress unused-variable warnings by "using" E. */
-#define YYUSE(e) ((void) (e))
+// Suppress unused-variable warnings by "using" E.
+#define YYUSE(E) ((void) (E))
-/* Enable debugging if requested. */
+// Enable debugging if requested.
#if ]b4_api_PREFIX[DEBUG
-/* A pseudo ostream that takes yydebug_ into account. */
+// A pseudo ostream that takes yydebug_ into account.
# define YYCDEBUG if (yydebug_) (*yycdebug_)
# define YY_SYMBOL_PRINT(Title, Symbol) \
yystack_print_ (); \
} while (false)
-#else /* !]b4_api_PREFIX[DEBUG */
+#else // !]b4_api_PREFIX[DEBUG
# define YYCDEBUG if (false) std::cerr
# define YY_SYMBOL_PRINT(Title, Symbol) YYUSE(Symbol)
# define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
# define YY_STACK_PRINT() static_cast<void>(0)
-#endif /* !]b4_api_PREFIX[DEBUG */
+#endif // !]b4_api_PREFIX[DEBUG
#define yyerrok (yyerrstatus_ = 0)
#define yyclearin (yyempty = true)
case '\\':
if (*++yyp != '\\')
goto do_not_strip_quotes;
- /* Fall through. */
+ // Fall through.
default:
yyr += *yyp;
break;
]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
#endif]b4_parse_param_cons[
- {
- }
+ {}
]b4_parser_class_name::~b4_parser_class_name[ ()
- {
- }
+ {}
/*---------------.
]b4_token_ctor_if([], [b4_public_types_define])[
- // stack_symbol_type.
- ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
- : super_type ()
- , state ()
+ // by_state.
+ inline
+ ]b4_parser_class_name[::by_state::by_state ()
+ : state (empty)
+ {}
+
+ inline
+ ]b4_parser_class_name[::by_state::by_state (const by_state& other)
+ : state (other.state)
+ {}
+
+ inline
+ void
+ ]b4_parser_class_name[::by_state::move (by_state& that)
{
+ state = that.state;
+ that.state = empty;
}
- ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_join(
- [state_type s],
- [const semantic_type& v],
- b4_locations_if([const location_type& l]))[)
- : super_type (v]b4_locations_if([, l])[)
- , state (s)
+ inline
+ ]b4_parser_class_name[::by_state::by_state (state_type s)
+ : state (s)
+ {}
+
+ inline
+ ]b4_parser_class_name[::symbol_number_type
+ ]b4_parser_class_name[::by_state::type_get () const
{
+ return state == empty ? 0 : yystos_[state];
}
- int
- ]b4_parser_class_name[::stack_symbol_type::type_get_ () const
+ inline
+ ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
+ {}
+
+
+ inline
+ ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s, symbol_type& that)
+ : super_type (s]b4_locations_if([, that.location])[)
{
- return yystos_[state];
+ ]b4_variant_if([b4_symbol_variant([that.type_get ()],
+ [value], [move], [that.value])],
+ [[value = that.value;]])[
+ // that is emptied.
+ that.type = empty;
}
+ inline
+ ]b4_parser_class_name[::stack_symbol_type&
+ ]b4_parser_class_name[::stack_symbol_type::operator= (const stack_symbol_type& that)
+ {
+ state = that.state;
+ ]b4_variant_if([b4_symbol_variant([that.type_get ()],
+ [value], [copy], [that.value])],
+ [[value = that.value;]])[]b4_locations_if([
+ location = that.location;])[
+ return *this;
+ }
- template <typename Exact>
+
+ template <typename Base>
+ inline
void
- ]b4_parser_class_name[::yy_destroy_ (const char* yymsg,
- symbol_base_type<Exact>& yysym) const
+ ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
{
if (yymsg)
- YY_SYMBOL_PRINT (yymsg, yysym);
+ YY_SYMBOL_PRINT (yymsg, yysym);]b4_variant_if([], [
// User destructor.
- int yytype = yysym.type_get ();
+ symbol_number_type yytype = yysym.type_get ();
switch (yytype)
{
]b4_symbol_foreach([b4_symbol_destructor])dnl
[ default:
break;
- }]b4_variant_if([
-
- // Type destructor.
- b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[
+ }])[
}
#if ]b4_api_PREFIX[DEBUG
- template <typename Exact>
+ template <typename Base>
void
]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
- const symbol_base_type<Exact>& yysym) const
+ const basic_symbol<Base>& yysym) const
{
std::ostream& yyoutput = yyo;
YYUSE (yyoutput);
- int yytype = yysym.type_get ();
+ symbol_number_type yytype = yysym.type_get ();
yyo << (yytype < yyntokens_ ? "token" : "nterm")
<< ' ' << yytname_[yytype] << " ("]b4_locations_if([
<< yysym.location << ": "])[;
}
#endif
+ inline
void
- ]b4_parser_class_name[::yypush_ (const char* m, state_type s,
- symbol_type& sym)
+ ]b4_parser_class_name[::yypush_ (const char* m, state_type s, symbol_type& sym)
{
- if (m)
- YY_SYMBOL_PRINT (m, sym);
-]b4_variant_if(
-[[ yystack_.push (stack_symbol_type (]b4_join(
- [s],
- [semantic_type()],
- b4_locations_if([sym.location]))[));
- ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]],
- [build], [sym.value])],
-[[ yystack_.push (stack_symbol_type (]b4_join(
- [s],
- [sym.value],
- b4_locations_if([sym.location]))[));]])[
+ stack_symbol_type t (s, sym);
+ yypush_ (m, t);
}
+ inline
void
]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
{
if (m)
YY_SYMBOL_PRINT (m, s);
-]b4_variant_if(
-[[ yystack_.push (stack_symbol_type (]b4_join(
- [s.state],
- [semantic_type()],
- b4_locations_if([s.location]))[));
- ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]],
- [build], [s.value])],
-[ yystack_.push (s);])[
+ yystack_.push (s);
}
+ inline
void
]b4_parser_class_name[::yypop_ (unsigned int n)
{
]m4_ifdef([b4_initial_action], [
b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl
- /* User initialization code. */
+ // User initialization code.
b4_user_initial_action
b4_dollar_popdef])[]dnl
yynewstate:
YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
- /* Accept? */
+ // Accept?
if (yystack_[0].state == yyfinal_)
goto yyacceptlab;
goto yybackup;
- /* Backup. */
+ // Backup.
yybackup:
- /* Try to take a decision without lookahead. */
+ // Try to take a decision without lookahead.
yyn = yypact_[yystack_[0].state];
if (yy_pact_value_is_default_ (yyn))
goto yydefault;
- /* Read a lookahead token. */
+ // Read a lookahead token.
if (yyempty)
{
YYCDEBUG << "Reading a token: ";
try
- {
-]b4_token_ctor_if(
-[ yyla = b4_function_call([yylex], [symbol_type],
- m4_ifdef([b4_lex_param], b4_lex_param));],
-[ yyla.type = yytranslate_ (b4_function_call([yylex], [int],
- [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
-b4_locations_if([, [[location*], [&yyla.location]]])dnl
-m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
+ {]b4_token_ctor_if([[
+ symbol_type yylookahead (]b4_lex[);
+ yyla.move (yylookahead);]], [[
+ yyla.type = yytranslate_ (]b4_lex[);]])[
}
catch (const syntax_error& yyexc)
{
/* If the proper action on seeing token YYLA.TYPE is to reduce or
to detect an error, take that action. */
- yyn += yyla.type;
- if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
+ yyn += yyla.type_get ();
+ if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ())
goto yydefault;
- /* Reduce or error. */
+ // Reduce or error.
yyn = yytable_[yyn];
if (yyn <= 0)
{
goto yyreduce;
}
- /* Discard the token being shifted. */
+ // Discard the token being shifted.
yyempty = true;
- /* Count tokens shifted since error; after three, turn off error
- status. */
+ // Count tokens shifted since error; after three, turn off error status.
if (yyerrstatus_)
--yyerrstatus_;
- /* Shift the lookahead token. */
+ // Shift the lookahead token.
yypush_ ("Shifting", yyn, yyla);
goto yynewstate;
YYERROR;
}
YY_SYMBOL_PRINT ("-> $$ =", yylhs);
-]b4_variant_if([[
- // Destroy the rhs symbols.
- for (int i = 0; i < yylen; ++i)
- // Destroy a variant which value may have been swapped with
- // yylhs.value (for instance if the action was "std::swap($$,
- // $1)"). The value of yylhs.value (hence possibly one of these
- // rhs symbols) depends on the default construction for this
- // type. In the case of pointers for instance, no
- // initialization is done, so the value is junk. Therefore do
- // not try to report the value of symbols about to be destroyed
- // in the debug trace, it's possibly junk. Hence yymsg = 0.
- // Besides, that keeps exactly the same traces as with the other
- // Bison skeletons.
- yy_destroy_ (YY_NULL, yystack_[i]);]])[
-
yypop_ (yylen);
yylen = 0;
YY_STACK_PRINT ();
- /* Shift the result of the reduction. */
+ // Shift the result of the reduction.
yypush_ (YY_NULL, yylhs);
goto yynewstate;
| yyerrlab -- here on detecting error. |
`--------------------------------------*/
yyerrlab:
- /* If not already recovering from an error, report this error. */
+ // If not already recovering from an error, report this error.
if (!yyerrstatus_)
{
++yynerrs_;
error (]b4_join(b4_locations_if([yyla.location]),
[[yysyntax_error_ (yystack_[0].state,
- yyempty ? yyempty_ : yyla.type)]])[);
+ yyempty ? yyempty_ : yyla.type_get ())]])[);
}
]b4_locations_if([[
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
- /* Return failure if at end of input. */
- if (yyla.type == yyeof_)
+ // Return failure if at end of input.
+ if (yyla.type_get () == yyeof_)
YYABORT;
else if (!yyempty)
{
}
}
- /* Else will try to reuse lookahead token after shifting the error
- token. */
+ // Else will try to reuse lookahead token after shifting the error token.
goto yyerrlab1;
goto yyerrorlab;]b4_locations_if([[
yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
/* $$ was initialized before running the user action. */
- yy_destroy_ ("Error: discarding", yylhs);]])[
- /* Do not reclaim the symbols of the rule which action triggered
+ YY_SYMBOL_PRINT ("Error: discarding", yylhs);
+ yylhs.~stack_symbol_type();]])[
+ /* Do not reclaim the symbols of the rule whose action triggered
this YYERROR. */
yypop_ (yylen);
yylen = 0;
| yyerrlab1 -- common code for both syntax error and YYERROR. |
`-------------------------------------------------------------*/
yyerrlab1:
- yyerrstatus_ = 3; /* Each real token shifted decrements this. */
+ yyerrstatus_ = 3; // Each real token shifted decrements this.
{
stack_symbol_type error_token;
for (;;)
yyerror_range[2].location = yyla.location;
YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
- /* Shift the error token. */
+ // Shift the error token.
error_token.state = yyn;
yypush_ ("Shifting", error_token);
}
goto yynewstate;
- /* Accept. */
+ // Accept.
yyacceptlab:
yyresult = 0;
goto yyreturn;
- /* Abort. */
+ // Abort.
yyabortlab:
yyresult = 1;
goto yyreturn;
if (!yyempty)
yy_destroy_ ("Cleanup: discarding lookahead", yyla);
- /* Do not reclaim the symbols of the rule which action triggered
+ /* Do not reclaim the symbols of the rule whose action triggered
this YYABORT or YYACCEPT. */
yypop_ (yylen);
while (1 < yystack_.size ())
// Generate an error message.
std::string
]b4_parser_class_name[::yysyntax_error_ (]dnl
-b4_error_verbose_if([state_type yystate, int yytoken],
- [int, int])[)
+b4_error_verbose_if([state_type yystate, symbol_number_type yytoken],
+ [state_type, symbol_number_type])[) const
{]b4_error_verbose_if([[
std::string yyres;
// Number of reported tokens (one for the "unexpected", one per
YYCHECK. In other words, skip the first -YYN actions for
this state because they are default actions. */
int yyxbegin = yyn < 0 ? -yyn : 0;
- /* Stay within bounds of both yycheck and yytname. */
+ // Stay within bounds of both yycheck and yytname.
int yychecklim = yylast_ - yyn + 1;
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
]b4_parser_tables_define[
]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
- /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
- First, the terminals, then, starting at \a yyntokens_, nonterminals. */
+ // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ // First, the terminals, then, starting at \a yyntokens_, nonterminals.
const char*
const ]b4_parser_class_name[::yytname_[] =
{
{
unsigned int yylno = yyrline_[yyrule];
int yynrhs = yyr2_[yyrule];
- /* Print the symbols being reduced, and their result. */
+ // Print the symbols being reduced, and their result.
*yycdebug_ << "Reducing stack by rule " << yyrule - 1
<< " (line " << yylno << "):" << std::endl;
- /* The symbols being reduced. */
+ // The symbols being reduced.
for (int yyi = 0; yyi < yynrhs; yyi++)
YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
]b4_rhs_data(yynrhs, yyi + 1)[);