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