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