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