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