]> git.saurik.com Git - bison.git/blob - data/lalr1.cc
9ab9421e2f799589618deea12ee66161c888a472
[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 yytoken the lookahead token type, or empty_symbol.
218 virtual std::string yysyntax_error_ (state_type yystate,
219 symbol_number_type yytoken) 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 (yyempty = true)
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 /// Whether yyla contains a lookahead.
719 bool yyempty = true;
720
721 /// The lookahead symbol.
722 symbol_type yyla;]b4_locations_if([[
723
724 /// The locations where the error started and ended.
725 stack_symbol_type yyerror_range[3];]])[
726
727 /// The return value of parse ().
728 int yyresult;
729
730 // FIXME: This shoud be completely indented. It is not yet to
731 // avoid gratuitous conflicts when merging into the master branch.
732 try
733 {
734 YYCDEBUG << "Starting parse" << std::endl;
735
736 ]m4_ifdef([b4_initial_action], [
737 b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl
738 // User initialization code.
739 b4_user_initial_action
740 b4_dollar_popdef])[]dnl
741
742 [ /* Initialize the stack. The initial state will be set in
743 yynewstate, since the latter expects the semantical and the
744 location values to have been already stored, initialize these
745 stacks with a primary value. */
746 yystack_.clear ();
747 yypush_ (YY_NULLPTR, 0, yyla);
748
749 // A new symbol was pushed on the stack.
750 yynewstate:
751 YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
752
753 // Accept?
754 if (yystack_[0].state == yyfinal_)
755 goto yyacceptlab;
756
757 goto yybackup;
758
759 // Backup.
760 yybackup:
761
762 // Try to take a decision without lookahead.
763 yyn = yypact_[yystack_[0].state];
764 if (yy_pact_value_is_default_ (yyn))
765 goto yydefault;
766
767 // Read a lookahead token.
768 if (yyempty)
769 {
770 YYCDEBUG << "Reading a token: ";
771 try
772 {]b4_token_ctor_if([[
773 symbol_type yylookahead (]b4_lex[);
774 yyla.move (yylookahead);]], [[
775 yyla.type = yytranslate_ (]b4_lex[);]])[
776 }
777 catch (const syntax_error& yyexc)
778 {
779 error (yyexc);
780 goto yyerrlab1;
781 }
782 yyempty = false;
783 }
784 YY_SYMBOL_PRINT ("Next token is", yyla);
785
786 /* If the proper action on seeing token YYLA.TYPE is to reduce or
787 to detect an error, take that action. */
788 yyn += yyla.type_get ();
789 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ())
790 goto yydefault;
791
792 // Reduce or error.
793 yyn = yytable_[yyn];
794 if (yyn <= 0)
795 {
796 if (yy_table_value_is_error_ (yyn))
797 goto yyerrlab;
798 yyn = -yyn;
799 goto yyreduce;
800 }
801
802 // Discard the token being shifted.
803 yyempty = true;
804
805 // Count tokens shifted since error; after three, turn off error status.
806 if (yyerrstatus_)
807 --yyerrstatus_;
808
809 // Shift the lookahead token.
810 yypush_ ("Shifting", yyn, yyla);
811 goto yynewstate;
812
813 /*-----------------------------------------------------------.
814 | yydefault -- do the default action for the current state. |
815 `-----------------------------------------------------------*/
816 yydefault:
817 yyn = yydefact_[yystack_[0].state];
818 if (yyn == 0)
819 goto yyerrlab;
820 goto yyreduce;
821
822 /*-----------------------------.
823 | yyreduce -- Do a reduction. |
824 `-----------------------------*/
825 yyreduce:
826 yylen = yyr2_[yyn];
827 {
828 stack_symbol_type yylhs;
829 yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
830 /* Variants are always initialized to an empty instance of the
831 correct type. The default '$$ = $1' action is NOT applied
832 when using variants. */
833 b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])], [
834 /* If YYLEN is nonzero, implement the default value of the
835 action: '$$ = $1'. Otherwise, use the top of the stack.
836
837 Otherwise, the following line sets YYLHS.VALUE to garbage.
838 This behavior is undocumented and Bison users should not rely
839 upon it. */
840 if (yylen)
841 yylhs.value = yystack_@{yylen - 1@}.value;
842 else
843 yylhs.value = yystack_@{0@}.value;])[
844 ]b4_locations_if([dnl
845 [
846 // Compute the default @@$.
847 {
848 slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
849 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
850 }]])[
851
852 // Perform the reduction.
853 YY_REDUCE_PRINT (yyn);
854 try
855 {
856 switch (yyn)
857 {
858 ]b4_user_actions[
859 default:
860 break;
861 }
862 }
863 catch (const syntax_error& yyexc)
864 {
865 error (yyexc);
866 YYERROR;
867 }
868 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
869 yypop_ (yylen);
870 yylen = 0;
871 YY_STACK_PRINT ();
872
873 // Shift the result of the reduction.
874 yypush_ (YY_NULLPTR, yylhs);
875 }
876 goto yynewstate;
877
878 /*--------------------------------------.
879 | yyerrlab -- here on detecting error. |
880 `--------------------------------------*/
881 yyerrlab:
882 // If not already recovering from an error, report this error.
883 if (!yyerrstatus_)
884 {
885 ++yynerrs_;
886 error (]b4_join(b4_locations_if([yyla.location]),
887 [[yysyntax_error_ (yystack_[0].state,
888 yyempty ? empty_symbol : yyla.type_get ())]])[);
889 }
890
891 ]b4_locations_if([[
892 yyerror_range[1].location = yyla.location;]])[
893 if (yyerrstatus_ == 3)
894 {
895 /* If just tried and failed to reuse lookahead token after an
896 error, discard it. */
897
898 // Return failure if at end of input.
899 if (yyla.type_get () == yyeof_)
900 YYABORT;
901 else if (!yyempty)
902 {
903 yy_destroy_ ("Error: discarding", yyla);
904 yyempty = true;
905 }
906 }
907
908 // Else will try to reuse lookahead token after shifting the error token.
909 goto yyerrlab1;
910
911
912 /*---------------------------------------------------.
913 | yyerrorlab -- error raised explicitly by YYERROR. |
914 `---------------------------------------------------*/
915 yyerrorlab:
916
917 /* Pacify compilers like GCC when the user code never invokes
918 YYERROR and the label yyerrorlab therefore never appears in user
919 code. */
920 if (false)
921 goto yyerrorlab;]b4_locations_if([[
922 yyerror_range[1].location = yystack_[yylen - 1].location;]])[
923 /* Do not reclaim the symbols of the rule whose action triggered
924 this YYERROR. */
925 yypop_ (yylen);
926 yylen = 0;
927 goto yyerrlab1;
928
929 /*-------------------------------------------------------------.
930 | yyerrlab1 -- common code for both syntax error and YYERROR. |
931 `-------------------------------------------------------------*/
932 yyerrlab1:
933 yyerrstatus_ = 3; // Each real token shifted decrements this.
934 {
935 stack_symbol_type error_token;
936 for (;;)
937 {
938 yyn = yypact_[yystack_[0].state];
939 if (!yy_pact_value_is_default_ (yyn))
940 {
941 yyn += yyterror_;
942 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
943 {
944 yyn = yytable_[yyn];
945 if (0 < yyn)
946 break;
947 }
948 }
949
950 // Pop the current state because it cannot handle the error token.
951 if (yystack_.size () == 1)
952 YYABORT;
953 ]b4_locations_if([[
954 yyerror_range[1].location = yystack_[0].location;]])[
955 yy_destroy_ ("Error: popping", yystack_[0]);
956 yypop_ ();
957 YY_STACK_PRINT ();
958 }
959 ]b4_locations_if([[
960 yyerror_range[2].location = yyla.location;
961 YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
962
963 // Shift the error token.
964 error_token.state = yyn;
965 yypush_ ("Shifting", error_token);
966 }
967 goto yynewstate;
968
969 // Accept.
970 yyacceptlab:
971 yyresult = 0;
972 goto yyreturn;
973
974 // Abort.
975 yyabortlab:
976 yyresult = 1;
977 goto yyreturn;
978
979 yyreturn:
980 if (!yyempty)
981 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
982
983 /* Do not reclaim the symbols of the rule whose action triggered
984 this YYABORT or YYACCEPT. */
985 yypop_ (yylen);
986 while (1 < yystack_.size ())
987 {
988 yy_destroy_ ("Cleanup: popping", yystack_[0]);
989 yypop_ ();
990 }
991
992 return yyresult;
993 }
994 catch (...)
995 {
996 YYCDEBUG << "Exception caught: cleaning lookahead and stack"
997 << std::endl;
998 // Do not try to display the values of the reclaimed symbols,
999 // as their printer might throw an exception.
1000 if (!yyempty)
1001 yy_destroy_ (YY_NULLPTR, yyla);
1002
1003 while (1 < yystack_.size ())
1004 {
1005 yy_destroy_ (YY_NULLPTR, yystack_[0]);
1006 yypop_ ();
1007 }
1008 throw;
1009 }
1010 }
1011
1012 void
1013 ]b4_parser_class_name[::error (const syntax_error& yyexc)
1014 {
1015 error (]b4_join(b4_locations_if([yyexc.location]),
1016 [[yyexc.what()]])[);
1017 }
1018
1019 // Generate an error message.
1020 std::string
1021 ]b4_parser_class_name[::yysyntax_error_ (]dnl
1022 b4_error_verbose_if([state_type yystate, symbol_number_type yytoken],
1023 [state_type, symbol_number_type])[) const
1024 {]b4_error_verbose_if([[
1025 // Number of reported tokens (one for the "unexpected", one per
1026 // "expected").
1027 size_t yycount = 0;
1028 // Its maximum.
1029 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1030 // Arguments of yyformat.
1031 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1032
1033 /* There are many possibilities here to consider:
1034 - If this state is a consistent state with a default action, then
1035 the only way this function was invoked is if the default action
1036 is an error action. In that case, don't check for expected
1037 tokens because there are none.
1038 - The only way there can be no lookahead present (in yytoken) is
1039 if this state is a consistent state with a default action.
1040 Thus, detecting the absence of a lookahead is sufficient to
1041 determine that there is no unexpected or expected token to
1042 report. In that case, just report a simple "syntax error".
1043 - Don't assume there isn't a lookahead just because this state is
1044 a consistent state with a default action. There might have
1045 been a previous inconsistent state, consistent state with a
1046 non-default action, or user semantic action that manipulated
1047 yyla. (However, yyla is currently not documented for users.)
1048 - Of course, the expected token list depends on states to have
1049 correct lookahead information, and it depends on the parser not
1050 to perform extra reductions after fetching a lookahead from the
1051 scanner and before detecting a syntax error. Thus, state
1052 merging (from LALR or IELR) and default reductions corrupt the
1053 expected token list. However, the list is correct for
1054 canonical LR with one exception: it will still contain any
1055 token that will not be accepted due to an error action in a
1056 later state.
1057 */
1058 if (yytoken != empty_symbol)
1059 {
1060 yyarg[yycount++] = yytname_[yytoken];
1061 int yyn = yypact_[yystate];
1062 if (!yy_pact_value_is_default_ (yyn))
1063 {
1064 /* Start YYX at -YYN if negative to avoid negative indexes in
1065 YYCHECK. In other words, skip the first -YYN actions for
1066 this state because they are default actions. */
1067 int yyxbegin = yyn < 0 ? -yyn : 0;
1068 // Stay within bounds of both yycheck and yytname.
1069 int yychecklim = yylast_ - yyn + 1;
1070 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
1071 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
1072 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
1073 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
1074 {
1075 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1076 {
1077 yycount = 1;
1078 break;
1079 }
1080 else
1081 yyarg[yycount++] = yytname_[yyx];
1082 }
1083 }
1084 }
1085
1086 char const* yyformat = YY_NULLPTR;
1087 switch (yycount)
1088 {
1089 #define YYCASE_(N, S) \
1090 case N: \
1091 yyformat = S; \
1092 break
1093 YYCASE_(0, YY_("syntax error"));
1094 YYCASE_(1, YY_("syntax error, unexpected %s"));
1095 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1096 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1097 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1098 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1099 #undef YYCASE_
1100 }
1101
1102 std::string yyres;
1103 // Argument number.
1104 size_t yyi = 0;
1105 for (char const* yyp = yyformat; *yyp; ++yyp)
1106 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1107 {
1108 yyres += yytnamerr_ (yyarg[yyi++]);
1109 ++yyp;
1110 }
1111 else
1112 yyres += *yyp;
1113 return yyres;]], [[
1114 return YY_("syntax error");]])[
1115 }
1116
1117
1118 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
1119
1120 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1121
1122 ]b4_parser_tables_define[
1123
1124 ]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
1125 // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1126 // First, the terminals, then, starting at \a yyntokens_, nonterminals.
1127 const char*
1128 const ]b4_parser_class_name[::yytname_[] =
1129 {
1130 ]b4_tname[
1131 };
1132
1133 ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
1134 ]b4_integral_parser_table_define([rline], [b4_rline])[
1135
1136 // Print the state stack on the debug stream.
1137 void
1138 ]b4_parser_class_name[::yystack_print_ ()
1139 {
1140 *yycdebug_ << "Stack now";
1141 for (stack_type::const_iterator
1142 i = yystack_.begin (),
1143 i_end = yystack_.end ();
1144 i != i_end; ++i)
1145 *yycdebug_ << ' ' << i->state;
1146 *yycdebug_ << std::endl;
1147 }
1148
1149 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1150 void
1151 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
1152 {
1153 unsigned int yylno = yyrline_[yyrule];
1154 int yynrhs = yyr2_[yyrule];
1155 // Print the symbols being reduced, and their result.
1156 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
1157 << " (line " << yylno << "):" << std::endl;
1158 // The symbols being reduced.
1159 for (int yyi = 0; yyi < yynrhs; yyi++)
1160 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1161 ]b4_rhs_data(yynrhs, yyi + 1)[);
1162 }
1163 #endif // ]b4_api_PREFIX[DEBUG
1164
1165 ]b4_token_ctor_if([], [b4_yytranslate_define])[
1166 ]b4_namespace_close[
1167 ]b4_epilogue[]dnl
1168 b4_output_end()
1169
1170
1171 m4_popdef([b4_copyright_years])dnl