]> git.saurik.com Git - bison.git/blob - data/lalr1.cc
1c3481ff43e6681b3de2b42a23363fd2f39a744a
[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 /// Steal the symbol type from \a that.
292 void move (by_state& that);
293
294 /// The (internal) type number (corresponding to \a state).
295 /// \a empty_symbol when empty.
296 symbol_number_type type_get () const;
297
298 /// The state number used to denote an empty symbol.
299 enum { empty_state = -1 };
300
301 /// The state.
302 /// \a empty when empty.
303 state_type state;
304 };
305
306 /// "Internal" symbol: element of the stack.
307 struct stack_symbol_type : basic_symbol<by_state>
308 {
309 /// Superclass.
310 typedef basic_symbol<by_state> super_type;
311 /// Construct an empty symbol.
312 stack_symbol_type ();
313 /// Steal the contents from \a sym to build this.
314 stack_symbol_type (state_type s, symbol_type& sym);
315 /// Assignment, needed by push_back.
316 stack_symbol_type& operator= (const stack_symbol_type& that);
317 };
318
319 /// Stack type.
320 typedef stack<stack_symbol_type> stack_type;
321
322 /// The stack.
323 stack_type yystack_;
324
325 /// Push a new state on the stack.
326 /// \param m a debug message to display
327 /// if null, no trace is output.
328 /// \param s the symbol
329 /// \warning the contents of \a s.value is stolen.
330 void yypush_ (const char* m, stack_symbol_type& s);
331
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 void yypush_ (const char* m, state_type s, symbol_type& sym);
339
340 /// Pop \a n symbols the three stacks.
341 void yypop_ (unsigned int n = 1);
342
343 /// Constants.
344 enum
345 {
346 yyeof_ = 0,
347 yylast_ = ]b4_last[, ///< Last index in yytable_.
348 yynnts_ = ]b4_nterms_number[, ///< Number of nonterminal symbols.
349 yyfinal_ = ]b4_final_state_number[, ///< Termination state number.
350 yyterror_ = 1,
351 yyerrcode_ = 256,
352 yyntokens_ = ]b4_tokens_number[ ///< Number of tokens.
353 };
354
355 ]b4_parse_param_vars[
356 };
357
358 ]b4_token_ctor_if([b4_yytranslate_define
359 b4_public_types_define])[
360 ]b4_namespace_close[
361
362 ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
363 [b4_token_defines
364
365 #ifndef ]b4_api_PREFIX[STYPE
366 // Redirection for backward compatibility.
367 # define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type
368 #endif
369 ])[
370 ]b4_percent_code_get([[provides]])[
371 ]])
372
373 b4_defines_if(
374 [b4_output_begin([b4_spec_defines_file])
375 b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
376 [
377 /**
378 ** \file ]b4_spec_defines_file[
379 ** Define the ]b4_namespace_ref[::parser class.
380 */
381
382 // C++ LALR(1) parser skeleton written by Akim Demaille.
383
384 ]b4_cpp_guard_open([b4_spec_defines_file])[
385 ]b4_shared_declarations[
386 ]b4_cpp_guard_close([b4_spec_defines_file])
387 b4_output_end()
388 ])
389
390
391 b4_output_begin([b4_parser_file_name])
392 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
393 b4_percent_code_get([[top]])[]dnl
394 m4_if(b4_prefix, [yy], [],
395 [
396 // Take the name prefix into account.
397 #define yylex b4_prefix[]lex])[
398
399 // First part of user declarations.
400 ]b4_user_pre_prologue[
401
402 ]b4_null_define[
403
404 ]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
405 [b4_shared_declarations])[
406
407 // User implementation prologue.
408 ]b4_user_post_prologue[
409 ]b4_percent_code_get[
410
411 #ifndef YY_
412 # if defined YYENABLE_NLS && YYENABLE_NLS
413 # if ENABLE_NLS
414 # include <libintl.h> // FIXME: INFRINGES ON USER NAME SPACE.
415 # define YY_(msgid) dgettext ("bison-runtime", msgid)
416 # endif
417 # endif
418 # ifndef YY_
419 # define YY_(msgid) msgid
420 # endif
421 #endif
422
423 ]b4_locations_if([dnl
424 [#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
425 ]b4_yylloc_default_define])[
426
427 // Suppress unused-variable warnings by "using" E.
428 #define YYUSE(E) ((void) (E))
429
430 // Enable debugging if requested.
431 #if ]b4_api_PREFIX[DEBUG
432
433 // A pseudo ostream that takes yydebug_ into account.
434 # define YYCDEBUG if (yydebug_) (*yycdebug_)
435
436 # define YY_SYMBOL_PRINT(Title, Symbol) \
437 do { \
438 if (yydebug_) \
439 { \
440 *yycdebug_ << Title << ' '; \
441 yy_print_ (*yycdebug_, Symbol); \
442 *yycdebug_ << std::endl; \
443 } \
444 } while (false)
445
446 # define YY_REDUCE_PRINT(Rule) \
447 do { \
448 if (yydebug_) \
449 yy_reduce_print_ (Rule); \
450 } while (false)
451
452 # define YY_STACK_PRINT() \
453 do { \
454 if (yydebug_) \
455 yystack_print_ (); \
456 } while (false)
457
458 #else // !]b4_api_PREFIX[DEBUG
459
460 # define YYCDEBUG if (false) std::cerr
461 # define YY_SYMBOL_PRINT(Title, Symbol) YYUSE(Symbol)
462 # define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
463 # define YY_STACK_PRINT() static_cast<void>(0)
464
465 #endif // !]b4_api_PREFIX[DEBUG
466
467 #define yyerrok (yyerrstatus_ = 0)
468 #define yyclearin (yyempty = true)
469
470 #define YYACCEPT goto yyacceptlab
471 #define YYABORT goto yyabortlab
472 #define YYERROR goto yyerrorlab
473 #define YYRECOVERING() (!!yyerrstatus_)
474
475 ]b4_namespace_open[]b4_error_verbose_if([[
476
477 /* Return YYSTR after stripping away unnecessary quotes and
478 backslashes, so that it's suitable for yyerror. The heuristic is
479 that double-quoting is unnecessary unless the string contains an
480 apostrophe, a comma, or backslash (other than backslash-backslash).
481 YYSTR is taken from yytname. */
482 std::string
483 ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
484 {
485 if (*yystr == '"')
486 {
487 std::string yyr = "";
488 char const *yyp = yystr;
489
490 for (;;)
491 switch (*++yyp)
492 {
493 case '\'':
494 case ',':
495 goto do_not_strip_quotes;
496
497 case '\\':
498 if (*++yyp != '\\')
499 goto do_not_strip_quotes;
500 // Fall through.
501 default:
502 yyr += *yyp;
503 break;
504
505 case '"':
506 return yyr;
507 }
508 do_not_strip_quotes: ;
509 }
510
511 return yystr;
512 }
513 ]])[
514
515 /// Build a parser object.
516 ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
517 :])[
518 #if ]b4_api_PREFIX[DEBUG
519 ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
520 yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
521 #endif]b4_parse_param_cons[
522 {}
523
524 ]b4_parser_class_name::~b4_parser_class_name[ ()
525 {}
526
527
528 /*---------------.
529 | Symbol types. |
530 `---------------*/
531
532 ]b4_token_ctor_if([], [b4_public_types_define])[
533
534 // by_state.
535 inline
536 ]b4_parser_class_name[::by_state::by_state ()
537 : state (empty_state)
538 {}
539
540 inline
541 ]b4_parser_class_name[::by_state::by_state (const by_state& other)
542 : state (other.state)
543 {}
544
545 inline
546 void
547 ]b4_parser_class_name[::by_state::move (by_state& that)
548 {
549 state = that.state;
550 that.state = empty_state;
551 }
552
553 inline
554 ]b4_parser_class_name[::by_state::by_state (state_type s)
555 : state (s)
556 {}
557
558 inline
559 ]b4_parser_class_name[::symbol_number_type
560 ]b4_parser_class_name[::by_state::type_get () const
561 {
562 return state == empty_state ? empty_symbol : yystos_[state];
563 }
564
565 inline
566 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
567 {}
568
569
570 inline
571 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s, symbol_type& that)
572 : super_type (s]b4_locations_if([, that.location])[)
573 {
574 ]b4_variant_if([b4_symbol_variant([that.type_get ()],
575 [value], [move], [that.value])],
576 [[value = that.value;]])[
577 // that is emptied.
578 that.type = empty_symbol;
579 }
580
581 inline
582 ]b4_parser_class_name[::stack_symbol_type&
583 ]b4_parser_class_name[::stack_symbol_type::operator= (const stack_symbol_type& that)
584 {
585 state = that.state;
586 ]b4_variant_if([b4_symbol_variant([that.type_get ()],
587 [value], [copy], [that.value])],
588 [[value = that.value;]])[]b4_locations_if([
589 location = that.location;])[
590 return *this;
591 }
592
593
594 template <typename Base>
595 inline
596 void
597 ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
598 {
599 if (yymsg)
600 YY_SYMBOL_PRINT (yymsg, yysym);]b4_variant_if([], [
601
602 // User destructor.
603 b4_symbol_actions([destructor], [yysym.type_get ()])])[
604 }
605
606 #if ]b4_api_PREFIX[DEBUG
607 template <typename Base>
608 void
609 ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
610 const basic_symbol<Base>& yysym) const
611 {
612 std::ostream& yyoutput = yyo;
613 YYUSE (yyoutput);
614 symbol_number_type yytype = yysym.type_get ();
615 yyo << (yytype < yyntokens_ ? "token" : "nterm")
616 << ' ' << yytname_[yytype] << " ("]b4_locations_if([
617 << yysym.location << ": "])[;
618 ]b4_symbol_actions([printer])[
619 yyo << ')';
620 }
621 #endif
622
623 inline
624 void
625 ]b4_parser_class_name[::yypush_ (const char* m, state_type s, symbol_type& sym)
626 {
627 stack_symbol_type t (s, sym);
628 yypush_ (m, t);
629 }
630
631 inline
632 void
633 ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
634 {
635 if (m)
636 YY_SYMBOL_PRINT (m, s);
637 yystack_.push (s);
638 }
639
640 inline
641 void
642 ]b4_parser_class_name[::yypop_ (unsigned int n)
643 {
644 yystack_.pop (n);
645 }
646
647 #if ]b4_api_PREFIX[DEBUG
648 std::ostream&
649 ]b4_parser_class_name[::debug_stream () const
650 {
651 return *yycdebug_;
652 }
653
654 void
655 ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
656 {
657 yycdebug_ = &o;
658 }
659
660
661 ]b4_parser_class_name[::debug_level_type
662 ]b4_parser_class_name[::debug_level () const
663 {
664 return yydebug_;
665 }
666
667 void
668 ]b4_parser_class_name[::set_debug_level (debug_level_type l)
669 {
670 yydebug_ = l;
671 }
672 #endif // ]b4_api_PREFIX[DEBUG
673
674 inline ]b4_parser_class_name[::state_type
675 ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yysym)
676 {
677 int yyr = yypgoto_[yysym - yyntokens_] + yystate;
678 if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
679 return yytable_[yyr];
680 else
681 return yydefgoto_[yysym - yyntokens_];
682 }
683
684 inline bool
685 ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
686 {
687 return yyvalue == yypact_ninf_;
688 }
689
690 inline bool
691 ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue)
692 {
693 return yyvalue == yytable_ninf_;
694 }
695
696 int
697 ]b4_parser_class_name[::parse ()
698 {
699 // State.
700 int yyn;
701 /// Length of the RHS of the rule being reduced.
702 int yylen = 0;
703
704 // Error handling.
705 int yynerrs_ = 0;
706 int yyerrstatus_ = 0;
707
708 /// Whether yyla contains a lookahead.
709 bool yyempty = true;
710
711 /// The lookahead symbol.
712 symbol_type yyla;]b4_locations_if([[
713
714 /// The locations where the error started and ended.
715 stack_symbol_type yyerror_range[3];]])[
716
717 /// The return value of parse ().
718 int yyresult;
719
720 // FIXME: This shoud be completely indented. It is not yet to
721 // avoid gratuitous conflicts when merging into the master branch.
722 try
723 {
724 YYCDEBUG << "Starting parse" << std::endl;
725
726 ]m4_ifdef([b4_initial_action], [
727 b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl
728 // User initialization code.
729 b4_user_initial_action
730 b4_dollar_popdef])[]dnl
731
732 [ /* Initialize the stack. The initial state will be set in
733 yynewstate, since the latter expects the semantical and the
734 location values to have been already stored, initialize these
735 stacks with a primary value. */
736 yystack_.clear ();
737 yypush_ (YY_NULLPTR, 0, yyla);
738
739 // A new symbol was pushed on the stack.
740 yynewstate:
741 YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
742
743 // Accept?
744 if (yystack_[0].state == yyfinal_)
745 goto yyacceptlab;
746
747 goto yybackup;
748
749 // Backup.
750 yybackup:
751
752 // Try to take a decision without lookahead.
753 yyn = yypact_[yystack_[0].state];
754 if (yy_pact_value_is_default_ (yyn))
755 goto yydefault;
756
757 // Read a lookahead token.
758 if (yyempty)
759 {
760 YYCDEBUG << "Reading a token: ";
761 try
762 {]b4_token_ctor_if([[
763 symbol_type yylookahead (]b4_lex[);
764 yyla.move (yylookahead);]], [[
765 yyla.type = yytranslate_ (]b4_lex[);]])[
766 }
767 catch (const syntax_error& yyexc)
768 {
769 error (yyexc);
770 goto yyerrlab1;
771 }
772 yyempty = false;
773 }
774 YY_SYMBOL_PRINT ("Next token is", yyla);
775
776 /* If the proper action on seeing token YYLA.TYPE is to reduce or
777 to detect an error, take that action. */
778 yyn += yyla.type_get ();
779 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ())
780 goto yydefault;
781
782 // Reduce or error.
783 yyn = yytable_[yyn];
784 if (yyn <= 0)
785 {
786 if (yy_table_value_is_error_ (yyn))
787 goto yyerrlab;
788 yyn = -yyn;
789 goto yyreduce;
790 }
791
792 // Discard the token being shifted.
793 yyempty = true;
794
795 // Count tokens shifted since error; after three, turn off error status.
796 if (yyerrstatus_)
797 --yyerrstatus_;
798
799 // Shift the lookahead token.
800 yypush_ ("Shifting", yyn, yyla);
801 goto yynewstate;
802
803 /*-----------------------------------------------------------.
804 | yydefault -- do the default action for the current state. |
805 `-----------------------------------------------------------*/
806 yydefault:
807 yyn = yydefact_[yystack_[0].state];
808 if (yyn == 0)
809 goto yyerrlab;
810 goto yyreduce;
811
812 /*-----------------------------.
813 | yyreduce -- Do a reduction. |
814 `-----------------------------*/
815 yyreduce:
816 yylen = yyr2_[yyn];
817 {
818 stack_symbol_type yylhs;
819 yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
820 /* Variants are always initialized to an empty instance of the
821 correct type. The default '$$ = $1' action is NOT applied
822 when using variants. */
823 b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])], [
824 /* If YYLEN is nonzero, implement the default value of the
825 action: '$$ = $1'. Otherwise, use the top of the stack.
826
827 Otherwise, the following line sets YYLHS.VALUE to garbage.
828 This behavior is undocumented and Bison users should not rely
829 upon it. */
830 if (yylen)
831 yylhs.value = yystack_@{yylen - 1@}.value;
832 else
833 yylhs.value = yystack_@{0@}.value;])[
834 ]b4_locations_if([dnl
835 [
836 // Compute the default @@$.
837 {
838 slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
839 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
840 }]])[
841
842 // Perform the reduction.
843 YY_REDUCE_PRINT (yyn);
844 try
845 {
846 switch (yyn)
847 {
848 ]b4_user_actions[
849 default:
850 break;
851 }
852 }
853 catch (const syntax_error& yyexc)
854 {
855 error (yyexc);
856 YYERROR;
857 }
858 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
859 yypop_ (yylen);
860 yylen = 0;
861 YY_STACK_PRINT ();
862
863 // Shift the result of the reduction.
864 yypush_ (YY_NULLPTR, yylhs);
865 }
866 goto yynewstate;
867
868 /*--------------------------------------.
869 | yyerrlab -- here on detecting error. |
870 `--------------------------------------*/
871 yyerrlab:
872 // If not already recovering from an error, report this error.
873 if (!yyerrstatus_)
874 {
875 ++yynerrs_;
876 error (]b4_join(b4_locations_if([yyla.location]),
877 [[yysyntax_error_ (yystack_[0].state,
878 yyempty ? empty_symbol : yyla.type_get ())]])[);
879 }
880
881 ]b4_locations_if([[
882 yyerror_range[1].location = yyla.location;]])[
883 if (yyerrstatus_ == 3)
884 {
885 /* If just tried and failed to reuse lookahead token after an
886 error, discard it. */
887
888 // Return failure if at end of input.
889 if (yyla.type_get () == yyeof_)
890 YYABORT;
891 else if (!yyempty)
892 {
893 yy_destroy_ ("Error: discarding", yyla);
894 yyempty = true;
895 }
896 }
897
898 // Else will try to reuse lookahead token after shifting the error token.
899 goto yyerrlab1;
900
901
902 /*---------------------------------------------------.
903 | yyerrorlab -- error raised explicitly by YYERROR. |
904 `---------------------------------------------------*/
905 yyerrorlab:
906
907 /* Pacify compilers like GCC when the user code never invokes
908 YYERROR and the label yyerrorlab therefore never appears in user
909 code. */
910 if (false)
911 goto yyerrorlab;]b4_locations_if([[
912 yyerror_range[1].location = yystack_[yylen - 1].location;]])[
913 /* Do not reclaim the symbols of the rule whose action triggered
914 this YYERROR. */
915 yypop_ (yylen);
916 yylen = 0;
917 goto yyerrlab1;
918
919 /*-------------------------------------------------------------.
920 | yyerrlab1 -- common code for both syntax error and YYERROR. |
921 `-------------------------------------------------------------*/
922 yyerrlab1:
923 yyerrstatus_ = 3; // Each real token shifted decrements this.
924 {
925 stack_symbol_type error_token;
926 for (;;)
927 {
928 yyn = yypact_[yystack_[0].state];
929 if (!yy_pact_value_is_default_ (yyn))
930 {
931 yyn += yyterror_;
932 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
933 {
934 yyn = yytable_[yyn];
935 if (0 < yyn)
936 break;
937 }
938 }
939
940 // Pop the current state because it cannot handle the error token.
941 if (yystack_.size () == 1)
942 YYABORT;
943 ]b4_locations_if([[
944 yyerror_range[1].location = yystack_[0].location;]])[
945 yy_destroy_ ("Error: popping", yystack_[0]);
946 yypop_ ();
947 YY_STACK_PRINT ();
948 }
949 ]b4_locations_if([[
950 yyerror_range[2].location = yyla.location;
951 YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
952
953 // Shift the error token.
954 error_token.state = yyn;
955 yypush_ ("Shifting", error_token);
956 }
957 goto yynewstate;
958
959 // Accept.
960 yyacceptlab:
961 yyresult = 0;
962 goto yyreturn;
963
964 // Abort.
965 yyabortlab:
966 yyresult = 1;
967 goto yyreturn;
968
969 yyreturn:
970 if (!yyempty)
971 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
972
973 /* Do not reclaim the symbols of the rule whose action triggered
974 this YYABORT or YYACCEPT. */
975 yypop_ (yylen);
976 while (1 < yystack_.size ())
977 {
978 yy_destroy_ ("Cleanup: popping", yystack_[0]);
979 yypop_ ();
980 }
981
982 return yyresult;
983 }
984 catch (...)
985 {
986 YYCDEBUG << "Exception caught: cleaning lookahead and stack"
987 << std::endl;
988 // Do not try to display the values of the reclaimed symbols,
989 // as their printer might throw an exception.
990 if (!yyempty)
991 yy_destroy_ (YY_NULLPTR, yyla);
992
993 while (1 < yystack_.size ())
994 {
995 yy_destroy_ (YY_NULLPTR, yystack_[0]);
996 yypop_ ();
997 }
998 throw;
999 }
1000 }
1001
1002 void
1003 ]b4_parser_class_name[::error (const syntax_error& yyexc)
1004 {
1005 error (]b4_join(b4_locations_if([yyexc.location]),
1006 [[yyexc.what()]])[);
1007 }
1008
1009 // Generate an error message.
1010 std::string
1011 ]b4_parser_class_name[::yysyntax_error_ (]dnl
1012 b4_error_verbose_if([state_type yystate, symbol_number_type yytoken],
1013 [state_type, symbol_number_type])[) const
1014 {]b4_error_verbose_if([[
1015 // Number of reported tokens (one for the "unexpected", one per
1016 // "expected").
1017 size_t yycount = 0;
1018 // Its maximum.
1019 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1020 // Arguments of yyformat.
1021 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1022
1023 /* There are many possibilities here to consider:
1024 - If this state is a consistent state with a default action, then
1025 the only way this function was invoked is if the default action
1026 is an error action. In that case, don't check for expected
1027 tokens because there are none.
1028 - The only way there can be no lookahead present (in yytoken) is
1029 if this state is a consistent state with a default action.
1030 Thus, detecting the absence of a lookahead is sufficient to
1031 determine that there is no unexpected or expected token to
1032 report. In that case, just report a simple "syntax error".
1033 - Don't assume there isn't a lookahead just because this state is
1034 a consistent state with a default action. There might have
1035 been a previous inconsistent state, consistent state with a
1036 non-default action, or user semantic action that manipulated
1037 yyla. (However, yyla is currently not documented for users.)
1038 - Of course, the expected token list depends on states to have
1039 correct lookahead information, and it depends on the parser not
1040 to perform extra reductions after fetching a lookahead from the
1041 scanner and before detecting a syntax error. Thus, state
1042 merging (from LALR or IELR) and default reductions corrupt the
1043 expected token list. However, the list is correct for
1044 canonical LR with one exception: it will still contain any
1045 token that will not be accepted due to an error action in a
1046 later state.
1047 */
1048 if (yytoken != empty_symbol)
1049 {
1050 yyarg[yycount++] = yytname_[yytoken];
1051 int yyn = yypact_[yystate];
1052 if (!yy_pact_value_is_default_ (yyn))
1053 {
1054 /* Start YYX at -YYN if negative to avoid negative indexes in
1055 YYCHECK. In other words, skip the first -YYN actions for
1056 this state because they are default actions. */
1057 int yyxbegin = yyn < 0 ? -yyn : 0;
1058 // Stay within bounds of both yycheck and yytname.
1059 int yychecklim = yylast_ - yyn + 1;
1060 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
1061 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
1062 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
1063 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
1064 {
1065 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1066 {
1067 yycount = 1;
1068 break;
1069 }
1070 else
1071 yyarg[yycount++] = yytname_[yyx];
1072 }
1073 }
1074 }
1075
1076 char const* yyformat = YY_NULLPTR;
1077 switch (yycount)
1078 {
1079 #define YYCASE_(N, S) \
1080 case N: \
1081 yyformat = S; \
1082 break
1083 YYCASE_(0, YY_("syntax error"));
1084 YYCASE_(1, YY_("syntax error, unexpected %s"));
1085 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1086 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1087 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1088 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1089 #undef YYCASE_
1090 }
1091
1092 std::string yyres;
1093 // Argument number.
1094 size_t yyi = 0;
1095 for (char const* yyp = yyformat; *yyp; ++yyp)
1096 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1097 {
1098 yyres += yytnamerr_ (yyarg[yyi++]);
1099 ++yyp;
1100 }
1101 else
1102 yyres += *yyp;
1103 return yyres;]], [[
1104 return YY_("syntax error");]])[
1105 }
1106
1107
1108 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
1109
1110 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1111
1112 ]b4_parser_tables_define[
1113
1114 ]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
1115 // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1116 // First, the terminals, then, starting at \a yyntokens_, nonterminals.
1117 const char*
1118 const ]b4_parser_class_name[::yytname_[] =
1119 {
1120 ]b4_tname[
1121 };
1122
1123 ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
1124 ]b4_integral_parser_table_define([rline], [b4_rline])[
1125
1126 // Print the state stack on the debug stream.
1127 void
1128 ]b4_parser_class_name[::yystack_print_ ()
1129 {
1130 *yycdebug_ << "Stack now";
1131 for (stack_type::const_iterator
1132 i = yystack_.begin (),
1133 i_end = yystack_.end ();
1134 i != i_end; ++i)
1135 *yycdebug_ << ' ' << i->state;
1136 *yycdebug_ << std::endl;
1137 }
1138
1139 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1140 void
1141 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
1142 {
1143 unsigned int yylno = yyrline_[yyrule];
1144 int yynrhs = yyr2_[yyrule];
1145 // Print the symbols being reduced, and their result.
1146 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
1147 << " (line " << yylno << "):" << std::endl;
1148 // The symbols being reduced.
1149 for (int yyi = 0; yyi < yynrhs; yyi++)
1150 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1151 ]b4_rhs_data(yynrhs, yyi + 1)[);
1152 }
1153 #endif // ]b4_api_PREFIX[DEBUG
1154
1155 ]b4_token_ctor_if([], [b4_yytranslate_define])[
1156 ]b4_namespace_close[
1157 ]b4_epilogue[]dnl
1158 b4_output_end()
1159
1160
1161 m4_popdef([b4_copyright_years])dnl