# --------------------------------------------------------------
# Declare "parser::yy<TABLE-NAME>_" which contents is CONTENT.
m4_define([b4_integral_parser_table_declare],
-[m4_ifval([$3], [b4_c_comment([$3], [ ])
+[m4_ifval([$3], [b4_comment([$3], [ ])
])dnl
static const b4_int_type_for([$2]) yy$1_[[]];dnl
])
])])
+# 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])
m4_define([b4_parser_class_name],
[b4_percent_define_get([[parser_class_name]])])
-# The header is mandatory.
-b4_defines_if([],
- [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
-
-b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
- [# Backward compatibility.
+b4_bison_locations_if([# Backward compatibility.
m4_define([b4_location_constructors])
- m4_include(b4_pkgdatadir/[location.cc])])])
+ m4_include(b4_pkgdatadir/[location.cc])])
m4_include(b4_pkgdatadir/[stack.hh])
b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
-# We do want M4 expansion after # for CPP macros.
-m4_changecom()
-m4_divert_push(0)dnl
-@output(b4_spec_defines_file@)@
-b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
-[
-/**
- ** \file ]b4_spec_defines_file[
- ** Define the ]b4_namespace_ref[::parser class.
- */
-
-/* C++ LALR(1) parser skeleton written by Akim Demaille. */
-
-]b4_cpp_guard_open([b4_spec_defines_file])[
-]b4_percent_code_get([[requires]])[
+# b4_shared_declarations
+# ----------------------
+# Declaration that might either go into the header (if --defines)
+# or open coded in the parser body.
+m4_define([b4_shared_declarations],
+[b4_percent_code_get([[requires]])[
]b4_parse_assert_if([# include <cassert>])[
-# include <stdexcept>
-# include <string>
+# include <deque>
# include <iostream>
+# include <stdexcept>
+# include <string>]b4_defines_if([[
# include "stack.hh"
-]b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
- [[# include "location.hh"]])])[
-
-]b4_variant_if([b4_namespace_open
-b4_variant_define
-b4_namespace_close])[
+]b4_bison_locations_if([[# include "location.hh"]])])[
+]b4_variant_if([b4_variant_includes])[
]b4_YYDEBUG_define[
]b4_namespace_open[
+]b4_defines_if([],
+[b4_stack_define
+b4_bison_locations_if([b4_position_define
+b4_location_define])])[
+
+]b4_variant_if([b4_variant_define])[
+
/// A Bison parser.
class ]b4_parser_class_name[
{
#endif // ]b4_api_PREFIX[DEBUG
/// Convert a scanner token number \a t to a symbol number.
- static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t);
+ 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.
inline stack_symbol_type ();
/// Constructor.
- inline stack_symbol_type (]b4_args([state_type s],
+ inline stack_symbol_type (]b4_join([state_type s],
[const semantic_type& v],
b4_locations_if([const location_type& l]))[);
/// Pop \a n symbols the three stacks.
inline void yypop_ (unsigned int n = 1);
- /* Constants. */
+ // Constants.
enum
{
yyeof_ = 0,
]b4_parse_param_vars[
};
-]b4_lex_symbol_if([b4_yytranslate_define
+]b4_token_ctor_if([b4_yytranslate_define
b4_public_types_define])[
]b4_namespace_close[
[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]])[
+]])
+
+b4_defines_if(
+[b4_output_begin([b4_spec_defines_file])
+b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
+[
+/**
+ ** \file ]b4_spec_defines_file[
+ ** Define the ]b4_namespace_ref[::parser class.
+ */
+
+// C++ LALR(1) parser skeleton written by Akim Demaille.
+
+]b4_cpp_guard_open([b4_spec_defines_file])[
+]b4_shared_declarations[
]b4_cpp_guard_close([b4_spec_defines_file])
-@output(b4_parser_file_name@)@
+b4_output_end()
+])
+
+
+b4_output_begin([b4_parser_file_name])
b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
b4_percent_code_get([[top]])[]dnl
m4_if(b4_prefix, [yy], [],
// Take the name prefix into account.
#define yylex b4_prefix[]lex])[
-/* First part of user declarations. */
+// First part of user declarations.
]b4_user_pre_prologue[
-#include "@basename(]b4_spec_defines_file[@)"
+]b4_null_define[
+
+]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[
-]b4_null_define[
-
#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;
| Symbol types. |
`---------------*/
-]b4_lex_symbol_if([], [b4_public_types_define])[
+]b4_token_ctor_if([], [b4_public_types_define])[
// stack_symbol_type.
]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
{
}
- ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_args(
+ ]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]))[)
if (m)
YY_SYMBOL_PRINT (m, sym);
]b4_variant_if(
-[[ yystack_.push (stack_symbol_type (]b4_args(
+[[ 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_args(
+[[ yystack_.push (stack_symbol_type (]b4_join(
[s],
[sym.value],
b4_locations_if([sym.location]))[));]])[
if (m)
YY_SYMBOL_PRINT (m, s);
]b4_variant_if(
-[[ yystack_.push (stack_symbol_type (]b4_args(
+[[ yystack_.push (stack_symbol_type (]b4_join(
[s.state],
[semantic_type()],
b4_locations_if([s.location]))[));
/// Whether yyla contains a lookahead.
bool yyempty = true;
- /* State. */
+ // State.
int yyn;
int yylen = 0;
- /* Error handling. */
+ // Error handling.
int yynerrs_ = 0;
int yyerrstatus_ = 0;
/// The return value of parse ().
int yyresult;
+ // FIXME: This shoud be completely indented. It is not yet to
+ // avoid gratuitous conflicts when merging into the master branch.
+ try
+ {
YYCDEBUG << "Starting parse" << std::endl;
]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_lex_symbol_if(
-[ yyla = b4_c_function_call([yylex], [symbol_type],
- m4_ifdef([b4_lex_param], b4_lex_param));],
-[ yyla.type = yytranslate_ (b4_c_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)
- {
- error (yyexc);
- goto yyerrlab1;
- }
+ {
+ error (yyexc);
+ goto yyerrlab1;
+ }
yyempty = false;
}
YY_SYMBOL_PRINT ("Next token is", yyla);
if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
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;
// Perform the reduction.
YY_REDUCE_PRINT (yyn);
try
- {
- switch (yyn)
{
+ switch (yyn)
+ {
]b4_user_actions[
- default:
- break;
+ default:
+ break;
+ }
}
- }
catch (const syntax_error& yyexc)
- {
- error (yyexc);
- YYERROR;
- }
+ {
+ error (yyexc);
+ YYERROR;
+ }
YY_SYMBOL_PRINT ("-> $$ =", yylhs);
]b4_variant_if([[
// Destroy the rhs symbols.
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_args(b4_locations_if([yyla.location]),
+ error (]b4_join(b4_locations_if([yyla.location]),
[[yysyntax_error_ (yystack_[0].state,
yyempty ? yyempty_ : yyla.type)]])[);
}
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
- /* Return failure if at end of input. */
+ // Return failure if at end of input.
if (yyla.type == 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;
| 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;
/* Do not reclaim the symbols of the rule which action triggered
this YYABORT or YYACCEPT. */
yypop_ (yylen);
- while (yystack_.size () != 1)
+ while (1 < yystack_.size ())
{
yy_destroy_ ("Cleanup: popping", yystack_[0]);
yypop_ ();
return yyresult;
}
+ catch (...)
+ {
+ YYCDEBUG << "Exception caught: cleaning lookahead and stack"
+ << std::endl;
+ // Do not try to display the values of the reclaimed symbols,
+ // as their printer might throw an exception.
+ if (!yyempty)
+ yy_destroy_ (YY_NULL, yyla);
+
+ while (1 < yystack_.size ())
+ {
+ yy_destroy_ (YY_NULL, yystack_[0]);
+ yypop_ ();
+ }
+ throw;
+ }
+ }
void
]b4_parser_class_name[::error (const syntax_error& yyexc)
{
- error (]b4_args(b4_locations_if([yyexc.location]),
+ error (]b4_join(b4_locations_if([yyexc.location]),
[[yyexc.what()]])[);
}
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)[);
}
#endif // ]b4_api_PREFIX[DEBUG
-]b4_lex_symbol_if([], [b4_yytranslate_define])[
+]b4_token_ctor_if([], [b4_yytranslate_define])[
]b4_namespace_close[
]b4_epilogue[]dnl
-m4_divert_pop(0)
+b4_output_end()
+
+
m4_popdef([b4_copyright_years])dnl