]> git.saurik.com Git - bison.git/blame - data/lalr1.cc
tables: scope reduction
[bison.git] / data / lalr1.cc
CommitLineData
60491a94 1# C++ skeleton for Bison
b4721715 2
34136e65 3# Copyright (C) 2002-2012 Free Software Foundation, Inc.
60491a94 4
f16b0819 5# This program is free software: you can redistribute it and/or modify
60491a94 6# it under the terms of the GNU General Public License as published by
f16b0819 7# the Free Software Foundation, either version 3 of the License, or
60491a94 8# (at your option) any later version.
f16b0819 9#
60491a94
AD
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
f16b0819 14#
60491a94 15# You should have received a copy of the GNU General Public License
f16b0819 16# along with this program. If not, see <http://www.gnu.org/licenses/>.
60491a94 17
cf147260 18m4_include(b4_pkgdatadir/[c++.m4])
7eb8a0bc 19
2ea7730c 20
ba206cf4
AD
21# b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
22# --------------------------------------------------------------
0fddb3d5 23# Declare "parser::yy<TABLE-NAME>_" which contents is CONTENT.
ba206cf4 24m4_define([b4_integral_parser_table_declare],
15f66669 25[m4_ifval([$3], [b4_comment([$3], [ ])
6ab1adbe
AD
26])dnl
27 static const b4_int_type_for([$2]) yy$1_[[]];dnl
0fddb3d5
AD
28])
29
ba206cf4 30# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
2b08bceb 31# -------------------------------------------------------------
8901f32e 32# Define "parser::yy<TABLE-NAME>_" which contents is CONTENT.
ba206cf4 33m4_define([b4_integral_parser_table_define],
6ab1adbe 34[ const b4_int_type_for([$2])
8901f32e
AD
35 b4_parser_class_name::yy$1_[[]] =
36 {
37 $2
6ab1adbe
AD
38 };dnl
39])
40
a9ce3f54 41
5de9c593
AD
42# b4_symbol_value_template(VAL, [TYPE])
43# -------------------------------------
507aa0e2
AD
44# Same as b4_symbol_value, but used in a template method. It makes
45# a difference when using variants.
5de9c593
AD
46m4_copy([b4_symbol_value], [b4_symbol_value_template])
47
5ab8c47b 48
e1f93869
AD
49# b4_lhs_value([TYPE])
50# --------------------
51# Expansion of $<TYPE>$.
52m4_define([b4_lhs_value],
507aa0e2 53 [b4_symbol_value([yylhs.value], [$1])])
e1f93869
AD
54
55
56# b4_lhs_location()
57# -----------------
58# Expansion of @$.
59m4_define([b4_lhs_location],
507aa0e2 60 [yylhs.location])
e1f93869
AD
61
62
33c195cc
AD
63# b4_rhs_data(RULE-LENGTH, NUM)
64# -----------------------------
65# Return the data corresponding to the symbol #NUM, where the current
66# rule has RULE-LENGTH symbols on RHS.
67m4_define([b4_rhs_data],
3204049e 68 [yystack_@{b4_subtract($@)@}])
33c195cc
AD
69
70
71# b4_rhs_state(RULE-LENGTH, NUM)
51bacae6 72# ------------------------------
33c195cc
AD
73# The state corresponding to the symbol #NUM, where the current
74# rule has RULE-LENGTH symbols on RHS.
75m4_define([b4_rhs_state],
76 [b4_rhs_data([$1], [$2]).state])
77
78
8901f32e
AD
79# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
80# --------------------------------------
81# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
82# symbols on RHS.
83m4_define([b4_rhs_value],
33c195cc
AD
84 [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])])
85
8901f32e
AD
86
87# b4_rhs_location(RULE-LENGTH, NUM)
88# ---------------------------------
89# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
90# on RHS.
91m4_define([b4_rhs_location],
33c195cc 92 [b4_rhs_data([$1], [$2]).location])
8901f32e 93
507aa0e2 94
2bde9113
AD
95# b4_symbol_action(SYMBOL-NUM, KIND)
96# ----------------------------------
97# Run the action KIND (destructor or printer) for SYMBOL-NUM.
c4585f1e 98# Same as in C, but using references instead of pointers.
2bde9113
AD
99m4_define([b4_symbol_action],
100[b4_symbol_if([$1], [has_$2],
4323e0da
AD
101[m4_pushdef([b4_symbol_value], m4_defn([b4_symbol_value_template]))[]dnl
102b4_dollar_pushdef([yysym.value],
103 b4_symbol_if([$1], [has_type],
104 [m4_dquote(b4_symbol([$1], [type]))]),
105 [yysym.location])dnl
fb7c5b1f 106 b4_symbol_case_([$1])
2bde9113
AD
107b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
108 b4_symbol([$1], [$2])
c4585f1e
AD
109b4_syncline([@oline@], [@ofile@])
110 break;
2bde9113 111
4323e0da
AD
112m4_popdef([b4_symbol_value])[]dnl
113b4_dollar_popdef[]dnl
2bde9113
AD
114])])
115
2873fdf8 116
64b3612a
AD
117# b4_lex
118# ------
119# Call yylex.
120m4_define([b4_lex],
121[b4_token_ctor_if(
122[b4_function_call([yylex],
123 [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))],
124[b4_function_call([yylex], [int],
125 [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
126b4_locations_if([, [[location*], [&yyla.location]]])dnl
127m4_ifdef([b4_lex_param], [, ]b4_lex_param))])])
128
129
8901f32e 130m4_pushdef([b4_copyright_years],
34136e65 131 [2002-2012])
8901f32e 132
6afc30cc 133m4_define([b4_parser_class_name],
a4e25e1d 134 [b4_percent_define_get([[parser_class_name]])])
34376418 135
bcd80897 136b4_bison_locations_if([# Backward compatibility.
c547693a 137 m4_define([b4_location_constructors])
bcd80897 138 m4_include(b4_pkgdatadir/[location.cc])])
51bacae6 139m4_include(b4_pkgdatadir/[stack.hh])
507aa0e2 140b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
a5eb1ed2 141
d27c5e65
AD
142# b4_shared_declarations
143# ----------------------
144# Declaration that might either go into the header (if --defines)
145# or open coded in the parser body.
146m4_define([b4_shared_declarations],
147[b4_percent_code_get([[requires]])[
ff348970 148]b4_parse_assert_if([# include <cassert>])[
5de5b987 149# include <deque>
ff348970 150# include <iostream>
5de5b987
AD
151# include <stdexcept>
152# include <string>]b4_defines_if([[
ff348970 153# include "stack.hh"
bcd80897 154]b4_bison_locations_if([[# include "location.hh"]])])[
35f70d16 155]b4_variant_if([b4_variant_includes])[
5de5b987
AD
156
157]b4_YYDEBUG_define[
50997c6e 158
93549bcd 159]b4_namespace_open[
4162fa07 160
5de5b987
AD
161]b4_defines_if([],
162[b4_stack_define
bcd80897
AD
163b4_bison_locations_if([b4_position_define
164b4_location_define])])[
69e2658b 165
93549bcd 166]b4_variant_if([b4_variant_define])[
3f3eed27 167
efeed023 168 /// A Bison parser.
07fed891 169 class ]b4_parser_class_name[
2b548aa6 170 {
fb9712a9 171 public:
4f84717d 172]b4_public_types_declare[
efeed023 173 /// Build a parser object.
98ae9643
AD
174 ]b4_parser_class_name[ (]b4_parse_param_decl[);
175 virtual ~]b4_parser_class_name[ ();
2b548aa6 176
f69a4142
AD
177 /// Parse.
178 /// \returns 0 iff parsing succeeded.
e019c247 179 virtual int parse ();
2b548aa6 180
5f108727 181#if ]b4_api_PREFIX[DEBUG
f69a4142 182 /// The current debugging stream.
9a1e9989
AD
183 std::ostream& debug_stream () const;
184 /// Set the current debugging stream.
185 void set_debug_stream (std::ostream &);
186
a3cb6248
AD
187 /// Type for debugging levels.
188 typedef int debug_level_type;
189 /// The current debugging level.
190 debug_level_type debug_level () const;
191 /// Set the current debugging level.
192 void set_debug_level (debug_level_type l);
52cbbe84 193#endif
a3cb6248 194
34904c57
AD
195 /// Report a syntax error.]b4_locations_if([[
196 /// \param loc where the syntax error is found.]])[
efeed023 197 /// \param msg a description of the syntax error.
34904c57 198 virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
efeed023 199
a6552c5d
AD
200 /// Report a syntax error.
201 void error (const syntax_error& err);
202
49572920 203 private:
e019c247 204 /// State numbers.
f479c6c6 205 typedef int state_type;
2b548aa6 206
ceb8b8e6
AD
207 /// Generate an error message.
208 /// \param yystate the state where the error occurred.
209 /// \param yytoken the lookahead token.
210 virtual std::string yysyntax_error_ (state_type yystate, int yytoken);
211
7580c379
AD
212 /// Compute post-reduction state.
213 /// \param yystate the current state
214 /// \param yylhs the nonterminal to push on the stack
215 state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
216
f2b30bdf
JD
217 /// Whether the given \c yypact_ value indicates a defaulted state.
218 /// \param yyvalue the value to check
219 static bool yy_pact_value_is_default_ (int yyvalue);
220
221 /// Whether the given \c yytable_ value indicates a syntax error.
222 /// \param yyvalue the value to check
223 static bool yy_table_value_is_error_ (int yyvalue);
224
e019c247 225 /// Internal symbol numbers.
f479c6c6 226 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
617a8f12 227 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
617a8f12 228 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
efeed023 229
7aaaad6c
AD
230 // Tables.
231]b4_parser_tables_declare[]b4_error_verbose_if([
9e0876fb 232
9e0876fb 233 /// Convert the symbol name \a n to a form suitable for a diagnostic.
422c18f4 234 static std::string yytnamerr_ (const char *n);])[
2b548aa6 235
5f108727 236]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
258cddbc
AD
237 /// For a symbol, its name in clear.
238 static const char* const yytname_[];
5f108727 239]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
ba206cf4
AD
240]b4_integral_parser_table_declare([rline], [b4_rline],
241 [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
efeed023 242 /// Report on the debug stream that the rule \a r is going to be reduced.
d1ff7a7c 243 virtual void yy_reduce_print_ (int r);
efeed023 244 /// Print the state stack on the debug stream.
f69a4142 245 virtual void yystack_print_ ();
fa7b79c0 246
7aaaad6c 247 // Debugging.
fa7b79c0
PE
248 int yydebug_;
249 std::ostream* yycdebug_;
ccdc1577 250#endif // ]b4_api_PREFIX[DEBUG
2b548aa6 251
32c96bd7 252 /// Convert a scanner token number \a t to a symbol number.
e36ec1f4 253 static inline token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t);
f69a4142 254
ccdc1577 255#if ]b4_api_PREFIX[DEBUG
1f7d007b
AD
256 /// \brief Display a symbol type, value and location.
257 /// \param yyo The output stream.
258 /// \param yysym The symbol.
5de9c593
AD
259 template <typename Exact>
260 void yy_print_ (std::ostream& yyo,
261 const symbol_base_type<Exact>& yysym) const;
57295d14
AD
262#endif
263
1f7d007b
AD
264 /// \brief Reclaim the memory associated to a symbol.
265 /// \param yymsg Why this token is reclaimed.
266 /// If null, print nothing.
267 /// \param s The symbol.
5de9c593
AD
268 template <typename Exact>
269 inline void yy_destroy_ (const char* yymsg,
270 symbol_base_type<Exact>& yysym) const;
1f7d007b 271
2873fdf8 272 private:
1f7d007b 273 /// Element of the stack: a state and its attributes.
5de9c593 274 struct stack_symbol_type : symbol_base_type<stack_symbol_type>
1f7d007b 275 {
5de9c593
AD
276 /// The parent class.
277 typedef symbol_base_type<stack_symbol_type> super_type;
278
1f7d007b 279 /// Default constructor.
d3be4f6d 280 inline stack_symbol_type ();
1f7d007b
AD
281
282 /// Constructor.
710c4a65 283 inline stack_symbol_type (]b4_join([state_type s],
2ea7730c
AD
284 [const semantic_type& v],
285 b4_locations_if([const location_type& l]))[);
1f7d007b
AD
286
287 /// The state.
288 state_type state;
57295d14 289
2b08bceb 290 /// The type (corresponding to \a state).
5de9c593 291 inline int type_get_ () const;
1f7d007b 292 };
57295d14 293
8901f32e 294 /// Stack type.
bc0b0477 295 typedef stack<stack_symbol_type> stack_type;
8901f32e
AD
296
297 /// The stack.
298 stack_type yystack_;
299
7dedf26e 300 /// Push a new state on the stack.
9380cfd0
AD
301 /// \param m a debug message to display
302 /// if null, no trace is output.
e9b0834e
AD
303 /// \param s the symbol
304 /// \warning the contents of \a s.value is stolen.
bc0b0477 305 inline void yypush_ (const char* m, stack_symbol_type& s);
7dedf26e 306
1f7d007b
AD
307 /// Push a new look ahead token on the state on the stack.
308 /// \param m a debug message to display
309 /// if null, no trace is output.
310 /// \param s the state
311 /// \param sym the symbol (for its value and location).
312 /// \warning the contents of \a s.value is stolen.
313 inline void yypush_ (const char* m, state_type s, symbol_type& sym);
314
52d5733f 315 /// Pop \a n symbols the three stacks.
f69a4142 316 inline void yypop_ (unsigned int n = 1);
52d5733f 317
ac826bc4 318 // Constants.
914202bd
AD
319 enum
320 {
321 yyeof_ = 0,
322 yylast_ = ]b4_last[, //< Last index in yytable_.
323 yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols.
324 yyempty_ = -2,
325 yyfinal_ = ]b4_final_state_number[, //< Termination state number.
326 yyterror_ = 1,
327 yyerrcode_ = 256,
f3bd3f78 328 yyntokens_ = ]b4_tokens_number[ //< Number of tokens.
914202bd
AD
329 };
330
caf37a36 331]b4_parse_param_vars[
2b548aa6 332 };
1c4af381 333
e36ec1f4 334]b4_token_ctor_if([b4_yytranslate_define
0623bacc 335b4_public_types_define])[
793fbca5 336]b4_namespace_close[
2b548aa6 337
592d0b1e 338]b4_percent_define_flag_if([[global_tokens_and_yystype]],
6687da34 339[b4_token_defines
fb9712a9 340
4b3847c3 341#ifndef ]b4_api_PREFIX[STYPE
ac826bc4 342 // Redirection for backward compatibility.
4b3847c3 343# define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type
fb9712a9 344#endif
22172d47
AD
345])[
346]b4_percent_code_get([[provides]])[
d27c5e65
AD
347]])
348
85f0b29e 349b4_defines_if(
eaf690a7 350[b4_output_begin([b4_spec_defines_file])
d27c5e65
AD
351b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
352[
353/**
354 ** \file ]b4_spec_defines_file[
355 ** Define the ]b4_namespace_ref[::parser class.
356 */
357
ac826bc4 358// C++ LALR(1) parser skeleton written by Akim Demaille.
d27c5e65
AD
359
360]b4_cpp_guard_open([b4_spec_defines_file])[
361]b4_shared_declarations[
22172d47 362]b4_cpp_guard_close([b4_spec_defines_file])
1c7ec959 363b4_output_end()
85f0b29e
AD
364])
365
366
1c7ec959 367b4_output_begin([b4_parser_file_name])
a9ce3f54 368b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
a4e25e1d 369b4_percent_code_get([[top]])[]dnl
aa08666d 370m4_if(b4_prefix, [yy], [],
c5b95ccf
AD
371[
372// Take the name prefix into account.
9bc0dd67
JD
373#define yylex b4_prefix[]lex])[
374
28427f57 375// First part of user declarations.
c944f7f2 376]b4_user_pre_prologue[
9bc0dd67 377
28427f57
AD
378]b4_null_define[
379
85f0b29e
AD
380]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
381 [b4_shared_declarations])[
50997c6e 382
ac826bc4 383// User implementation prologue.
771dc643
AD
384]b4_user_post_prologue[
385]b4_percent_code_get[
386
771dc643 387#ifndef YY_
ae93128c 388# if defined YYENABLE_NLS && YYENABLE_NLS
30757c8c 389# if ENABLE_NLS
ac826bc4 390# include <libintl.h> // FIXME: INFRINGES ON USER NAME SPACE.
30757c8c
PE
391# define YY_(msgid) dgettext ("bison-runtime", msgid)
392# endif
393# endif
394# ifndef YY_
395# define YY_(msgid) msgid
396# endif
989b5b8e
AD
397#endif
398
38435078 399]b4_locations_if([dnl
ccdc1577
AD
400[#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
401]b4_yylloc_default_define])[
38435078 402
ac826bc4
AD
403// Suppress unused-variable warnings by "using" E.
404#define YYUSE(E) ((void) (E))
2a4647a3 405
ac826bc4 406// Enable debugging if requested.
5f108727 407#if ]b4_api_PREFIX[DEBUG
284acc8b 408
ac826bc4 409// A pseudo ostream that takes yydebug_ into account.
fa7b79c0
PE
410# define YYCDEBUG if (yydebug_) (*yycdebug_)
411
1f7d007b 412# define YY_SYMBOL_PRINT(Title, Symbol) \
57295d14
AD
413 do { \
414 if (yydebug_) \
415 { \
416 *yycdebug_ << Title << ' '; \
1f7d007b 417 yy_print_ (*yycdebug_, Symbol); \
57295d14
AD
418 *yycdebug_ << std::endl; \
419 } \
8901f32e 420 } while (false)
284acc8b 421
e9690142
JD
422# define YY_REDUCE_PRINT(Rule) \
423 do { \
8901f32e 424 if (yydebug_) \
e9690142 425 yy_reduce_print_ (Rule); \
8901f32e 426 } while (false)
284acc8b 427
e9690142
JD
428# define YY_STACK_PRINT() \
429 do { \
8901f32e
AD
430 if (yydebug_) \
431 yystack_print_ (); \
432 } while (false)
284acc8b 433
ac826bc4 434#else // !]b4_api_PREFIX[DEBUG
284acc8b 435
a36b333c 436# define YYCDEBUG if (false) std::cerr
beadb220 437# define YY_SYMBOL_PRINT(Title, Symbol) YYUSE(Symbol)
1f7d007b
AD
438# define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
439# define YY_STACK_PRINT() static_cast<void>(0)
284acc8b 440
ac826bc4 441#endif // !]b4_api_PREFIX[DEBUG
2b548aa6 442
39be9022
AD
443#define yyerrok (yyerrstatus_ = 0)
444#define yyclearin (yyempty = true)
98e26a92 445
39be9022
AD
446#define YYACCEPT goto yyacceptlab
447#define YYABORT goto yyabortlab
448#define YYERROR goto yyerrorlab
98e26a92 449#define YYRECOVERING() (!!yyerrstatus_)
60a777aa 450
422c18f4 451]b4_namespace_open[]b4_error_verbose_if([[
9e0876fb 452
aa08666d
AD
453 /* Return YYSTR after stripping away unnecessary quotes and
454 backslashes, so that it's suitable for yyerror. The heuristic is
455 that double-quoting is unnecessary unless the string contains an
456 apostrophe, a comma, or backslash (other than backslash-backslash).
457 YYSTR is taken from yytname. */
458 std::string
459 ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
460 {
461 if (*yystr == '"')
462 {
463 std::string yyr = "";
464 char const *yyp = yystr;
193d7c70 465
aa08666d
AD
466 for (;;)
467 switch (*++yyp)
468 {
469 case '\'':
470 case ',':
471 goto do_not_strip_quotes;
193d7c70 472
aa08666d
AD
473 case '\\':
474 if (*++yyp != '\\')
475 goto do_not_strip_quotes;
ac826bc4 476 // Fall through.
aa08666d
AD
477 default:
478 yyr += *yyp;
479 break;
193d7c70 480
aa08666d
AD
481 case '"':
482 return yyr;
483 }
484 do_not_strip_quotes: ;
485 }
193d7c70 486
aa08666d
AD
487 return yystr;
488 }
422c18f4 489]])[
9e0876fb 490
98ae9643 491 /// Build a parser object.
fa7b79c0
PE
492 ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
493 :])[
5f108727 494#if ]b4_api_PREFIX[DEBUG
fa7b79c0
PE
495 ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
496 yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
497#endif]b4_parse_param_cons[
98ae9643
AD
498 {
499 }
a0e68930 500
98ae9643
AD
501 ]b4_parser_class_name::~b4_parser_class_name[ ()
502 {
503 }
a0e68930 504
a0e68930 505
1f7d007b
AD
506 /*---------------.
507 | Symbol types. |
508 `---------------*/
509
e36ec1f4 510]b4_token_ctor_if([], [b4_public_types_define])[
2873fdf8 511
1f7d007b
AD
512 // stack_symbol_type.
513 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
5de9c593
AD
514 : super_type ()
515 , state ()
1f7d007b
AD
516 {
517 }
518
710c4a65 519 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_join(
2ea7730c
AD
520 [state_type s],
521 [const semantic_type& v],
522 b4_locations_if([const location_type& l]))[)
523 : super_type (v]b4_locations_if([, l])[)
5de9c593 524 , state (s)
1f7d007b
AD
525 {
526 }
527
528 int
5de9c593 529 ]b4_parser_class_name[::stack_symbol_type::type_get_ () const
1f7d007b
AD
530 {
531 return yystos_[state];
532 }
533
534
5de9c593 535 template <typename Exact>
98ae9643 536 void
5de9c593
AD
537 ]b4_parser_class_name[::yy_destroy_ (const char* yymsg,
538 symbol_base_type<Exact>& yysym) const
98ae9643 539 {
8901f32e 540 if (yymsg)
1f7d007b 541 YY_SYMBOL_PRINT (yymsg, yysym);
98ae9643 542
8901f32e 543 // User destructor.
c5026327 544 int yytype = yysym.type_get ();
98ae9643
AD
545 switch (yytype)
546 {
e3c52a63 547]b4_symbol_foreach([b4_symbol_destructor])dnl
2bde9113
AD
548[ default:
549 break;
8901f32e
AD
550 }]b4_variant_if([
551
552 // Type destructor.
4c3cc7da 553 b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[
8901f32e
AD
554 }
555
ccdc1577 556#if ]b4_api_PREFIX[DEBUG
5de9c593 557 template <typename Exact>
1f7d007b 558 void
5de9c593
AD
559 ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
560 const symbol_base_type<Exact>& yysym) const
8901f32e 561 {
c5026327
AD
562 std::ostream& yyoutput = yyo;
563 YYUSE (yyoutput);
1f7d007b
AD
564 int yytype = yysym.type_get ();
565 yyo << (yytype < yyntokens_ ? "token" : "nterm")
2ea7730c
AD
566 << ' ' << yytname_[yytype] << " ("]b4_locations_if([
567 << yysym.location << ": "])[;
1f7d007b
AD
568 switch (yytype)
569 {
e3c52a63 570]b4_symbol_foreach([b4_symbol_printer])dnl
2bde9113 571[ default:
e9690142 572 break;
1f7d007b
AD
573 }
574 yyo << ')';
8901f32e 575 }
1f7d007b 576#endif
8901f32e 577
1f7d007b
AD
578 void
579 ]b4_parser_class_name[::yypush_ (const char* m, state_type s,
580 symbol_type& sym)
8901f32e 581 {
1f7d007b
AD
582 if (m)
583 YY_SYMBOL_PRINT (m, sym);
584]b4_variant_if(
710c4a65 585[[ yystack_.push (stack_symbol_type (]b4_join(
2ea7730c
AD
586 [s],
587 [semantic_type()],
588 b4_locations_if([sym.location]))[));
1f7d007b
AD
589 ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]],
590 [build], [sym.value])],
710c4a65 591[[ yystack_.push (stack_symbol_type (]b4_join(
2ea7730c
AD
592 [s],
593 [sym.value],
594 b4_locations_if([sym.location]))[));]])[
98ae9643 595 }
60a777aa 596
7dedf26e 597 void
bc0b0477 598 ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
7dedf26e 599 {
9380cfd0 600 if (m)
1f7d007b 601 YY_SYMBOL_PRINT (m, s);
8901f32e 602]b4_variant_if(
710c4a65 603[[ yystack_.push (stack_symbol_type (]b4_join(
2ea7730c
AD
604 [s.state],
605 [semantic_type()],
606 b4_locations_if([s.location]))[));
1f7d007b 607 ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]],
e9b0834e
AD
608 [build], [s.value])],
609[ yystack_.push (s);])[
7dedf26e
AD
610 }
611
98ae9643
AD
612 void
613 ]b4_parser_class_name[::yypop_ (unsigned int n)
614 {
8901f32e 615 yystack_.pop (n);
98ae9643 616 }
52d5733f 617
5f108727 618#if ]b4_api_PREFIX[DEBUG
98ae9643
AD
619 std::ostream&
620 ]b4_parser_class_name[::debug_stream () const
621 {
622 return *yycdebug_;
623 }
9a1e9989 624
98ae9643
AD
625 void
626 ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
627 {
628 yycdebug_ = &o;
629 }
9a1e9989
AD
630
631
98ae9643
AD
632 ]b4_parser_class_name[::debug_level_type
633 ]b4_parser_class_name[::debug_level () const
634 {
635 return yydebug_;
636 }
a3cb6248 637
98ae9643
AD
638 void
639 ]b4_parser_class_name[::set_debug_level (debug_level_type l)
640 {
641 yydebug_ = l;
642 }
ccdc1577 643#endif // ]b4_api_PREFIX[DEBUG
a3cb6248 644
7580c379
AD
645 inline ]b4_parser_class_name[::state_type
646 ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs)
647 {
648 int yyr = yypgoto_[yylhs - yyntokens_] + yystate;
649 if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
650 return yytable_[yyr];
651 else
652 return yydefgoto_[yylhs - yyntokens_];
653 }
654
f2b30bdf
JD
655 inline bool
656 ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
657 {
658 return yyvalue == yypact_ninf_;
659 }
660
661 inline bool
662 ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue)
663 {
aa0cb40d 664 return yyvalue == yytable_ninf_;
f2b30bdf
JD
665 }
666
98ae9643
AD
667 int
668 ]b4_parser_class_name[::parse ()
669 {
39be9022
AD
670 /// Whether yyla contains a lookahead.
671 bool yyempty = true;
d4fb5e3c 672
b720fedf 673 // State.
98ae9643 674 int yyn;
a85284cf 675 int yylen = 0;
d4fb5e3c 676
b720fedf 677 // Error handling.
98ae9643
AD
678 int yynerrs_ = 0;
679 int yyerrstatus_ = 0;
dbcdae2d 680
6082531a 681 /// The lookahead symbol.
2ea7730c 682 symbol_type yyla;]b4_locations_if([[
6082531a 683
98ae9643 684 /// The locations where the error started and ended.
44c2b42d 685 stack_symbol_type yyerror_range[3];]])[
dbcdae2d 686
e1f93869 687 /// $$ and @@$.
bc0b0477 688 stack_symbol_type yylhs;
dbcdae2d 689
ff348970 690 /// The return value of parse ().
98ae9643 691 int yyresult;
ad745863 692
7e1fabbe
AD
693 // FIXME: This shoud be completely indented. It is not yet to
694 // avoid gratuitous conflicts when merging into the master branch.
695 try
696 {
98ae9643 697 YYCDEBUG << "Starting parse" << std::endl;
451364ed 698
451364ed 699]m4_ifdef([b4_initial_action], [
4323e0da 700b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl
ac826bc4 701 // User initialization code.
8ec0a172 702 b4_user_initial_action
cd735a8c 703b4_dollar_popdef])[]dnl
451364ed 704
8901f32e 705 [ /* Initialize the stack. The initial state will be set in
98ae9643
AD
706 yynewstate, since the latter expects the semantical and the
707 location values to have been already stored, initialize these
708 stacks with a primary value. */
8901f32e 709 yystack_ = stack_type (0);
eeaf1dc6 710 yypush_ (YY_NULL, 0, yyla);
98ae9643 711
7580c379 712 // A new symbol was pushed on the stack.
98ae9643 713 yynewstate:
7580c379 714 YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
868d2d96 715
ac826bc4 716 // Accept?
7580c379 717 if (yystack_[0].state == yyfinal_)
868d2d96
JD
718 goto yyacceptlab;
719
98ae9643
AD
720 goto yybackup;
721
ac826bc4 722 // Backup.
98ae9643
AD
723 yybackup:
724
ac826bc4 725 // Try to take a decision without lookahead.
7580c379 726 yyn = yypact_[yystack_[0].state];
f2b30bdf 727 if (yy_pact_value_is_default_ (yyn))
98ae9643
AD
728 goto yydefault;
729
ac826bc4 730 // Read a lookahead token.
39be9022 731 if (yyempty)
98ae9643 732 {
09277875 733 YYCDEBUG << "Reading a token: ";
a6552c5d 734 try
64b3612a
AD
735 {]b4_token_ctor_if([[
736 symbol_type yylookahead = ]b4_lex[;
737 yyla.move (yylookahead);]], [[
738 yyla.type = yytranslate_ (]b4_lex[);]])[
77a1a208 739 }
a6552c5d 740 catch (const syntax_error& yyexc)
77a1a208
AD
741 {
742 error (yyexc);
743 goto yyerrlab1;
744 }
39be9022 745 yyempty = false;
98ae9643 746 }
aba12ad1 747 YY_SYMBOL_PRINT ("Next token is", yyla);
98ae9643 748
1f7d007b
AD
749 /* If the proper action on seeing token YYLA.TYPE is to reduce or
750 to detect an error, take that action. */
751 yyn += yyla.type;
752 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
98ae9643
AD
753 goto yydefault;
754
ac826bc4 755 // Reduce or error.
98ae9643
AD
756 yyn = yytable_[yyn];
757 if (yyn <= 0)
758 {
e9690142
JD
759 if (yy_table_value_is_error_ (yyn))
760 goto yyerrlab;
761 yyn = -yyn;
762 goto yyreduce;
98ae9643
AD
763 }
764
ac826bc4 765 // Discard the token being shifted.
39be9022 766 yyempty = true;
98ae9643 767
ac826bc4 768 // Count tokens shifted since error; after three, turn off error status.
98ae9643
AD
769 if (yyerrstatus_)
770 --yyerrstatus_;
771
ac826bc4 772 // Shift the lookahead token.
7580c379 773 yypush_ ("Shifting", yyn, yyla);
98ae9643
AD
774 goto yynewstate;
775
776 /*-----------------------------------------------------------.
777 | yydefault -- do the default action for the current state. |
778 `-----------------------------------------------------------*/
779 yydefault:
7580c379 780 yyn = yydefact_[yystack_[0].state];
98ae9643
AD
781 if (yyn == 0)
782 goto yyerrlab;
783 goto yyreduce;
784
785 /*-----------------------------.
786 | yyreduce -- Do a reduction. |
787 `-----------------------------*/
788 yyreduce:
c4dc4c46 789 yylen = yyr2_[yyn];
7580c379 790 yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
5ab8c47b 791 /* Variants are always initialized to an empty instance of the
3eead995
AD
792 correct type. The default $$=$1 action is NOT applied when using
793 variants. */
c4dc4c46 794 b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[
a85284cf 795 /* If YYLEN is nonzero, implement the default value of the action:
98ae9643
AD
796 `$$ = $1'. Otherwise, use the top of the stack.
797
e1f93869 798 Otherwise, the following line sets YYLHS.VALUE to garbage.
98ae9643
AD
799 This behavior is undocumented and Bison
800 users should not rely upon it. */
801 if (yylen)
e1f93869 802 yylhs.value = yystack_@{yylen - 1@}.value;
98ae9643 803 else
e1f93869 804 yylhs.value = yystack_@{0@}.value;])[
2ea7730c
AD
805]b4_locations_if([dnl
806[
8901f32e 807 // Compute the default @@$.
2b548aa6 808 {
bc0b0477 809 slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
e1f93869 810 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
2ea7730c 811 }]])[
8901f32e
AD
812
813 // Perform the reduction.
98ae9643 814 YY_REDUCE_PRINT (yyn);
ff601366 815 try
98ae9643 816 {
77a1a208
AD
817 switch (yyn)
818 {
30bb2edc 819]b4_user_actions[
77a1a208
AD
820 default:
821 break;
822 }
98ae9643 823 }
ff601366 824 catch (const syntax_error& yyexc)
77a1a208
AD
825 {
826 error (yyexc);
827 YYERROR;
828 }
1f7d007b 829 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
8901f32e 830]b4_variant_if([[
9c6a8966 831 // Destroy the rhs symbols.
8901f32e 832 for (int i = 0; i < yylen; ++i)
9c6a8966
AD
833 // Destroy a variant which value may have been swapped with
834 // yylhs.value (for instance if the action was "std::swap($$,
835 // $1)"). The value of yylhs.value (hence possibly one of these
5237cd1a 836 // rhs symbols) depends on the default construction for this
9c6a8966
AD
837 // type. In the case of pointers for instance, no
838 // initialization is done, so the value is junk. Therefore do
839 // not try to report the value of symbols about to be destroyed
840 // in the debug trace, it's possibly junk. Hence yymsg = 0.
841 // Besides, that keeps exactly the same traces as with the other
842 // Bison skeletons.
eeaf1dc6 843 yy_destroy_ (YY_NULL, yystack_[i]);]])[
98ae9643
AD
844
845 yypop_ (yylen);
a85284cf 846 yylen = 0;
98ae9643 847 YY_STACK_PRINT ();
98ae9643 848
ac826bc4 849 // Shift the result of the reduction.
eeaf1dc6 850 yypush_ (YY_NULL, yylhs);
98ae9643
AD
851 goto yynewstate;
852
9c6a8966
AD
853 /*--------------------------------------.
854 | yyerrlab -- here on detecting error. |
855 `--------------------------------------*/
98ae9643 856 yyerrlab:
ac826bc4 857 // If not already recovering from an error, report this error.
98ae9643
AD
858 if (!yyerrstatus_)
859 {
e9690142 860 ++yynerrs_;
710c4a65 861 error (]b4_join(b4_locations_if([yyla.location]),
d2060f06
JD
862 [[yysyntax_error_ (yystack_[0].state,
863 yyempty ? yyempty_ : yyla.type)]])[);
98ae9643
AD
864 }
865
2ea7730c 866]b4_locations_if([[
44c2b42d 867 yyerror_range[1].location = yyla.location;]])[
98ae9643
AD
868 if (yyerrstatus_ == 3)
869 {
e9690142 870 /* If just tried and failed to reuse lookahead token after an
27cb5b59
AD
871 error, discard it. */
872
ac826bc4 873 // Return failure if at end of input.
aba12ad1 874 if (yyla.type == yyeof_)
27cb5b59 875 YYABORT;
d59beda0 876 else if (!yyempty)
39be9022 877 {
27cb5b59 878 yy_destroy_ ("Error: discarding", yyla);
39be9022 879 yyempty = true;
e9690142 880 }
98ae9643
AD
881 }
882
ac826bc4 883 // Else will try to reuse lookahead token after shifting the error token.
98ae9643
AD
884 goto yyerrlab1;
885
886
887 /*---------------------------------------------------.
888 | yyerrorlab -- error raised explicitly by YYERROR. |
889 `---------------------------------------------------*/
890 yyerrorlab:
891
892 /* Pacify compilers like GCC when the user code never invokes
893 YYERROR and the label yyerrorlab therefore never appears in user
894 code. */
895 if (false)
c4dc4c46 896 goto yyerrorlab;]b4_locations_if([[
44c2b42d 897 yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
c4dc4c46
AD
898 /* $$ was initialized before running the user action. */
899 yy_destroy_ ("Error: discarding", yylhs);]])[
a85284cf 900 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 901 this YYERROR. */
98ae9643 902 yypop_ (yylen);
a85284cf 903 yylen = 0;
98ae9643
AD
904 goto yyerrlab1;
905
906 /*-------------------------------------------------------------.
907 | yyerrlab1 -- common code for both syntax error and YYERROR. |
908 `-------------------------------------------------------------*/
909 yyerrlab1:
ac826bc4 910 yyerrstatus_ = 3; // Each real token shifted decrements this.
e1f93869 911 {
bc0b0477 912 stack_symbol_type error_token;
e1f93869
AD
913 for (;;)
914 {
7580c379 915 yyn = yypact_[yystack_[0].state];
f2b30bdf 916 if (!yy_pact_value_is_default_ (yyn))
e1f93869
AD
917 {
918 yyn += yyterror_;
919 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
920 {
921 yyn = yytable_[yyn];
922 if (0 < yyn)
923 break;
924 }
925 }
98ae9643 926
e1f93869
AD
927 // Pop the current state because it cannot handle the error token.
928 if (yystack_.size () == 1)
929 YYABORT;
2ea7730c 930]b4_locations_if([[
44c2b42d 931 yyerror_range[1].location = yystack_[0].location;]])[
1f7d007b 932 yy_destroy_ ("Error: popping", yystack_[0]);
e1f93869 933 yypop_ ();
e1f93869
AD
934 YY_STACK_PRINT ();
935 }
2ea7730c 936]b4_locations_if([[
44c2b42d
JD
937 yyerror_range[2].location = yyla.location;
938 YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
e1f93869 939
ac826bc4 940 // Shift the error token.
7580c379 941 error_token.state = yyn;
e9b0834e 942 yypush_ ("Shifting", error_token);
e1f93869 943 }
98ae9643
AD
944 goto yynewstate;
945
ac826bc4 946 // Accept.
98ae9643
AD
947 yyacceptlab:
948 yyresult = 0;
949 goto yyreturn;
950
ac826bc4 951 // Abort.
98ae9643
AD
952 yyabortlab:
953 yyresult = 1;
954 goto yyreturn;
955
956 yyreturn:
39be9022 957 if (!yyempty)
1f7d007b 958 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
98ae9643 959
a85284cf 960 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 961 this YYABORT or YYACCEPT. */
a85284cf 962 yypop_ (yylen);
23d13411 963 while (1 < yystack_.size ())
98ae9643 964 {
e9690142
JD
965 yy_destroy_ ("Cleanup: popping", yystack_[0]);
966 yypop_ ();
98ae9643
AD
967 }
968
969 return yyresult;
970 }
7e1fabbe
AD
971 catch (...)
972 {
25a6ad2f
AD
973 YYCDEBUG << "Exception caught: cleaning lookahead and stack"
974 << std::endl;
975 // Do not try to display the values of the reclaimed symbols,
976 // as their printer might throw an exception.
23d13411
AD
977 if (!yyempty)
978 yy_destroy_ (YY_NULL, yyla);
7e1fabbe 979
23d13411 980 while (1 < yystack_.size ())
7e1fabbe 981 {
23d13411 982 yy_destroy_ (YY_NULL, yystack_[0]);
7e1fabbe
AD
983 yypop_ ();
984 }
985 throw;
986 }
98ae9643 987 }
2b548aa6 988
a6552c5d
AD
989 void
990 ]b4_parser_class_name[::error (const syntax_error& yyexc)
991 {
710c4a65 992 error (]b4_join(b4_locations_if([yyexc.location]),
a6552c5d
AD
993 [[yyexc.what()]])[);
994 }
995
98ae9643
AD
996 // Generate an error message.
997 std::string
422c18f4 998 ]b4_parser_class_name[::yysyntax_error_ (]dnl
ceb8b8e6 999b4_error_verbose_if([state_type yystate, int yytoken],
422c18f4 1000 [int, int])[)
25a648d8
JD
1001 {]b4_error_verbose_if([[
1002 std::string yyres;
d2060f06
JD
1003 // Number of reported tokens (one for the "unexpected", one per
1004 // "expected").
1005 size_t yycount = 0;
1006 // Its maximum.
1007 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1008 // Arguments of yyformat.
1009 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1010
1011 /* There are many possibilities here to consider:
1012 - If this state is a consistent state with a default action, then
1013 the only way this function was invoked is if the default action
1014 is an error action. In that case, don't check for expected
1015 tokens because there are none.
1016 - The only way there can be no lookahead present (in yytoken) is
1017 if this state is a consistent state with a default action.
1018 Thus, detecting the absence of a lookahead is sufficient to
1019 determine that there is no unexpected or expected token to
1020 report. In that case, just report a simple "syntax error".
1021 - Don't assume there isn't a lookahead just because this state is
1022 a consistent state with a default action. There might have
1023 been a previous inconsistent state, consistent state with a
1024 non-default action, or user semantic action that manipulated
1025 yyla. (However, yyla is currently not documented for users.)
1026 - Of course, the expected token list depends on states to have
1027 correct lookahead information, and it depends on the parser not
1028 to perform extra reductions after fetching a lookahead from the
1029 scanner and before detecting a syntax error. Thus, state
1030 merging (from LALR or IELR) and default reductions corrupt the
1031 expected token list. However, the list is correct for
1032 canonical LR with one exception: it will still contain any
1033 token that will not be accepted due to an error action in a
1034 later state.
1035 */
1036 if (yytoken != yyempty_)
98ae9643 1037 {
d2060f06
JD
1038 yyarg[yycount++] = yytname_[yytoken];
1039 int yyn = yypact_[yystate];
1040 if (!yy_pact_value_is_default_ (yyn))
1041 {
b4bbc4a0
JD
1042 /* Start YYX at -YYN if negative to avoid negative indexes in
1043 YYCHECK. In other words, skip the first -YYN actions for
1044 this state because they are default actions. */
1045 int yyxbegin = yyn < 0 ? -yyn : 0;
ac826bc4 1046 // Stay within bounds of both yycheck and yytname.
b4bbc4a0
JD
1047 int yychecklim = yylast_ - yyn + 1;
1048 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
b4bbc4a0
JD
1049 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
1050 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
1051 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
1052 {
1053 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1054 {
1055 yycount = 1;
1056 break;
1057 }
1058 else
1059 yyarg[yycount++] = yytname_[yyx];
1060 }
d2060f06
JD
1061 }
1062 }
a0ffc175 1063
ef51bfa7 1064 char const* yyformat = YY_NULL;
b4bbc4a0
JD
1065 switch (yycount)
1066 {
1067#define YYCASE_(N, S) \
1068 case N: \
1069 yyformat = S; \
1070 break
d2060f06 1071 YYCASE_(0, YY_("syntax error"));
b4bbc4a0
JD
1072 YYCASE_(1, YY_("syntax error, unexpected %s"));
1073 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1074 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1075 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1076 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
a0ffc175 1077#undef YYCASE_
98ae9643 1078 }
d2060f06 1079
b4bbc4a0
JD
1080 // Argument number.
1081 size_t yyi = 0;
1082 for (char const* yyp = yyformat; *yyp; ++yyp)
1083 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1084 {
1085 yyres += yytnamerr_ (yyarg[yyi++]);
1086 ++yyp;
1087 }
1088 else
1089 yyres += *yyp;
25a648d8
JD
1090 return yyres;]], [[
1091 return YY_("syntax error");]])[
98ae9643 1092 }
a08460b0 1093
5348bfbe 1094
98ae9643 1095 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
2b548aa6 1096
0fddb3d5
AD
1097 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1098
ba206cf4 1099]b4_parser_tables_define[
2b548aa6 1100
5f108727 1101]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
ac826bc4
AD
1102 // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1103 // First, the terminals, then, starting at \a yyntokens_, nonterminals.
98ae9643
AD
1104 const char*
1105 const ]b4_parser_class_name[::yytname_[] =
1106 {
8901f32e 1107 ]b4_tname[
98ae9643 1108 };
2b548aa6 1109
5f108727 1110]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
ba206cf4 1111]b4_integral_parser_table_define([rline], [b4_rline])[
5348bfbe 1112
98ae9643
AD
1113 // Print the state stack on the debug stream.
1114 void
1115 ]b4_parser_class_name[::yystack_print_ ()
1116 {
1117 *yycdebug_ << "Stack now";
8901f32e
AD
1118 for (stack_type::const_iterator
1119 i = yystack_.begin (),
1120 i_end = yystack_.end ();
e9690142 1121 i != i_end; ++i)
8901f32e 1122 *yycdebug_ << ' ' << i->state;
98ae9643
AD
1123 *yycdebug_ << std::endl;
1124 }
25f66e1a 1125
98ae9643
AD
1126 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1127 void
d1ff7a7c 1128 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
98ae9643
AD
1129 {
1130 unsigned int yylno = yyrline_[yyrule];
d1ff7a7c 1131 int yynrhs = yyr2_[yyrule];
ac826bc4 1132 // Print the symbols being reduced, and their result.
98ae9643 1133 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
e9690142 1134 << " (line " << yylno << "):" << std::endl;
ac826bc4 1135 // The symbols being reduced.
d1ff7a7c
AD
1136 for (int yyi = 0; yyi < yynrhs; yyi++)
1137 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1f7d007b 1138 ]b4_rhs_data(yynrhs, yyi + 1)[);
98ae9643 1139 }
5f108727 1140#endif // ]b4_api_PREFIX[DEBUG
69e2658b 1141
e36ec1f4 1142]b4_token_ctor_if([], [b4_yytranslate_define])[
793fbca5 1143]b4_namespace_close[
8901f32e 1144]b4_epilogue[]dnl
1c7ec959 1145b4_output_end()
064e42b0
AD
1146
1147
a9ce3f54 1148m4_popdef([b4_copyright_years])dnl