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