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