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