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