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