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