]> git.saurik.com Git - bison.git/blob - data/lalr1.cc
Merge remote-tracking branch 'origin/maint'
[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_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 b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
124 [# Backward compatibility.
125 m4_define([b4_location_constructors])
126 m4_include(b4_pkgdatadir/[location.cc])])])
127 m4_include(b4_pkgdatadir/[stack.hh])
128 b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
129
130 # b4_shared_declarations
131 # ----------------------
132 # Declaration that might either go into the header (if --defines)
133 # or open coded in the parser body.
134 m4_define([b4_shared_declarations],
135 [b4_percent_code_get([[requires]])[
136 ]b4_parse_assert_if([# include <cassert>])[
137 # include <deque>
138 # include <iostream>
139 # include <stdexcept>
140 # include <string>]b4_defines_if([[
141 # include "stack.hh"
142 ]b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
143 [[# include "location.hh"]])])])[
144
145 ]b4_YYDEBUG_define[
146
147 ]b4_namespace_open[
148
149 ]b4_defines_if([],
150 [b4_stack_define
151 b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
152 [b4_position_define
153 b4_location_define])])])[
154
155 ]b4_variant_if([b4_variant_define])[
156
157 /// A Bison parser.
158 class ]b4_parser_class_name[
159 {
160 public:
161 ]b4_public_types_declare[
162 /// Build a parser object.
163 ]b4_parser_class_name[ (]b4_parse_param_decl[);
164 virtual ~]b4_parser_class_name[ ();
165
166 /// Parse.
167 /// \returns 0 iff parsing succeeded.
168 virtual int parse ();
169
170 #if ]b4_api_PREFIX[DEBUG
171 /// The current debugging stream.
172 std::ostream& debug_stream () const;
173 /// Set the current debugging stream.
174 void set_debug_stream (std::ostream &);
175
176 /// Type for debugging levels.
177 typedef int debug_level_type;
178 /// The current debugging level.
179 debug_level_type debug_level () const;
180 /// Set the current debugging level.
181 void set_debug_level (debug_level_type l);
182 #endif
183
184 /// Report a syntax error.]b4_locations_if([[
185 /// \param loc where the syntax error is found.]])[
186 /// \param msg a description of the syntax error.
187 virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
188
189 /// Report a syntax error.
190 void error (const syntax_error& err);
191
192 private:
193 /// State numbers.
194 typedef int state_type;
195
196 /// Generate an error message.
197 /// \param yystate the state where the error occurred.
198 /// \param yytoken the lookahead token.
199 virtual std::string yysyntax_error_ (state_type yystate, int yytoken);
200
201 /// Compute post-reduction state.
202 /// \param yystate the current state
203 /// \param yylhs the nonterminal to push on the stack
204 state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
205
206 /// Whether the given \c yypact_ value indicates a defaulted state.
207 /// \param yyvalue the value to check
208 static bool yy_pact_value_is_default_ (int yyvalue);
209
210 /// Whether the given \c yytable_ value indicates a syntax error.
211 /// \param yyvalue the value to check
212 static bool yy_table_value_is_error_ (int yyvalue);
213
214 /// Internal symbol numbers.
215 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
216 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
217 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
218
219 // Tables.
220 ]b4_parser_tables_declare[]b4_error_verbose_if([
221
222 /// Convert the symbol name \a n to a form suitable for a diagnostic.
223 static std::string yytnamerr_ (const char *n);])[
224
225 ]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
226 /// For a symbol, its name in clear.
227 static const char* const yytname_[];
228 ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
229 ]b4_integral_parser_table_declare([rline], [b4_rline],
230 [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
231 /// Report on the debug stream that the rule \a r is going to be reduced.
232 virtual void yy_reduce_print_ (int r);
233 /// Print the state stack on the debug stream.
234 virtual void yystack_print_ ();
235
236 // Debugging.
237 int yydebug_;
238 std::ostream* yycdebug_;
239 #endif // ]b4_api_PREFIX[DEBUG
240
241 /// Convert a scanner token number \a t to a symbol number.
242 static inline token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t);
243
244 #if ]b4_api_PREFIX[DEBUG
245 /// \brief Display a symbol type, value and location.
246 /// \param yyo The output stream.
247 /// \param yysym The symbol.
248 template <typename Exact>
249 void yy_print_ (std::ostream& yyo,
250 const symbol_base_type<Exact>& yysym) const;
251 #endif
252
253 /// \brief Reclaim the memory associated to a symbol.
254 /// \param yymsg Why this token is reclaimed.
255 /// If null, print nothing.
256 /// \param s The symbol.
257 template <typename Exact>
258 inline void yy_destroy_ (const char* yymsg,
259 symbol_base_type<Exact>& yysym) const;
260
261 private:
262 /// Element of the stack: a state and its attributes.
263 struct stack_symbol_type : symbol_base_type<stack_symbol_type>
264 {
265 /// The parent class.
266 typedef symbol_base_type<stack_symbol_type> super_type;
267
268 /// Default constructor.
269 inline stack_symbol_type ();
270
271 /// Constructor.
272 inline stack_symbol_type (]b4_join([state_type s],
273 [const semantic_type& v],
274 b4_locations_if([const location_type& l]))[);
275
276 /// The state.
277 state_type state;
278
279 /// The type (corresponding to \a state).
280 inline int type_get_ () const;
281 };
282
283 /// Stack type.
284 typedef stack<stack_symbol_type> stack_type;
285
286 /// The stack.
287 stack_type yystack_;
288
289 /// Push a new state on the stack.
290 /// \param m a debug message to display
291 /// if null, no trace is output.
292 /// \param s the symbol
293 /// \warning the contents of \a s.value is stolen.
294 inline void yypush_ (const char* m, stack_symbol_type& s);
295
296 /// Push a new look ahead token on the state on the stack.
297 /// \param m a debug message to display
298 /// if null, no trace is output.
299 /// \param s the state
300 /// \param sym the symbol (for its value and location).
301 /// \warning the contents of \a s.value is stolen.
302 inline void yypush_ (const char* m, state_type s, symbol_type& sym);
303
304 /// Pop \a n symbols the three stacks.
305 inline void yypop_ (unsigned int n = 1);
306
307 /* Constants. */
308 enum
309 {
310 yyeof_ = 0,
311 yylast_ = ]b4_last[, //< Last index in yytable_.
312 yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols.
313 yyempty_ = -2,
314 yyfinal_ = ]b4_final_state_number[, //< Termination state number.
315 yyterror_ = 1,
316 yyerrcode_ = 256,
317 yyntokens_ = ]b4_tokens_number[ //< Number of tokens.
318 };
319
320 ]b4_parse_param_vars[
321 };
322
323 ]b4_token_ctor_if([b4_yytranslate_define
324 b4_public_types_define])[
325 ]b4_namespace_close[
326
327 ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
328 [b4_token_defines
329
330 #ifndef ]b4_api_PREFIX[STYPE
331 /* Redirection for backward compatibility. */
332 # define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type
333 #endif
334 ])[
335 ]b4_percent_code_get([[provides]])[
336 ]])
337
338 # We do want M4 expansion after # for CPP macros.
339 m4_changecom()
340 b4_defines_if(
341 [m4_divert_push(0)dnl
342 @output(b4_spec_defines_file@)@
343 b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
344 [
345 /**
346 ** \file ]b4_spec_defines_file[
347 ** Define the ]b4_namespace_ref[::parser class.
348 */
349
350 /* C++ LALR(1) parser skeleton written by Akim Demaille. */
351
352 ]b4_cpp_guard_open([b4_spec_defines_file])[
353 ]b4_shared_declarations[
354 ]b4_cpp_guard_close([b4_spec_defines_file])
355 b4_output_end()
356 ])
357
358
359 b4_output_begin([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_token_ctor_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_join(
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_join(
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_join(
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_join(
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 // FIXME: This shoud be completely indented. It is not yet to
686 // avoid gratuitous conflicts when merging into the master branch.
687 try
688 {
689 YYCDEBUG << "Starting parse" << std::endl;
690
691 ]m4_ifdef([b4_initial_action], [
692 b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl
693 /* User initialization code. */
694 b4_user_initial_action
695 b4_dollar_popdef])[]dnl
696
697 [ /* Initialize the stack. The initial state will be set in
698 yynewstate, since the latter expects the semantical and the
699 location values to have been already stored, initialize these
700 stacks with a primary value. */
701 yystack_ = stack_type (0);
702 yypush_ (YY_NULL, 0, yyla);
703
704 // A new symbol was pushed on the stack.
705 yynewstate:
706 YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
707
708 /* Accept? */
709 if (yystack_[0].state == yyfinal_)
710 goto yyacceptlab;
711
712 goto yybackup;
713
714 /* Backup. */
715 yybackup:
716
717 /* Try to take a decision without lookahead. */
718 yyn = yypact_[yystack_[0].state];
719 if (yy_pact_value_is_default_ (yyn))
720 goto yydefault;
721
722 /* Read a lookahead token. */
723 if (yyempty)
724 {
725 YYCDEBUG << "Reading a token: ";
726 try
727 {
728 ]b4_token_ctor_if(
729 [ yyla = b4_function_call([yylex], [symbol_type],
730 m4_ifdef([b4_lex_param], b4_lex_param));],
731 [ yyla.type = yytranslate_ (b4_function_call([yylex], [int],
732 [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
733 b4_locations_if([, [[location*], [&yyla.location]]])dnl
734 m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
735 }
736 catch (const syntax_error& yyexc)
737 {
738 error (yyexc);
739 goto yyerrlab1;
740 }
741 yyempty = false;
742 }
743 YY_SYMBOL_PRINT ("Next token is", yyla);
744
745 /* If the proper action on seeing token YYLA.TYPE is to reduce or
746 to detect an error, take that action. */
747 yyn += yyla.type;
748 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
749 goto yydefault;
750
751 /* Reduce or error. */
752 yyn = yytable_[yyn];
753 if (yyn <= 0)
754 {
755 if (yy_table_value_is_error_ (yyn))
756 goto yyerrlab;
757 yyn = -yyn;
758 goto yyreduce;
759 }
760
761 /* Discard the token being shifted. */
762 yyempty = true;
763
764 /* Count tokens shifted since error; after three, turn off error
765 status. */
766 if (yyerrstatus_)
767 --yyerrstatus_;
768
769 /* Shift the lookahead token. */
770 yypush_ ("Shifting", yyn, yyla);
771 goto yynewstate;
772
773 /*-----------------------------------------------------------.
774 | yydefault -- do the default action for the current state. |
775 `-----------------------------------------------------------*/
776 yydefault:
777 yyn = yydefact_[yystack_[0].state];
778 if (yyn == 0)
779 goto yyerrlab;
780 goto yyreduce;
781
782 /*-----------------------------.
783 | yyreduce -- Do a reduction. |
784 `-----------------------------*/
785 yyreduce:
786 yylen = yyr2_[yyn];
787 yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
788 /* Variants are always initialized to an empty instance of the
789 correct type. The default $$=$1 action is NOT applied when using
790 variants. */
791 b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[
792 /* If YYLEN is nonzero, implement the default value of the action:
793 `$$ = $1'. Otherwise, use the top of the stack.
794
795 Otherwise, the following line sets YYLHS.VALUE to garbage.
796 This behavior is undocumented and Bison
797 users should not rely upon it. */
798 if (yylen)
799 yylhs.value = yystack_@{yylen - 1@}.value;
800 else
801 yylhs.value = yystack_@{0@}.value;])[
802 ]b4_locations_if([dnl
803 [
804 // Compute the default @@$.
805 {
806 slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
807 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
808 }]])[
809
810 // Perform the reduction.
811 YY_REDUCE_PRINT (yyn);
812 try
813 {
814 switch (yyn)
815 {
816 ]b4_user_actions[
817 default:
818 break;
819 }
820 }
821 catch (const syntax_error& yyexc)
822 {
823 error (yyexc);
824 YYERROR;
825 }
826 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
827 ]b4_variant_if([[
828 // Destroy the rhs symbols.
829 for (int i = 0; i < yylen; ++i)
830 // Destroy a variant which value may have been swapped with
831 // yylhs.value (for instance if the action was "std::swap($$,
832 // $1)"). The value of yylhs.value (hence possibly one of these
833 // rhs symbols) depends on the default construction for this
834 // type. In the case of pointers for instance, no
835 // initialization is done, so the value is junk. Therefore do
836 // not try to report the value of symbols about to be destroyed
837 // in the debug trace, it's possibly junk. Hence yymsg = 0.
838 // Besides, that keeps exactly the same traces as with the other
839 // Bison skeletons.
840 yy_destroy_ (YY_NULL, yystack_[i]);]])[
841
842 yypop_ (yylen);
843 yylen = 0;
844 YY_STACK_PRINT ();
845
846 /* Shift the result of the reduction. */
847 yypush_ (YY_NULL, yylhs);
848 goto yynewstate;
849
850 /*--------------------------------------.
851 | yyerrlab -- here on detecting error. |
852 `--------------------------------------*/
853 yyerrlab:
854 /* If not already recovering from an error, report this error. */
855 if (!yyerrstatus_)
856 {
857 ++yynerrs_;
858 error (]b4_join(b4_locations_if([yyla.location]),
859 [[yysyntax_error_ (yystack_[0].state,
860 yyempty ? yyempty_ : yyla.type)]])[);
861 }
862
863 ]b4_locations_if([[
864 yyerror_range[1].location = yyla.location;]])[
865 if (yyerrstatus_ == 3)
866 {
867 /* If just tried and failed to reuse lookahead token after an
868 error, discard it. */
869
870 /* Return failure if at end of input. */
871 if (yyla.type == yyeof_)
872 YYABORT;
873 else if (!yyempty)
874 {
875 yy_destroy_ ("Error: discarding", yyla);
876 yyempty = true;
877 }
878 }
879
880 /* Else will try to reuse lookahead token after shifting the error
881 token. */
882 goto yyerrlab1;
883
884
885 /*---------------------------------------------------.
886 | yyerrorlab -- error raised explicitly by YYERROR. |
887 `---------------------------------------------------*/
888 yyerrorlab:
889
890 /* Pacify compilers like GCC when the user code never invokes
891 YYERROR and the label yyerrorlab therefore never appears in user
892 code. */
893 if (false)
894 goto yyerrorlab;]b4_locations_if([[
895 yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
896 /* $$ was initialized before running the user action. */
897 yy_destroy_ ("Error: discarding", yylhs);]])[
898 /* Do not reclaim the symbols of the rule which action triggered
899 this YYERROR. */
900 yypop_ (yylen);
901 yylen = 0;
902 goto yyerrlab1;
903
904 /*-------------------------------------------------------------.
905 | yyerrlab1 -- common code for both syntax error and YYERROR. |
906 `-------------------------------------------------------------*/
907 yyerrlab1:
908 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
909 {
910 stack_symbol_type error_token;
911 for (;;)
912 {
913 yyn = yypact_[yystack_[0].state];
914 if (!yy_pact_value_is_default_ (yyn))
915 {
916 yyn += yyterror_;
917 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
918 {
919 yyn = yytable_[yyn];
920 if (0 < yyn)
921 break;
922 }
923 }
924
925 // Pop the current state because it cannot handle the error token.
926 if (yystack_.size () == 1)
927 YYABORT;
928 ]b4_locations_if([[
929 yyerror_range[1].location = yystack_[0].location;]])[
930 yy_destroy_ ("Error: popping", yystack_[0]);
931 yypop_ ();
932 YY_STACK_PRINT ();
933 }
934 ]b4_locations_if([[
935 yyerror_range[2].location = yyla.location;
936 YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
937
938 /* Shift the error token. */
939 error_token.state = yyn;
940 yypush_ ("Shifting", error_token);
941 }
942 goto yynewstate;
943
944 /* Accept. */
945 yyacceptlab:
946 yyresult = 0;
947 goto yyreturn;
948
949 /* Abort. */
950 yyabortlab:
951 yyresult = 1;
952 goto yyreturn;
953
954 yyreturn:
955 if (!yyempty)
956 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
957
958 /* Do not reclaim the symbols of the rule which action triggered
959 this YYABORT or YYACCEPT. */
960 yypop_ (yylen);
961 while (1 < yystack_.size ())
962 {
963 yy_destroy_ ("Cleanup: popping", yystack_[0]);
964 yypop_ ();
965 }
966
967 return yyresult;
968 }
969 catch (...)
970 {
971 YYCDEBUG << "Exception caught: cleaning lookahead and stack"
972 << std::endl;
973 // Do not try to display the values of the reclaimed symbols,
974 // as their printer might throw an exception.
975 if (!yyempty)
976 yy_destroy_ (YY_NULL, yyla);
977
978 while (1 < yystack_.size ())
979 {
980 yy_destroy_ (YY_NULL, yystack_[0]);
981 yypop_ ();
982 }
983 throw;
984 }
985 }
986
987 void
988 ]b4_parser_class_name[::error (const syntax_error& yyexc)
989 {
990 error (]b4_join(b4_locations_if([yyexc.location]),
991 [[yyexc.what()]])[);
992 }
993
994 // Generate an error message.
995 std::string
996 ]b4_parser_class_name[::yysyntax_error_ (]dnl
997 b4_error_verbose_if([state_type yystate, int yytoken],
998 [int, int])[)
999 {]b4_error_verbose_if([[
1000 std::string yyres;
1001 // Number of reported tokens (one for the "unexpected", one per
1002 // "expected").
1003 size_t yycount = 0;
1004 // Its maximum.
1005 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1006 // Arguments of yyformat.
1007 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1008
1009 /* There are many possibilities here to consider:
1010 - If this state is a consistent state with a default action, then
1011 the only way this function was invoked is if the default action
1012 is an error action. In that case, don't check for expected
1013 tokens because there are none.
1014 - The only way there can be no lookahead present (in yytoken) is
1015 if this state is a consistent state with a default action.
1016 Thus, detecting the absence of a lookahead is sufficient to
1017 determine that there is no unexpected or expected token to
1018 report. In that case, just report a simple "syntax error".
1019 - Don't assume there isn't a lookahead just because this state is
1020 a consistent state with a default action. There might have
1021 been a previous inconsistent state, consistent state with a
1022 non-default action, or user semantic action that manipulated
1023 yyla. (However, yyla is currently not documented for users.)
1024 - Of course, the expected token list depends on states to have
1025 correct lookahead information, and it depends on the parser not
1026 to perform extra reductions after fetching a lookahead from the
1027 scanner and before detecting a syntax error. Thus, state
1028 merging (from LALR or IELR) and default reductions corrupt the
1029 expected token list. However, the list is correct for
1030 canonical LR with one exception: it will still contain any
1031 token that will not be accepted due to an error action in a
1032 later state.
1033 */
1034 if (yytoken != yyempty_)
1035 {
1036 yyarg[yycount++] = yytname_[yytoken];
1037 int yyn = yypact_[yystate];
1038 if (!yy_pact_value_is_default_ (yyn))
1039 {
1040 /* Start YYX at -YYN if negative to avoid negative indexes in
1041 YYCHECK. In other words, skip the first -YYN actions for
1042 this state because they are default actions. */
1043 int yyxbegin = yyn < 0 ? -yyn : 0;
1044 /* Stay within bounds of both yycheck and yytname. */
1045 int yychecklim = yylast_ - yyn + 1;
1046 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
1047 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
1048 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
1049 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
1050 {
1051 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1052 {
1053 yycount = 1;
1054 break;
1055 }
1056 else
1057 yyarg[yycount++] = yytname_[yyx];
1058 }
1059 }
1060 }
1061
1062 char const* yyformat = YY_NULL;
1063 switch (yycount)
1064 {
1065 #define YYCASE_(N, S) \
1066 case N: \
1067 yyformat = S; \
1068 break
1069 YYCASE_(0, YY_("syntax error"));
1070 YYCASE_(1, YY_("syntax error, unexpected %s"));
1071 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1072 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1073 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1074 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1075 #undef YYCASE_
1076 }
1077
1078 // Argument number.
1079 size_t yyi = 0;
1080 for (char const* yyp = yyformat; *yyp; ++yyp)
1081 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1082 {
1083 yyres += yytnamerr_ (yyarg[yyi++]);
1084 ++yyp;
1085 }
1086 else
1087 yyres += *yyp;
1088 return yyres;]], [[
1089 return YY_("syntax error");]])[
1090 }
1091
1092
1093 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
1094
1095 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1096
1097 ]b4_parser_tables_define[
1098
1099 ]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
1100 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1101 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
1102 const char*
1103 const ]b4_parser_class_name[::yytname_[] =
1104 {
1105 ]b4_tname[
1106 };
1107
1108 ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
1109 ]b4_integral_parser_table_define([rline], [b4_rline])[
1110
1111 // Print the state stack on the debug stream.
1112 void
1113 ]b4_parser_class_name[::yystack_print_ ()
1114 {
1115 *yycdebug_ << "Stack now";
1116 for (stack_type::const_iterator
1117 i = yystack_.begin (),
1118 i_end = yystack_.end ();
1119 i != i_end; ++i)
1120 *yycdebug_ << ' ' << i->state;
1121 *yycdebug_ << std::endl;
1122 }
1123
1124 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1125 void
1126 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
1127 {
1128 unsigned int yylno = yyrline_[yyrule];
1129 int yynrhs = yyr2_[yyrule];
1130 /* Print the symbols being reduced, and their result. */
1131 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
1132 << " (line " << yylno << "):" << std::endl;
1133 /* The symbols being reduced. */
1134 for (int yyi = 0; yyi < yynrhs; yyi++)
1135 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1136 ]b4_rhs_data(yynrhs, yyi + 1)[);
1137 }
1138 #endif // ]b4_api_PREFIX[DEBUG
1139
1140 ]b4_token_ctor_if([], [b4_yytranslate_define])[
1141 ]b4_namespace_close[
1142 ]b4_epilogue[]dnl
1143 b4_output_end()
1144
1145
1146 m4_popdef([b4_copyright_years])dnl