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