]> git.saurik.com Git - bison.git/blame - data/lalr1.cc
%define: accept unquoted values.
[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)
0fddb3d5 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>])[
8d69a1a3 150#include <string>
717be197 151#include <iostream>
fb9712a9 152#include "stack.hh"
50997c6e 153
793fbca5 154]b4_namespace_open[
2ea7730c
AD
155]b4_locations_if([ class position;
156 class location;])[
5f5a90df 157]b4_variant_if([b4_variant_define])[
793fbca5 158]b4_namespace_close[
4162fa07 159
2ea7730c 160]b4_locations_if([#include "location.hh"])[
fc695704 161
69e2658b
RA
162/* Enabling traces. */
163#ifndef YYDEBUG
fa819509 164# define YYDEBUG ]b4_parse_trace_if([1], [0])[
69e2658b
RA
165#endif
166
141f5793
PE
167/* Enabling verbose error messages. */
168#ifdef YYERROR_VERBOSE
169# undef YYERROR_VERBOSE
170# define YYERROR_VERBOSE 1
171#else
b3a2272a 172# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
69e2658b
RA
173#endif
174
141f5793
PE
175/* Enabling the token table. */
176#ifndef YYTOKEN_TABLE
177# define YYTOKEN_TABLE ]b4_token_table[
178#endif
179
2ea7730c
AD
180]b4_locations_if([dnl
181[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
b4a20338
AD
182 If N is 0, then set CURRENT to the empty location which ends
183 the previous symbol: RHS[0] (always defined). */
3fc16193 184
374f5a14 185#ifndef YYLLOC_DEFAULT
8901f32e
AD
186# define YYLLOC_DEFAULT(Current, Rhs, N) \
187do { \
188 if (N) \
189 { \
190 (Current).begin = (Rhs)[1].location.begin; \
191 (Current).end = (Rhs)[N].location.end; \
192 } \
193 else \
194 { \
195 (Current).begin = (Current).end = (Rhs)[0].location.end; \
196 } \
2a4647a3 197} while (false)
2ea7730c 198#endif]])[
374f5a14 199
793fbca5 200]b4_namespace_open[
3f3eed27 201
efeed023 202 /// A Bison parser.
07fed891 203 class ]b4_parser_class_name[
2b548aa6 204 {
fb9712a9 205 public:
4f84717d 206]b4_public_types_declare[
efeed023 207 /// Build a parser object.
98ae9643
AD
208 ]b4_parser_class_name[ (]b4_parse_param_decl[);
209 virtual ~]b4_parser_class_name[ ();
2b548aa6 210
f69a4142
AD
211 /// Parse.
212 /// \returns 0 iff parsing succeeded.
e019c247 213 virtual int parse ();
2b548aa6 214
52cbbe84 215#if YYDEBUG
f69a4142 216 /// The current debugging stream.
9a1e9989
AD
217 std::ostream& debug_stream () const;
218 /// Set the current debugging stream.
219 void set_debug_stream (std::ostream &);
220
a3cb6248
AD
221 /// Type for debugging levels.
222 typedef int debug_level_type;
223 /// The current debugging level.
224 debug_level_type debug_level () const;
225 /// Set the current debugging level.
226 void set_debug_level (debug_level_type l);
52cbbe84 227#endif
a3cb6248 228
2ea7730c
AD
229 /// Report a syntax error.]b4_locations_if([
230 /// \param loc where the syntax error is found.])[
efeed023 231 /// \param msg a description of the syntax error.
2ea7730c 232 virtual void error (]b4_locations_if([const location_type& loc, ])[const std::string& msg);
efeed023 233
49572920 234 private:
e019c247 235 /// State numbers.
f479c6c6 236 typedef int state_type;
2b548aa6 237
ceb8b8e6
AD
238 /// Generate an error message.
239 /// \param yystate the state where the error occurred.
240 /// \param yytoken the lookahead token.
241 virtual std::string yysyntax_error_ (state_type yystate, int yytoken);
242
7580c379
AD
243 /// Compute post-reduction state.
244 /// \param yystate the current state
245 /// \param yylhs the nonterminal to push on the stack
246 state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
247
f2b30bdf
JD
248 /// Whether the given \c yypact_ value indicates a defaulted state.
249 /// \param yyvalue the value to check
250 static bool yy_pact_value_is_default_ (int yyvalue);
251
252 /// Whether the given \c yytable_ value indicates a syntax error.
253 /// \param yyvalue the value to check
254 static bool yy_table_value_is_error_ (int yyvalue);
255
e019c247 256 /// Internal symbol numbers.
f479c6c6 257 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
617a8f12 258 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
617a8f12 259 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
efeed023 260
0fddb3d5 261 /* Tables. */
ba206cf4 262]b4_parser_tables_declare[
69e2658b 263
141f5793 264#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
efeed023 265 /// For a symbol, its name in clear.
9e0876fb 266 static const char* const yytname_[];
422c18f4 267#endif]b4_error_verbose_if([
9e0876fb 268
9e0876fb 269 /// Convert the symbol name \a n to a form suitable for a diagnostic.
422c18f4 270 static std::string yytnamerr_ (const char *n);])[
2b548aa6 271
69e2658b 272#if YYDEBUG
ba206cf4
AD
273]b4_integral_parser_table_declare([rline], [b4_rline],
274 [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
efeed023 275 /// Report on the debug stream that the rule \a r is going to be reduced.
d1ff7a7c 276 virtual void yy_reduce_print_ (int r);
efeed023 277 /// Print the state stack on the debug stream.
f69a4142 278 virtual void yystack_print_ ();
fa7b79c0
PE
279
280 /* Debugging. */
281 int yydebug_;
282 std::ostream* yycdebug_;
69e2658b 283#endif
2b548aa6 284
32c96bd7 285 /// Convert a scanner token number \a t to a symbol number.
1c4af381 286 static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t);
f69a4142 287
57295d14 288#if YYDEBUG
1f7d007b
AD
289 /// \brief Display a symbol type, value and location.
290 /// \param yyo The output stream.
291 /// \param yysym The symbol.
5de9c593
AD
292 template <typename Exact>
293 void yy_print_ (std::ostream& yyo,
294 const symbol_base_type<Exact>& yysym) const;
57295d14
AD
295#endif
296
1f7d007b
AD
297 /// \brief Reclaim the memory associated to a symbol.
298 /// \param yymsg Why this token is reclaimed.
299 /// If null, print nothing.
300 /// \param s The symbol.
5de9c593
AD
301 template <typename Exact>
302 inline void yy_destroy_ (const char* yymsg,
303 symbol_base_type<Exact>& yysym) const;
1f7d007b 304
2873fdf8 305 private:
1f7d007b 306 /// Element of the stack: a state and its attributes.
5de9c593 307 struct stack_symbol_type : symbol_base_type<stack_symbol_type>
1f7d007b 308 {
5de9c593
AD
309 /// The parent class.
310 typedef symbol_base_type<stack_symbol_type> super_type;
311
1f7d007b 312 /// Default constructor.
d3be4f6d 313 inline stack_symbol_type ();
1f7d007b
AD
314
315 /// Constructor.
2ea7730c
AD
316 inline stack_symbol_type (]b4_args([state_type s],
317 [const semantic_type& v],
318 b4_locations_if([const location_type& l]))[);
1f7d007b
AD
319
320 /// The state.
321 state_type state;
57295d14 322
1f7d007b 323 /// Return the type corresponding to this state.
5de9c593 324 inline int type_get_ () const;
1f7d007b 325 };
57295d14 326
8901f32e 327 /// Stack type.
bc0b0477 328 typedef stack<stack_symbol_type> stack_type;
8901f32e
AD
329
330 /// The stack.
331 stack_type yystack_;
332
7dedf26e 333 /// Push a new state on the stack.
9380cfd0
AD
334 /// \param m a debug message to display
335 /// if null, no trace is output.
e9b0834e
AD
336 /// \param s the symbol
337 /// \warning the contents of \a s.value is stolen.
bc0b0477 338 inline void yypush_ (const char* m, stack_symbol_type& s);
7dedf26e 339
1f7d007b
AD
340 /// Push a new look ahead token on the state on the stack.
341 /// \param m a debug message to display
342 /// if null, no trace is output.
343 /// \param s the state
344 /// \param sym the symbol (for its value and location).
345 /// \warning the contents of \a s.value is stolen.
346 inline void yypush_ (const char* m, state_type s, symbol_type& sym);
347
52d5733f 348 /// Pop \a n symbols the three stacks.
f69a4142 349 inline void yypop_ (unsigned int n = 1);
52d5733f 350
762a801e 351 /* Constants. */
914202bd
AD
352 enum
353 {
354 yyeof_ = 0,
355 yylast_ = ]b4_last[, //< Last index in yytable_.
356 yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols.
357 yyempty_ = -2,
358 yyfinal_ = ]b4_final_state_number[, //< Termination state number.
359 yyterror_ = 1,
360 yyerrcode_ = 256,
361 yyntokens_ = ]b4_tokens_number[, //< Number of tokens.
362 };
363
caf37a36 364]b4_parse_param_vars[
2b548aa6 365 };
1c4af381 366
5f5a90df 367]b4_lex_symbol_if([b4_yytranslate_define
0623bacc 368b4_public_types_define])[
793fbca5 369]b4_namespace_close[
2b548aa6 370
592d0b1e 371]b4_percent_define_flag_if([[global_tokens_and_yystype]],
fb9712a9
AD
372[b4_token_defines(b4_tokens)
373
374#ifndef YYSTYPE
9d9b8b70 375 /* Redirection for backward compatibility. */
793fbca5 376# define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
fb9712a9 377#endif
9bc0dd67 378])
a4e25e1d 379b4_percent_code_get([[provides]])[]dnl
9bc0dd67
JD
380
381[#endif /* ! defined PARSER_HEADER_H */]
a0d4650a 382@output(b4_parser_file_name@)@
a9ce3f54 383b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
a4e25e1d 384b4_percent_code_get([[top]])[]dnl
aa08666d 385m4_if(b4_prefix, [yy], [],
c5b95ccf
AD
386[
387// Take the name prefix into account.
9bc0dd67
JD
388#define yylex b4_prefix[]lex])[
389
390/* First part of user declarations. */
c944f7f2 391]b4_user_pre_prologue[
9bc0dd67 392
c944f7f2 393#include "@basename(]b4_spec_defines_file[@)"
50997c6e 394
fb9712a9 395/* User implementation prologue. */
8e0a5e9e 396]b4_user_post_prologue
a4e25e1d 397b4_percent_code_get[]dnl
fb9712a9 398
8e0a5e9e 399[#ifndef YY_
30757c8c
PE
400# if YYENABLE_NLS
401# if ENABLE_NLS
402# include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
403# define YY_(msgid) dgettext ("bison-runtime", msgid)
404# endif
405# endif
406# ifndef YY_
407# define YY_(msgid) msgid
408# endif
989b5b8e
AD
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.
2ea7730c 692 stack_symbol_type yyerror_range[2];]])[
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
AD
816 YY_REDUCE_PRINT (yyn);
817 switch (yyn)
818 {
30bb2edc 819]b4_user_actions[
cf98343c
AD
820 default:
821 break;
98ae9643 822 }
1f7d007b 823 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
8901f32e 824]b4_variant_if([[
9c6a8966 825 // Destroy the rhs symbols.
8901f32e 826 for (int i = 0; i < yylen; ++i)
9c6a8966
AD
827 // Destroy a variant which value may have been swapped with
828 // yylhs.value (for instance if the action was "std::swap($$,
829 // $1)"). The value of yylhs.value (hence possibly one of these
830 // rhs symbols) depends on the default contruction for this
831 // type. In the case of pointers for instance, no
832 // initialization is done, so the value is junk. Therefore do
833 // not try to report the value of symbols about to be destroyed
834 // in the debug trace, it's possibly junk. Hence yymsg = 0.
835 // Besides, that keeps exactly the same traces as with the other
836 // Bison skeletons.
1f7d007b 837 yy_destroy_ (0, yystack_[i]);]])[
98ae9643
AD
838
839 yypop_ (yylen);
a85284cf 840 yylen = 0;
98ae9643 841 YY_STACK_PRINT ();
98ae9643
AD
842
843 /* Shift the result of the reduction. */
e9b0834e 844 yypush_ (0, yylhs);
98ae9643
AD
845 goto yynewstate;
846
9c6a8966
AD
847 /*--------------------------------------.
848 | yyerrlab -- here on detecting error. |
849 `--------------------------------------*/
98ae9643
AD
850 yyerrlab:
851 /* If not already recovering from an error, report this error. */
852 if (!yyerrstatus_)
853 {
02650b7f 854 ++yynerrs_;
2ea7730c 855 error (]b4_args(b4_locations_if([yyla.location]),
7580c379 856 [[yysyntax_error_ (yystack_[0].state, yyla.type)]])[);
98ae9643
AD
857 }
858
2ea7730c
AD
859]b4_locations_if([[
860 yyerror_range[0].location = yyla.location;]])[
98ae9643
AD
861 if (yyerrstatus_ == 3)
862 {
742e4900 863 /* If just tried and failed to reuse lookahead token after an
27cb5b59
AD
864 error, discard it. */
865
866 /* Return failure if at end of input. */
aba12ad1 867 if (yyla.type == yyeof_)
27cb5b59
AD
868 YYABORT;
869 else
39be9022 870 {
27cb5b59 871 yy_destroy_ ("Error: discarding", yyla);
39be9022 872 yyempty = true;
02650b7f 873 }
98ae9643
AD
874 }
875
742e4900 876 /* Else will try to reuse lookahead token after shifting the error
98ae9643
AD
877 token. */
878 goto yyerrlab1;
879
880
881 /*---------------------------------------------------.
882 | yyerrorlab -- error raised explicitly by YYERROR. |
883 `---------------------------------------------------*/
884 yyerrorlab:
885
886 /* Pacify compilers like GCC when the user code never invokes
887 YYERROR and the label yyerrorlab therefore never appears in user
888 code. */
889 if (false)
c4dc4c46
AD
890 goto yyerrorlab;]b4_locations_if([[
891 yyerror_range[0].location = yystack_[yylen - 1].location;]])b4_variant_if([[
892 /* $$ was initialized before running the user action. */
893 yy_destroy_ ("Error: discarding", yylhs);]])[
a85284cf 894 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 895 this YYERROR. */
98ae9643 896 yypop_ (yylen);
a85284cf 897 yylen = 0;
98ae9643
AD
898 goto yyerrlab1;
899
900 /*-------------------------------------------------------------.
901 | yyerrlab1 -- common code for both syntax error and YYERROR. |
902 `-------------------------------------------------------------*/
903 yyerrlab1:
904 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
e1f93869 905 {
bc0b0477 906 stack_symbol_type error_token;
e1f93869
AD
907 for (;;)
908 {
7580c379 909 yyn = yypact_[yystack_[0].state];
f2b30bdf 910 if (!yy_pact_value_is_default_ (yyn))
e1f93869
AD
911 {
912 yyn += yyterror_;
913 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
914 {
915 yyn = yytable_[yyn];
916 if (0 < yyn)
917 break;
918 }
919 }
98ae9643 920
e1f93869
AD
921 // Pop the current state because it cannot handle the error token.
922 if (yystack_.size () == 1)
923 YYABORT;
2ea7730c
AD
924]b4_locations_if([[
925 yyerror_range[0].location = yystack_[0].location;]])[
1f7d007b 926 yy_destroy_ ("Error: popping", yystack_[0]);
e1f93869 927 yypop_ ();
e1f93869
AD
928 YY_STACK_PRINT ();
929 }
2ea7730c 930]b4_locations_if([[
6082531a 931 yyerror_range[1].location = yyla.location;
2ea7730c 932 YYLLOC_DEFAULT (error_token.location, (yyerror_range - 1), 2);]])[
e1f93869
AD
933
934 /* Shift the error token. */
7580c379 935 error_token.state = yyn;
e9b0834e 936 yypush_ ("Shifting", error_token);
e1f93869 937 }
98ae9643
AD
938 goto yynewstate;
939
940 /* Accept. */
941 yyacceptlab:
942 yyresult = 0;
943 goto yyreturn;
944
945 /* Abort. */
946 yyabortlab:
947 yyresult = 1;
948 goto yyreturn;
949
950 yyreturn:
39be9022 951 if (!yyempty)
1f7d007b 952 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
98ae9643 953
a85284cf 954 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 955 this YYABORT or YYACCEPT. */
a85284cf 956 yypop_ (yylen);
8901f32e 957 while (yystack_.size () != 1)
98ae9643 958 {
1f7d007b 959 yy_destroy_ ("Cleanup: popping", yystack_[0]);
02650b7f 960 yypop_ ();
98ae9643
AD
961 }
962
963 return yyresult;
964 }
2b548aa6 965
98ae9643
AD
966 // Generate an error message.
967 std::string
422c18f4 968 ]b4_parser_class_name[::yysyntax_error_ (]dnl
ceb8b8e6 969b4_error_verbose_if([state_type yystate, int yytoken],
422c18f4 970 [int, int])[)
98ae9643 971 {
422c18f4 972 std::string yyres;]b4_error_verbose_if([[
98ae9643 973 int yyn = yypact_[yystate];
d6645148 974 if (yypact_ninf_ < yyn && yyn <= yylast_)
98ae9643 975 {
02650b7f 976 /* Start YYX at -YYN if negative to avoid negative indexes in
87412882
JD
977 YYCHECK. In other words, skip the first -YYN actions for this
978 state because they are default actions. */
02650b7f
PE
979 int yyxbegin = yyn < 0 ? -yyn : 0;
980
981 /* Stay within bounds of both yycheck and yytname. */
d6645148 982 int yychecklim = yylast_ - yyn + 1;
02650b7f 983 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
a0ffc175 984
eeb29422
AD
985 // Number of reported tokens (one for the "unexpected", one per
986 // "expected").
a0ffc175
AD
987 size_t yycount = 0;
988 // Its maximum.
989 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
990 // Arguments of yyformat.
991 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
992 yyarg[yycount++] = yytname_[yytoken];
993 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
53f036ce 994 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
f2b30bdf 995 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
a0ffc175
AD
996 {
997 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
998 {
999 yycount = 1;
1000 break;
1001 }
1002 else
1003 yyarg[yycount++] = yytname_[yyx];
1004 }
1005
1006 char const* yyformat = 0;
1007 switch (yycount)
1008 {
1009#define YYCASE_(N, S) \
1010 case N: \
1011 yyformat = S; \
1012 break
1013 YYCASE_(1, YY_("syntax error, unexpected %s"));
1014 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1015 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1016 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1017 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1018#undef YYCASE_
1019 }
1020 // Argument number.
1021 size_t yyi = 0;
1022 for (char const* yyp = yyformat; *yyp; ++yyp)
1023 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1024 {
1025 yyres += yytnamerr_ (yyarg[yyi++]);
1026 ++yyp;
1027 }
1028 else
1029 yyres += *yyp;
98ae9643
AD
1030 }
1031 else
422c18f4
AD
1032 ]])dnl
1033[ yyres = YY_("syntax error");
a0ffc175 1034 return yyres;
98ae9643 1035 }
a08460b0 1036
5348bfbe 1037
98ae9643 1038 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
2b548aa6 1039
0fddb3d5
AD
1040 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1041
ba206cf4 1042]b4_parser_tables_define[
2b548aa6 1043
141f5793 1044#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
98ae9643 1045 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
9d9b8b70 1046 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
98ae9643
AD
1047 const char*
1048 const ]b4_parser_class_name[::yytname_[] =
1049 {
8901f32e 1050 ]b4_tname[
98ae9643 1051 };
69e2658b 1052#endif
2b548aa6 1053
69e2658b 1054#if YYDEBUG
ba206cf4 1055]b4_integral_parser_table_define([rline], [b4_rline])[
5348bfbe 1056
98ae9643
AD
1057 // Print the state stack on the debug stream.
1058 void
1059 ]b4_parser_class_name[::yystack_print_ ()
1060 {
1061 *yycdebug_ << "Stack now";
8901f32e
AD
1062 for (stack_type::const_iterator
1063 i = yystack_.begin (),
1064 i_end = yystack_.end ();
1065 i != i_end; ++i)
1066 *yycdebug_ << ' ' << i->state;
98ae9643
AD
1067 *yycdebug_ << std::endl;
1068 }
25f66e1a 1069
98ae9643
AD
1070 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1071 void
d1ff7a7c 1072 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
98ae9643
AD
1073 {
1074 unsigned int yylno = yyrline_[yyrule];
d1ff7a7c 1075 int yynrhs = yyr2_[yyrule];
98ae9643
AD
1076 /* Print the symbols being reduced, and their result. */
1077 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
7cff04b5 1078 << " (line " << yylno << "):" << std::endl;
d1ff7a7c
AD
1079 /* The symbols being reduced. */
1080 for (int yyi = 0; yyi < yynrhs; yyi++)
1081 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1f7d007b 1082 ]b4_rhs_data(yynrhs, yyi + 1)[);
98ae9643 1083 }
5348bfbe 1084#endif // YYDEBUG
69e2658b 1085
5f5a90df 1086]b4_lex_symbol_if([], [b4_yytranslate_define])[
793fbca5 1087]b4_namespace_close[
8901f32e 1088]b4_epilogue[]dnl
08af01c2 1089m4_divert_pop(0)
a9ce3f54 1090m4_popdef([b4_copyright_years])dnl