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