]> git.saurik.com Git - bison.git/blame - data/lalr1.cc
lalr1.cc: remove useless forward declaration.
[bison.git] / data / lalr1.cc
CommitLineData
60491a94 1# C++ skeleton for Bison
b4721715 2
e141f4d4 3# Copyright (C) 2002-2010 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],
6ab1adbe
AD
25[m4_ifval([$3], [b4_c_comment([$3], [ ])
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],
c4585f1e 101[m4_pushdef([b4_dollar_dollar],
2bde9113
AD
102 [b4_symbol_value_template([yysym.value],
103 b4_symbol_if([$1], [has_type],
104 [b4_symbol([$1], [type])]))])dnl
1f7d007b 105m4_pushdef([b4_at_dollar], [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
c4585f1e
AD
112m4_popdef([b4_at_dollar])dnl
113m4_popdef([b4_dollar_dollar])dnl
2bde9113
AD
114])])
115
2873fdf8 116
8901f32e 117m4_pushdef([b4_copyright_years],
e141f4d4 118 [2002-2010])
8901f32e 119
6afc30cc 120m4_define([b4_parser_class_name],
a4e25e1d 121 [b4_percent_define_get([[parser_class_name]])])
34376418
AD
122
123# The header is mandatory.
124b4_defines_if([],
5f340b48 125 [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
34376418 126
2ea7730c
AD
127b4_locations_if(
128[# Backward compatibility.
4626a15d 129m4_define([b4_location_constructors])
2ea7730c 130m4_include(b4_pkgdatadir/[location.cc])])
51bacae6 131m4_include(b4_pkgdatadir/[stack.hh])
507aa0e2 132b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
a5eb1ed2 133
b526ee61
AD
134# We do want M4 expansion after # for CPP macros.
135m4_changecom()
08af01c2 136m4_divert_push(0)dnl
c944f7f2 137@output(b4_spec_defines_file@)@
a9ce3f54 138b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
fb9712a9 139dnl FIXME: This is wrong, we want computed header guards.
8bb4c753 140[
af3412cd
PE
141/* C++ LALR(1) parser skeleton written by Akim Demaille. */
142
c5e3e510
AD
143#ifndef PARSER_HEADER_H
144# define PARSER_HEADER_H
2b548aa6 145
a4e25e1d 146]b4_percent_code_get([[requires]])[
aef3da86 147
0c90a1f5 148]b4_parse_assert_if([#include <cassert>])[
ff601366 149#include <stdexcept>
8d69a1a3 150#include <string>
717be197 151#include <iostream>
7799ef15 152]b4_locations_if([#include "location.hh"])[
fb9712a9 153#include "stack.hh"
50997c6e 154
793fbca5 155]b4_namespace_open[
5f5a90df 156]b4_variant_if([b4_variant_define])[
793fbca5 157]b4_namespace_close[
4162fa07 158
69e2658b
RA
159/* Enabling traces. */
160#ifndef YYDEBUG
fa819509 161# define YYDEBUG ]b4_parse_trace_if([1], [0])[
69e2658b
RA
162#endif
163
141f5793
PE
164/* Enabling verbose error messages. */
165#ifdef YYERROR_VERBOSE
166# undef YYERROR_VERBOSE
167# define YYERROR_VERBOSE 1
168#else
b3a2272a 169# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
69e2658b
RA
170#endif
171
141f5793
PE
172/* Enabling the token table. */
173#ifndef YYTOKEN_TABLE
174# define YYTOKEN_TABLE ]b4_token_table[
175#endif
176
2ea7730c
AD
177]b4_locations_if([dnl
178[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
b4a20338
AD
179 If N is 0, then set CURRENT to the empty location which ends
180 the previous symbol: RHS[0] (always defined). */
3fc16193 181
374f5a14 182#ifndef YYLLOC_DEFAULT
8901f32e
AD
183# define YYLLOC_DEFAULT(Current, Rhs, N) \
184do { \
185 if (N) \
186 { \
187 (Current).begin = (Rhs)[1].location.begin; \
188 (Current).end = (Rhs)[N].location.end; \
189 } \
190 else \
191 { \
192 (Current).begin = (Current).end = (Rhs)[0].location.end; \
193 } \
2a4647a3 194} while (false)
2ea7730c 195#endif]])[
374f5a14 196
793fbca5 197]b4_namespace_open[
3f3eed27 198
efeed023 199 /// A Bison parser.
07fed891 200 class ]b4_parser_class_name[
2b548aa6 201 {
fb9712a9 202 public:
4f84717d 203]b4_public_types_declare[
efeed023 204 /// Build a parser object.
98ae9643
AD
205 ]b4_parser_class_name[ (]b4_parse_param_decl[);
206 virtual ~]b4_parser_class_name[ ();
2b548aa6 207
f69a4142
AD
208 /// Parse.
209 /// \returns 0 iff parsing succeeded.
e019c247 210 virtual int parse ();
2b548aa6 211
52cbbe84 212#if YYDEBUG
f69a4142 213 /// The current debugging stream.
9a1e9989
AD
214 std::ostream& debug_stream () const;
215 /// Set the current debugging stream.
216 void set_debug_stream (std::ostream &);
217
a3cb6248
AD
218 /// Type for debugging levels.
219 typedef int debug_level_type;
220 /// The current debugging level.
221 debug_level_type debug_level () const;
222 /// Set the current debugging level.
223 void set_debug_level (debug_level_type l);
52cbbe84 224#endif
a3cb6248 225
2ea7730c
AD
226 /// Report a syntax error.]b4_locations_if([
227 /// \param loc where the syntax error is found.])[
efeed023 228 /// \param msg a description of the syntax error.
2ea7730c 229 virtual void error (]b4_locations_if([const location_type& loc, ])[const std::string& msg);
efeed023 230
49572920 231 private:
e019c247 232 /// State numbers.
f479c6c6 233 typedef int state_type;
2b548aa6 234
ceb8b8e6
AD
235 /// Generate an error message.
236 /// \param yystate the state where the error occurred.
237 /// \param yytoken the lookahead token.
238 virtual std::string yysyntax_error_ (state_type yystate, int yytoken);
239
7580c379
AD
240 /// Compute post-reduction state.
241 /// \param yystate the current state
242 /// \param yylhs the nonterminal to push on the stack
243 state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
244
f2b30bdf
JD
245 /// Whether the given \c yypact_ value indicates a defaulted state.
246 /// \param yyvalue the value to check
247 static bool yy_pact_value_is_default_ (int yyvalue);
248
249 /// Whether the given \c yytable_ value indicates a syntax error.
250 /// \param yyvalue the value to check
251 static bool yy_table_value_is_error_ (int yyvalue);
252
e019c247 253 /// Internal symbol numbers.
f479c6c6 254 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
617a8f12 255 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
617a8f12 256 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
efeed023 257
0fddb3d5 258 /* Tables. */
ba206cf4 259]b4_parser_tables_declare[
69e2658b 260
141f5793 261#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
efeed023 262 /// For a symbol, its name in clear.
9e0876fb 263 static const char* const yytname_[];
422c18f4 264#endif]b4_error_verbose_if([
9e0876fb 265
9e0876fb 266 /// Convert the symbol name \a n to a form suitable for a diagnostic.
422c18f4 267 static std::string yytnamerr_ (const char *n);])[
2b548aa6 268
69e2658b 269#if YYDEBUG
ba206cf4
AD
270]b4_integral_parser_table_declare([rline], [b4_rline],
271 [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
efeed023 272 /// Report on the debug stream that the rule \a r is going to be reduced.
d1ff7a7c 273 virtual void yy_reduce_print_ (int r);
efeed023 274 /// Print the state stack on the debug stream.
f69a4142 275 virtual void yystack_print_ ();
fa7b79c0
PE
276
277 /* Debugging. */
278 int yydebug_;
279 std::ostream* yycdebug_;
69e2658b 280#endif
2b548aa6 281
32c96bd7 282 /// Convert a scanner token number \a t to a symbol number.
1c4af381 283 static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t);
f69a4142 284
57295d14 285#if YYDEBUG
1f7d007b
AD
286 /// \brief Display a symbol type, value and location.
287 /// \param yyo The output stream.
288 /// \param yysym The symbol.
5de9c593
AD
289 template <typename Exact>
290 void yy_print_ (std::ostream& yyo,
291 const symbol_base_type<Exact>& yysym) const;
57295d14
AD
292#endif
293
1f7d007b
AD
294 /// \brief Reclaim the memory associated to a symbol.
295 /// \param yymsg Why this token is reclaimed.
296 /// If null, print nothing.
297 /// \param s The symbol.
5de9c593
AD
298 template <typename Exact>
299 inline void yy_destroy_ (const char* yymsg,
300 symbol_base_type<Exact>& yysym) const;
1f7d007b 301
2873fdf8 302 private:
1f7d007b 303 /// Element of the stack: a state and its attributes.
5de9c593 304 struct stack_symbol_type : symbol_base_type<stack_symbol_type>
1f7d007b 305 {
5de9c593
AD
306 /// The parent class.
307 typedef symbol_base_type<stack_symbol_type> super_type;
308
1f7d007b 309 /// Default constructor.
d3be4f6d 310 inline stack_symbol_type ();
1f7d007b
AD
311
312 /// Constructor.
2ea7730c
AD
313 inline stack_symbol_type (]b4_args([state_type s],
314 [const semantic_type& v],
315 b4_locations_if([const location_type& l]))[);
1f7d007b
AD
316
317 /// The state.
318 state_type state;
57295d14 319
2b08bceb 320 /// The type (corresponding to \a state).
5de9c593 321 inline int type_get_ () const;
1f7d007b 322 };
57295d14 323
8901f32e 324 /// Stack type.
bc0b0477 325 typedef stack<stack_symbol_type> stack_type;
8901f32e
AD
326
327 /// The stack.
328 stack_type yystack_;
329
7dedf26e 330 /// Push a new state on the stack.
9380cfd0
AD
331 /// \param m a debug message to display
332 /// if null, no trace is output.
e9b0834e
AD
333 /// \param s the symbol
334 /// \warning the contents of \a s.value is stolen.
bc0b0477 335 inline void yypush_ (const char* m, stack_symbol_type& s);
7dedf26e 336
1f7d007b
AD
337 /// Push a new look ahead token on the state on the stack.
338 /// \param m a debug message to display
339 /// if null, no trace is output.
340 /// \param s the state
341 /// \param sym the symbol (for its value and location).
342 /// \warning the contents of \a s.value is stolen.
343 inline void yypush_ (const char* m, state_type s, symbol_type& sym);
344
52d5733f 345 /// Pop \a n symbols the three stacks.
f69a4142 346 inline void yypop_ (unsigned int n = 1);
52d5733f 347
762a801e 348 /* Constants. */
914202bd
AD
349 enum
350 {
351 yyeof_ = 0,
352 yylast_ = ]b4_last[, //< Last index in yytable_.
353 yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols.
354 yyempty_ = -2,
355 yyfinal_ = ]b4_final_state_number[, //< Termination state number.
356 yyterror_ = 1,
357 yyerrcode_ = 256,
358 yyntokens_ = ]b4_tokens_number[, //< Number of tokens.
359 };
360
caf37a36 361]b4_parse_param_vars[
2b548aa6 362 };
1c4af381 363
5f5a90df 364]b4_lex_symbol_if([b4_yytranslate_define
0623bacc 365b4_public_types_define])[
793fbca5 366]b4_namespace_close[
2b548aa6 367
592d0b1e 368]b4_percent_define_flag_if([[global_tokens_and_yystype]],
fb9712a9
AD
369[b4_token_defines(b4_tokens)
370
371#ifndef YYSTYPE
9d9b8b70 372 /* Redirection for backward compatibility. */
793fbca5 373# define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
fb9712a9 374#endif
9bc0dd67 375])
a4e25e1d 376b4_percent_code_get([[provides]])[]dnl
9bc0dd67
JD
377
378[#endif /* ! defined PARSER_HEADER_H */]
a0d4650a 379@output(b4_parser_file_name@)@
a9ce3f54 380b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
a4e25e1d 381b4_percent_code_get([[top]])[]dnl
aa08666d 382m4_if(b4_prefix, [yy], [],
c5b95ccf
AD
383[
384// Take the name prefix into account.
9bc0dd67
JD
385#define yylex b4_prefix[]lex])[
386
387/* First part of user declarations. */
c944f7f2 388]b4_user_pre_prologue[
9bc0dd67 389
c944f7f2 390#include "@basename(]b4_spec_defines_file[@)"
50997c6e 391
fb9712a9 392/* User implementation prologue. */
8e0a5e9e 393]b4_user_post_prologue
a4e25e1d 394b4_percent_code_get[]dnl
fb9712a9 395
8e0a5e9e 396[#ifndef YY_
ae93128c 397# if defined YYENABLE_NLS && YYENABLE_NLS
30757c8c
PE
398# if ENABLE_NLS
399# include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
400# define YY_(msgid) dgettext ("bison-runtime", msgid)
401# endif
402# endif
403# ifndef YY_
404# define YY_(msgid) msgid
405# endif
989b5b8e
AD
406#endif
407
2a4647a3 408/* Suppress unused-variable warnings by "using" E. */
12ce2df6 409#define YYUSE(e) ((void) (e))
2a4647a3 410
2b548aa6 411/* Enable debugging if requested. */
50997c6e 412#if YYDEBUG
284acc8b 413
fa7b79c0
PE
414/* A pseudo ostream that takes yydebug_ into account. */
415# define YYCDEBUG if (yydebug_) (*yycdebug_)
416
1f7d007b 417# define YY_SYMBOL_PRINT(Title, Symbol) \
57295d14
AD
418 do { \
419 if (yydebug_) \
420 { \
421 *yycdebug_ << Title << ' '; \
1f7d007b 422 yy_print_ (*yycdebug_, Symbol); \
57295d14
AD
423 *yycdebug_ << std::endl; \
424 } \
8901f32e 425 } while (false)
284acc8b 426
5348bfbe 427# define YY_REDUCE_PRINT(Rule) \
8901f32e
AD
428 do { \
429 if (yydebug_) \
430 yy_reduce_print_ (Rule); \
431 } while (false)
284acc8b 432
25f66e1a 433# define YY_STACK_PRINT() \
8901f32e
AD
434 do { \
435 if (yydebug_) \
436 yystack_print_ (); \
437 } while (false)
284acc8b 438
2b548aa6 439#else /* !YYDEBUG */
284acc8b 440
a36b333c 441# define YYCDEBUG if (false) std::cerr
1f7d007b
AD
442# define YY_SYMBOL_PRINT(Title, Symbol) static_cast<void>(0)
443# define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
444# define YY_STACK_PRINT() static_cast<void>(0)
284acc8b 445
2b548aa6
RA
446#endif /* !YYDEBUG */
447
39be9022
AD
448#define yyerrok (yyerrstatus_ = 0)
449#define yyclearin (yyempty = true)
98e26a92 450
39be9022
AD
451#define YYACCEPT goto yyacceptlab
452#define YYABORT goto yyabortlab
453#define YYERROR goto yyerrorlab
98e26a92 454#define YYRECOVERING() (!!yyerrstatus_)
60a777aa 455
422c18f4 456]b4_namespace_open[]b4_error_verbose_if([[
9e0876fb 457
aa08666d
AD
458 /* Return YYSTR after stripping away unnecessary quotes and
459 backslashes, so that it's suitable for yyerror. The heuristic is
460 that double-quoting is unnecessary unless the string contains an
461 apostrophe, a comma, or backslash (other than backslash-backslash).
462 YYSTR is taken from yytname. */
463 std::string
464 ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
465 {
466 if (*yystr == '"')
467 {
468 std::string yyr = "";
469 char const *yyp = yystr;
193d7c70 470
aa08666d
AD
471 for (;;)
472 switch (*++yyp)
473 {
474 case '\'':
475 case ',':
476 goto do_not_strip_quotes;
193d7c70 477
aa08666d
AD
478 case '\\':
479 if (*++yyp != '\\')
480 goto do_not_strip_quotes;
481 /* Fall through. */
482 default:
483 yyr += *yyp;
484 break;
193d7c70 485
aa08666d
AD
486 case '"':
487 return yyr;
488 }
489 do_not_strip_quotes: ;
490 }
193d7c70 491
aa08666d
AD
492 return yystr;
493 }
422c18f4 494]])[
9e0876fb 495
98ae9643 496 /// Build a parser object.
fa7b79c0
PE
497 ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
498 :])[
499#if YYDEBUG
500 ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
501 yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
502#endif]b4_parse_param_cons[
98ae9643
AD
503 {
504 }
a0e68930 505
98ae9643
AD
506 ]b4_parser_class_name::~b4_parser_class_name[ ()
507 {
508 }
a0e68930 509
a0e68930 510
1f7d007b
AD
511 /*---------------.
512 | Symbol types. |
513 `---------------*/
514
0623bacc 515]b4_lex_symbol_if([], [b4_public_types_define])[
2873fdf8 516
1f7d007b
AD
517 // stack_symbol_type.
518 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
5de9c593
AD
519 : super_type ()
520 , state ()
1f7d007b
AD
521 {
522 }
523
2ea7730c
AD
524 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_args(
525 [state_type s],
526 [const semantic_type& v],
527 b4_locations_if([const location_type& l]))[)
528 : super_type (v]b4_locations_if([, l])[)
5de9c593 529 , state (s)
1f7d007b
AD
530 {
531 }
532
533 int
5de9c593 534 ]b4_parser_class_name[::stack_symbol_type::type_get_ () const
1f7d007b
AD
535 {
536 return yystos_[state];
537 }
538
539
5de9c593 540 template <typename Exact>
98ae9643 541 void
5de9c593
AD
542 ]b4_parser_class_name[::yy_destroy_ (const char* yymsg,
543 symbol_base_type<Exact>& yysym) const
98ae9643 544 {
1f7d007b 545 int yytype = yysym.type_get ();
98ae9643 546 YYUSE (yymsg);
8901f32e 547 if (yymsg)
1f7d007b 548 YY_SYMBOL_PRINT (yymsg, yysym);
98ae9643 549
8901f32e 550 // User destructor.
98ae9643
AD
551 switch (yytype)
552 {
e3c52a63 553]b4_symbol_foreach([b4_symbol_destructor])dnl
2bde9113
AD
554[ default:
555 break;
8901f32e
AD
556 }]b4_variant_if([
557
558 // Type destructor.
4c3cc7da 559 b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[
8901f32e
AD
560 }
561
1f7d007b 562#if YYDEBUG
5de9c593 563 template <typename Exact>
1f7d007b 564 void
5de9c593
AD
565 ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
566 const symbol_base_type<Exact>& yysym) const
8901f32e 567 {
1f7d007b
AD
568 int yytype = yysym.type_get ();
569 yyo << (yytype < yyntokens_ ? "token" : "nterm")
2ea7730c
AD
570 << ' ' << yytname_[yytype] << " ("]b4_locations_if([
571 << yysym.location << ": "])[;
1f7d007b
AD
572 switch (yytype)
573 {
e3c52a63 574]b4_symbol_foreach([b4_symbol_printer])dnl
2bde9113 575[ default:
1f7d007b
AD
576 break;
577 }
578 yyo << ')';
8901f32e 579 }
1f7d007b 580#endif
8901f32e 581
1f7d007b
AD
582 void
583 ]b4_parser_class_name[::yypush_ (const char* m, state_type s,
584 symbol_type& sym)
8901f32e 585 {
1f7d007b
AD
586 if (m)
587 YY_SYMBOL_PRINT (m, sym);
588]b4_variant_if(
2ea7730c
AD
589[[ yystack_.push (stack_symbol_type (]b4_args(
590 [s],
591 [semantic_type()],
592 b4_locations_if([sym.location]))[));
1f7d007b
AD
593 ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]],
594 [build], [sym.value])],
2ea7730c
AD
595[[ yystack_.push (stack_symbol_type (]b4_args(
596 [s],
597 [sym.value],
598 b4_locations_if([sym.location]))[));]])[
98ae9643 599 }
60a777aa 600
7dedf26e 601 void
bc0b0477 602 ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
7dedf26e 603 {
9380cfd0 604 if (m)
1f7d007b 605 YY_SYMBOL_PRINT (m, s);
8901f32e 606]b4_variant_if(
2ea7730c
AD
607[[ yystack_.push (stack_symbol_type (]b4_args(
608 [s.state],
609 [semantic_type()],
610 b4_locations_if([s.location]))[));
1f7d007b 611 ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]],
e9b0834e
AD
612 [build], [s.value])],
613[ yystack_.push (s);])[
7dedf26e
AD
614 }
615
98ae9643
AD
616 void
617 ]b4_parser_class_name[::yypop_ (unsigned int n)
618 {
8901f32e 619 yystack_.pop (n);
98ae9643 620 }
52d5733f 621
fa7b79c0 622#if YYDEBUG
98ae9643
AD
623 std::ostream&
624 ]b4_parser_class_name[::debug_stream () const
625 {
626 return *yycdebug_;
627 }
9a1e9989 628
98ae9643
AD
629 void
630 ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
631 {
632 yycdebug_ = &o;
633 }
9a1e9989
AD
634
635
98ae9643
AD
636 ]b4_parser_class_name[::debug_level_type
637 ]b4_parser_class_name[::debug_level () const
638 {
639 return yydebug_;
640 }
a3cb6248 641
98ae9643
AD
642 void
643 ]b4_parser_class_name[::set_debug_level (debug_level_type l)
644 {
645 yydebug_ = l;
646 }
fa7b79c0 647#endif
a3cb6248 648
7580c379
AD
649 inline ]b4_parser_class_name[::state_type
650 ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs)
651 {
652 int yyr = yypgoto_[yylhs - yyntokens_] + yystate;
653 if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
654 return yytable_[yyr];
655 else
656 return yydefgoto_[yylhs - yyntokens_];
657 }
658
f2b30bdf
JD
659 inline bool
660 ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
661 {
662 return yyvalue == yypact_ninf_;
663 }
664
665 inline bool
666 ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue)
667 {
aa0cb40d 668 return yyvalue == yytable_ninf_;
f2b30bdf
JD
669 }
670
98ae9643
AD
671 int
672 ]b4_parser_class_name[::parse ()
673 {
39be9022
AD
674 /// Whether yyla contains a lookahead.
675 bool yyempty = true;
d4fb5e3c 676
98ae9643
AD
677 /* State. */
678 int yyn;
a85284cf 679 int yylen = 0;
d4fb5e3c 680
9d9b8b70 681 /* Error handling. */
98ae9643
AD
682 int yynerrs_ = 0;
683 int yyerrstatus_ = 0;
dbcdae2d 684
6082531a 685 /// The lookahead symbol.
2ea7730c 686 symbol_type yyla;]b4_locations_if([[
6082531a 687
98ae9643 688 /// The locations where the error started and ended.
44c2b42d 689 stack_symbol_type yyerror_range[3];]])[
dbcdae2d 690
e1f93869 691 /// $$ and @@$.
bc0b0477 692 stack_symbol_type yylhs;
dbcdae2d 693
e1f93869 694 /// The return value of parse().
98ae9643 695 int yyresult;
ad745863 696
98ae9643 697 YYCDEBUG << "Starting parse" << std::endl;
451364ed 698
451364ed 699]m4_ifdef([b4_initial_action], [
6082531a
AD
700m4_pushdef([b4_at_dollar], [yyla.location])dnl
701m4_pushdef([b4_dollar_dollar], [yyla.value])dnl
9d9b8b70 702 /* User initialization code. */
8ec0a172 703 b4_user_initial_action
451364ed 704m4_popdef([b4_dollar_dollar])dnl
8ec0a172 705m4_popdef([b4_at_dollar])])dnl
451364ed 706
8901f32e 707 [ /* Initialize the stack. The initial state will be set in
98ae9643
AD
708 yynewstate, since the latter expects the semantical and the
709 location values to have been already stored, initialize these
710 stacks with a primary value. */
8901f32e 711 yystack_ = stack_type (0);
1f7d007b 712 yypush_ (0, 0, yyla);
98ae9643 713
7580c379 714 // A new symbol was pushed on the stack.
98ae9643 715 yynewstate:
7580c379 716 YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
868d2d96
JD
717
718 /* Accept? */
7580c379 719 if (yystack_[0].state == yyfinal_)
868d2d96
JD
720 goto yyacceptlab;
721
98ae9643
AD
722 goto yybackup;
723
724 /* Backup. */
725 yybackup:
726
742e4900 727 /* Try to take a decision without lookahead. */
7580c379 728 yyn = yypact_[yystack_[0].state];
f2b30bdf 729 if (yy_pact_value_is_default_ (yyn))
98ae9643
AD
730 goto yydefault;
731
742e4900 732 /* Read a lookahead token. */
39be9022 733 if (yyempty)
98ae9643 734 {
09277875
AD
735 YYCDEBUG << "Reading a token: ";
736]b4_lex_symbol_if(
dd735e4e
AD
737[ yyla = b4_c_function_call([yylex], [symbol_type],
738 m4_ifdef([b4_lex_param], b4_lex_param));],
09277875 739[ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int],
6082531a
AD
740 [[YYSTYPE*], [&yyla.value]][]dnl
741b4_locations_if([, [[location*], [&yyla.location]]])dnl
09277875 742m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
39be9022 743 yyempty = false;
98ae9643 744 }
aba12ad1 745 YY_SYMBOL_PRINT ("Next token is", yyla);
98ae9643 746
1f7d007b
AD
747 /* If the proper action on seeing token YYLA.TYPE is to reduce or
748 to detect an error, take that action. */
749 yyn += yyla.type;
750 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
98ae9643
AD
751 goto yydefault;
752
753 /* Reduce or error. */
754 yyn = yytable_[yyn];
755 if (yyn <= 0)
756 {
f2b30bdf 757 if (yy_table_value_is_error_ (yyn))
6082531a 758 goto yyerrlab;
02650b7f
PE
759 yyn = -yyn;
760 goto yyreduce;
98ae9643
AD
761 }
762
868d2d96 763 /* Discard the token being shifted. */
39be9022 764 yyempty = true;
98ae9643
AD
765
766 /* Count tokens shifted since error; after three, turn off error
767 status. */
768 if (yyerrstatus_)
769 --yyerrstatus_;
770
9380cfd0 771 /* Shift the lookahead token. */
7580c379 772 yypush_ ("Shifting", yyn, yyla);
98ae9643
AD
773 goto yynewstate;
774
775 /*-----------------------------------------------------------.
776 | yydefault -- do the default action for the current state. |
777 `-----------------------------------------------------------*/
778 yydefault:
7580c379 779 yyn = yydefact_[yystack_[0].state];
98ae9643
AD
780 if (yyn == 0)
781 goto yyerrlab;
782 goto yyreduce;
783
784 /*-----------------------------.
785 | yyreduce -- Do a reduction. |
786 `-----------------------------*/
787 yyreduce:
c4dc4c46 788 yylen = yyr2_[yyn];
7580c379 789 yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
5ab8c47b 790 /* Variants are always initialized to an empty instance of the
3eead995
AD
791 correct type. The default $$=$1 action is NOT applied when using
792 variants. */
c4dc4c46 793 b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[
a85284cf 794 /* If YYLEN is nonzero, implement the default value of the action:
98ae9643
AD
795 `$$ = $1'. Otherwise, use the top of the stack.
796
e1f93869 797 Otherwise, the following line sets YYLHS.VALUE to garbage.
98ae9643
AD
798 This behavior is undocumented and Bison
799 users should not rely upon it. */
800 if (yylen)
e1f93869 801 yylhs.value = yystack_@{yylen - 1@}.value;
98ae9643 802 else
e1f93869 803 yylhs.value = yystack_@{0@}.value;])[
2ea7730c
AD
804]b4_locations_if([dnl
805[
8901f32e 806 // Compute the default @@$.
2b548aa6 807 {
bc0b0477 808 slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
e1f93869 809 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
2ea7730c 810 }]])[
8901f32e
AD
811
812 // Perform the reduction.
98ae9643 813 YY_REDUCE_PRINT (yyn);
ff601366
AD
814 try
815 {
816 switch (yyn)
98ae9643 817 {
30bb2edc 818]b4_user_actions[
cf98343c
AD
819 default:
820 break;
98ae9643 821 }
ff601366
AD
822 }
823 catch (const syntax_error& yyexc)
824 {
825 error (]b4_args(b4_locations_if([yyexc.location]),
826 [[yyexc.what()]])[);
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
836 // rhs symbols) depends on the default contruction for this
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.
1f7d007b 843 yy_destroy_ (0, yystack_[i]);]])[
98ae9643
AD
844
845 yypop_ (yylen);
a85284cf 846 yylen = 0;
98ae9643 847 YY_STACK_PRINT ();
98ae9643
AD
848
849 /* Shift the result of the reduction. */
e9b0834e 850 yypush_ (0, yylhs);
98ae9643
AD
851 goto yynewstate;
852
9c6a8966
AD
853 /*--------------------------------------.
854 | yyerrlab -- here on detecting error. |
855 `--------------------------------------*/
98ae9643
AD
856 yyerrlab:
857 /* If not already recovering from an error, report this error. */
858 if (!yyerrstatus_)
859 {
02650b7f 860 ++yynerrs_;
2ea7730c 861 error (]b4_args(b4_locations_if([yyla.location]),
7580c379 862 [[yysyntax_error_ (yystack_[0].state, yyla.type)]])[);
98ae9643
AD
863 }
864
2ea7730c 865]b4_locations_if([[
44c2b42d 866 yyerror_range[1].location = yyla.location;]])[
98ae9643
AD
867 if (yyerrstatus_ == 3)
868 {
742e4900 869 /* If just tried and failed to reuse lookahead token after an
27cb5b59
AD
870 error, discard it. */
871
872 /* Return failure if at end of input. */
aba12ad1 873 if (yyla.type == yyeof_)
27cb5b59 874 YYABORT;
d59beda0 875 else if (!yyempty)
39be9022 876 {
27cb5b59 877 yy_destroy_ ("Error: discarding", yyla);
39be9022 878 yyempty = true;
02650b7f 879 }
98ae9643
AD
880 }
881
742e4900 882 /* Else will try to reuse lookahead token after shifting the error
98ae9643
AD
883 token. */
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:
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
AD
939
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
946 /* Accept. */
947 yyacceptlab:
948 yyresult = 0;
949 goto yyreturn;
950
951 /* Abort. */
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);
8901f32e 963 while (yystack_.size () != 1)
98ae9643 964 {
1f7d007b 965 yy_destroy_ ("Cleanup: popping", yystack_[0]);
02650b7f 966 yypop_ ();
98ae9643
AD
967 }
968
969 return yyresult;
970 }
2b548aa6 971
98ae9643
AD
972 // Generate an error message.
973 std::string
422c18f4 974 ]b4_parser_class_name[::yysyntax_error_ (]dnl
ceb8b8e6 975b4_error_verbose_if([state_type yystate, int yytoken],
422c18f4 976 [int, int])[)
98ae9643 977 {
422c18f4 978 std::string yyres;]b4_error_verbose_if([[
98ae9643 979 int yyn = yypact_[yystate];
d6645148 980 if (yypact_ninf_ < yyn && yyn <= yylast_)
98ae9643 981 {
02650b7f 982 /* Start YYX at -YYN if negative to avoid negative indexes in
87412882
JD
983 YYCHECK. In other words, skip the first -YYN actions for this
984 state because they are default actions. */
02650b7f
PE
985 int yyxbegin = yyn < 0 ? -yyn : 0;
986
987 /* Stay within bounds of both yycheck and yytname. */
d6645148 988 int yychecklim = yylast_ - yyn + 1;
02650b7f 989 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
a0ffc175 990
eeb29422
AD
991 // Number of reported tokens (one for the "unexpected", one per
992 // "expected").
a0ffc175
AD
993 size_t yycount = 0;
994 // Its maximum.
995 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
996 // Arguments of yyformat.
997 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
998 yyarg[yycount++] = yytname_[yytoken];
999 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
53f036ce 1000 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
f2b30bdf 1001 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
a0ffc175
AD
1002 {
1003 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1004 {
1005 yycount = 1;
1006 break;
1007 }
1008 else
1009 yyarg[yycount++] = yytname_[yyx];
1010 }
1011
1012 char const* yyformat = 0;
1013 switch (yycount)
1014 {
1015#define YYCASE_(N, S) \
1016 case N: \
1017 yyformat = S; \
1018 break
1019 YYCASE_(1, YY_("syntax error, unexpected %s"));
1020 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1021 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1022 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1023 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1024#undef YYCASE_
1025 }
1026 // Argument number.
1027 size_t yyi = 0;
1028 for (char const* yyp = yyformat; *yyp; ++yyp)
1029 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1030 {
1031 yyres += yytnamerr_ (yyarg[yyi++]);
1032 ++yyp;
1033 }
1034 else
1035 yyres += *yyp;
98ae9643
AD
1036 }
1037 else
422c18f4
AD
1038 ]])dnl
1039[ yyres = YY_("syntax error");
a0ffc175 1040 return yyres;
98ae9643 1041 }
a08460b0 1042
5348bfbe 1043
98ae9643 1044 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
2b548aa6 1045
0fddb3d5
AD
1046 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1047
ba206cf4 1048]b4_parser_tables_define[
2b548aa6 1049
141f5793 1050#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
98ae9643 1051 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
9d9b8b70 1052 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
98ae9643
AD
1053 const char*
1054 const ]b4_parser_class_name[::yytname_[] =
1055 {
8901f32e 1056 ]b4_tname[
98ae9643 1057 };
69e2658b 1058#endif
2b548aa6 1059
69e2658b 1060#if YYDEBUG
ba206cf4 1061]b4_integral_parser_table_define([rline], [b4_rline])[
5348bfbe 1062
98ae9643
AD
1063 // Print the state stack on the debug stream.
1064 void
1065 ]b4_parser_class_name[::yystack_print_ ()
1066 {
1067 *yycdebug_ << "Stack now";
8901f32e
AD
1068 for (stack_type::const_iterator
1069 i = yystack_.begin (),
1070 i_end = yystack_.end ();
1071 i != i_end; ++i)
1072 *yycdebug_ << ' ' << i->state;
98ae9643
AD
1073 *yycdebug_ << std::endl;
1074 }
25f66e1a 1075
98ae9643
AD
1076 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1077 void
d1ff7a7c 1078 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
98ae9643
AD
1079 {
1080 unsigned int yylno = yyrline_[yyrule];
d1ff7a7c 1081 int yynrhs = yyr2_[yyrule];
98ae9643
AD
1082 /* Print the symbols being reduced, and their result. */
1083 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
7cff04b5 1084 << " (line " << yylno << "):" << std::endl;
d1ff7a7c
AD
1085 /* The symbols being reduced. */
1086 for (int yyi = 0; yyi < yynrhs; yyi++)
1087 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1f7d007b 1088 ]b4_rhs_data(yynrhs, yyi + 1)[);
98ae9643 1089 }
5348bfbe 1090#endif // YYDEBUG
69e2658b 1091
5f5a90df 1092]b4_lex_symbol_if([], [b4_yytranslate_define])[
793fbca5 1093]b4_namespace_close[
8901f32e 1094]b4_epilogue[]dnl
08af01c2 1095m4_divert_pop(0)
a9ce3f54 1096m4_popdef([b4_copyright_years])dnl