1 # C++ skeleton for Bison
3 # Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 # Free Software Foundation, Inc.
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.
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.
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/>.
19 m4_include(b4_pkgdatadir
/[c
++.m4
])
22 # b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
23 # --------------------------------------------------------------
24 # Declare "parser::yy<TABLE-NAME>_" which contents is CONTENT.
25 m4_define([b4_integral_parser_table_declare
],
26 [m4_ifval([$
3], [b4_c_comment([$
3], [ ])
28 static const b4_int_type_for([$
2]) yy$
1_
[[]];dnl
31 # b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
32 # ---------------------------------------------
33 # Define "parser::yy<TABLE-NAME>_" which contents is CONTENT.
34 m4_define([b4_integral_parser_table_define
],
35 [ const b4_int_type_for([$
2])
36 b4_parser_class_name::yy$
1_
[[]] =
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.
47 m4_copy([b4_symbol_value
], [b4_symbol_value_template
])
50 # b4_lhs_value([TYPE])
51 # --------------------
52 # Expansion of $<TYPE>$.
53 m4_define([b4_lhs_value
],
54 [b4_symbol_value([yylhs
.value
], [$
1])])
60 m4_define([b4_lhs_location
],
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.
68 m4_define([b4_rhs_data
],
69 [yystack_@
{b4_subtract($@
)@
}])
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.
76 m4_define([b4_rhs_state
],
77 [b4_rhs_data([$
1], [$
2]).state
])
80 # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
81 # --------------------------------------
82 # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
84 m4_define([b4_rhs_value
],
85 [b4_symbol_value([b4_rhs_data([$
1], [$
2]).value
], [$
3])])
88 # b4_rhs_location(RULE-LENGTH, NUM)
89 # ---------------------------------
90 # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
92 m4_define([b4_rhs_location
],
93 [b4_rhs_data([$
1], [$
2]).location
])
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.
100 m4_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
106 m4_pushdef([b4_at_dollar
], [yysym
.location
])dnl
107 b4_symbol_case_([$
1])
108 b4_syncline([b4_symbol([$
1], [$
2_line
])], ["b4_symbol([$1], [$2_file])"])
109 b4_symbol([$
1], [$
2])
110 b4_syncline([@oline@
], [@ofile@
])
113 m4_popdef([b4_at_dollar
])dnl
114 m4_popdef([b4_dollar_dollar
])dnl
117 # b4_symbol_constructor_declaration_(SYMBOL-NUMBER)
118 # -------------------------------------------------
119 # Declare the overloaded version of make_symbol for the (common) type of
120 # these SYMBOL-NUMBERS. Use at class-level.
121 m4_define([b4_symbol_constructor_declaration_
],
122 [b4_symbol_if([$
1], [is_token
], [b4_symbol_if([$
1], [has_id
],
125 make_
[]b4_symbol_([$
1], [id
]) (dnl
126 b4_args(b4_symbol_if([$
1], [has_type
],
127 [const b4_symbol([$
1], [type
])& v
]),
128 b4_locations_if([const location_type
& l
])));
133 # b4_symbol_constructor_declarations
134 # ----------------------------------
135 # Declare symbol constructors for all the value types.
136 # Use at class-level.
137 m4_define([b4_symbol_constructor_declarations
],
139 // Symbol constructors declarations.
140 b4_symbol_foreach([b4_symbol_constructor_declaration_
])])])
144 # b4_symbol_constructor_definition_(SYMBOL-NUMBER)
145 # ------------------------------------------------
146 # Define symbol constructor for this SYMBOL-NUMBER.
147 m4_define([b4_symbol_constructor_definition_
],
148 [b4_symbol_if([$
1], [is_token
], [b4_symbol_if([$
1], [has_id
],
149 [ b4_parser_class_name::symbol_type
150 b4_parser_class_name::make_
[]b4_symbol_([$
1], [id
]) (dnl
151 b4_args(b4_symbol_if([$
1], [has_type
],
152 [const b4_symbol([$
1], [type
])& v
]),
153 b4_locations_if([const location_type
& l
])))
155 return symbol_type (b4_args([yytranslate_ (token::b4_symbol([$
1], [id
]))],
156 b4_symbol_if([$
1], [has_type
], [v
]),
157 b4_locations_if([l
])));
163 # b4_symbol_constructor_definitions
164 # ----------------------------------
165 # Define the overloaded versions of make_symbol for all the value types.
166 m4_define([b4_symbol_constructor_definitions
],
168 // Implementation of make_symbol for each symbol type.
169 b4_symbol_foreach([b4_symbol_constructor_definition_
])])])
172 # b4_yytranslate_definition
173 # -------------------------
174 # Define yytranslate_. Sometimes we want it in the header file,
175 # sometimes the cc file suffices.
176 m4_define([b4_yytranslate_definition
],
177 [[ // Symbol number corresponding to token number t.
178 ]b4_parser_class_name
[::token_number_type
179 ]b4_parser_class_name
[::yytranslate_ (]b4_lex_symbol_if([token_type
],
183 const token_number_type
188 const unsigned int user_token_number_max_
= ]b4_user_token_number_max
[;
189 const token_number_type undef_token_
= ]b4_undef_token_number
[;
191 if (static_cast<int>(t
) <= yyeof_
)
193 else if (static_cast<unsigned int> (t
) <= user_token_number_max_
)
194 return translate_table
[t
];
201 m4_pushdef([b4_copyright_years
],
202 [2002, 2003, 2004, 2005, 2006, 2007, 2008])
204 m4_define([b4_parser_class_name
],
205 [b4_percent_define_get([[parser_class_name]])])
207 # The header is mandatory.
209 [b4_fatal([b4_skeleton
[: using %%defines is mandatory
]])])
212 [# Backward compatibility.
213 m4_define([b4_location_constructors
])
214 m4_include(b4_pkgdatadir
/[location
.cc
])])
215 m4_include(b4_pkgdatadir
/[stack
.hh
])
216 b4_variant_if([m4_include(b4_pkgdatadir
/[variant
.hh
])])
218 # We do want M4 expansion after # for CPP macros.
221 @
output(b4_spec_defines_file@
)@
222 b4_copyright([Skeleton interface
for Bison
LALR(1) parsers in C
++])
223 dnl FIXME
: This is wrong
, we want computed header guards
.
225 /* C++ LALR(1) parser skeleton written by Akim Demaille. */
227 #ifndef PARSER_HEADER_H
228 # define PARSER_HEADER_H
230 ]b4_percent_code_get([[requires]])[
232 ]b4_assert_if([#include <cassert>])[
238 ]b4_locations_if([ class position
;
240 ]b4_variant_if([b4_variant_definition
])[
243 ]b4_locations_if([#include "location.hh"])[
245 /* Enabling traces. */
247 # define YYDEBUG ]b4_debug_flag[
250 /* Enabling verbose error messages. */
251 #ifdef YYERROR_VERBOSE
252 # undef YYERROR_VERBOSE
253 # define YYERROR_VERBOSE 1
255 # define YYERROR_VERBOSE ]b4_error_verbose_flag[
258 /* Enabling the token table. */
259 #ifndef YYTOKEN_TABLE
260 # define YYTOKEN_TABLE ]b4_token_table[
263 ]b4_locations_if([dnl
264 [/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
265 If N is 0, then set CURRENT to the empty location which ends
266 the previous symbol: RHS[0] (always defined). */
268 #ifndef YYLLOC_DEFAULT
269 # define YYLLOC_DEFAULT(Current, Rhs, N) \
273 (Current).begin = (Rhs)[1].location.begin; \
274 (Current).end = (Rhs)[N].location.end; \
278 (Current).begin = (Current).end = (Rhs)[0].location.end; \
286 class ]b4_parser_class_name
[
289 ]b4_public_types_declare
[
290 ]b4_symbol_constructor_declarations
[
291 /// Build a parser object.
292 ]b4_parser_class_name
[ (]b4_parse_param_decl
[);
293 virtual ~]b4_parser_class_name
[ ();
296 /// \returns 0 iff parsing succeeded.
297 virtual int parse ();
300 /// The current debugging stream.
301 std::ostream
& debug_stream () const;
302 /// Set the current debugging stream.
303 void set_debug_stream (std::ostream
&);
305 /// Type for debugging levels.
306 typedef int debug_level_type
;
307 /// The current debugging level.
308 debug_level_type
debug_level () const;
309 /// Set the current debugging level.
310 void set_debug_level (debug_level_type l
);
313 /// Report a syntax error.]b4_locations_if([
314 /// \param loc where the syntax error is found.])[
315 /// \param msg a description of the syntax error.
316 virtual void error (]b4_locations_if([const location_type
& loc
, ])[const std::string
& msg
);
319 /// Generate an error message.
320 /// \param state the state where the error occurred.
321 /// \param tok the lookahead token.
322 virtual std::string
yysyntax_error_ (int yystate
, int tok
);
325 typedef int state_type
;
327 /// Internal symbol numbers.
328 typedef ]b4_int_type_for([b4_translate
])[ token_number_type
;
329 static const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
)[ yypact_ninf_
;
330 static const ]b4_int_type(b4_table_ninf
, b4_table_ninf
)[ yytable_ninf_
;
333 ]b4_parser_tables_declare
[
335 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
336 /// For a symbol, its name in clear.
337 static const char* const yytname_
[];
338 #endif]b4_error_verbose_if([
340 /// Convert the symbol name \a n to a form suitable for a diagnostic.
341 static std::string
yytnamerr_ (const char *n
);])[
344 ]b4_integral_parser_table_declare([rline
], [b4_rline
],
345 [YYRLINE
[YYN
] -- Source line where rule number YYN was defined
.])[
346 /// Report on the debug stream that the rule \a r is going to be reduced.
347 virtual void yy_reduce_print_ (int r
);
348 /// Print the state stack on the debug stream.
349 virtual void yystack_print_ ();
353 std::ostream
* yycdebug_
;
356 /// Convert a scanner token number \a t to a symbol number.
357 static inline token_number_type
yytranslate_ (]b4_lex_symbol_if([token_type
], [int])[ t
);
360 /// \brief Display a symbol type, value and location.
361 /// \param yyo The output stream.
362 /// \param yysym The symbol.
363 template <typename Exact
>
364 void yy_print_ (std::ostream
& yyo
,
365 const symbol_base_type
<Exact
>& yysym
) const;
368 /// \brief Reclaim the memory associated to a symbol.
369 /// \param yymsg Why this token is reclaimed.
370 /// If null, print nothing.
371 /// \param s The symbol.
372 template <typename Exact
>
373 inline void yy_destroy_ (const char* yymsg
,
374 symbol_base_type
<Exact
>& yysym
) const;
377 /// Element of the stack: a state and its attributes.
378 struct stack_symbol_type
: symbol_base_type
<stack_symbol_type
>
380 /// The parent class.
381 typedef symbol_base_type
<stack_symbol_type
> super_type
;
383 /// Default constructor.
384 inline stack_symbol_type ();
387 inline stack_symbol_type (]b4_args([state_type s
],
388 [const semantic_type
& v
],
389 b4_locations_if([const location_type
& l
]))[);
394 /// Return the type corresponding to this state.
395 inline int type_get_ () const;
399 typedef stack
<stack_symbol_type
> stack_type
;
404 /// Push a new state on the stack.
405 /// \param m a debug message to display
406 /// if null, no trace is output.
407 /// \param s the symbol
408 /// \warning the contents of \a s.value is stolen.
409 inline void yypush_ (const char* m
, stack_symbol_type
& s
);
411 /// Push a new look ahead token on the state on the stack.
412 /// \param m a debug message to display
413 /// if null, no trace is output.
414 /// \param s the state
415 /// \param sym the symbol (for its value and location).
416 /// \warning the contents of \a s.value is stolen.
417 inline void yypush_ (const char* m
, state_type s
, symbol_type
& sym
);
419 /// Pop \a n symbols the three stacks.
420 inline void yypop_ (unsigned int n
= 1);
426 yylast_
= ]b4_last
[, //< Last index in yytable_.
427 yynnts_
= ]b4_nterms_number
[, //< Number of nonterminal symbols.
429 yyfinal_
= ]b4_final_state_number
[, //< Termination state number.
432 yyntokens_
= ]b4_tokens_number
[, //< Number of tokens.
435 ]b4_parse_param_vars
[
438 ]b4_lex_symbol_if([b4_yytranslate_definition
439 b4_public_types_define
440 b4_symbol_constructor_definitions
])[
443 ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
444 [b4_token_defines(b4_tokens
)
447 /* Redirection for backward compatibility. */
448 # define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
451 b4_percent_code_get([[provides]])[]dnl
453 [#endif /* ! defined PARSER_HEADER_H */]
454 @
output(b4_parser_file_name@
)@
455 b4_copyright([Skeleton implementation
for Bison
LALR(1) parsers in C
++])
456 b4_percent_code_get([[top]])[]dnl
457 m4_if(b4_prefix
, [yy
], [],
459 // Take the name prefix into account.
460 #define yylex b4_prefix[]lex])[
462 /* First part of user declarations. */
463 ]b4_user_pre_prologue
[
465 #include "@basename(]b4_spec_defines_file[@)"
467 /* User implementation prologue. */
468 ]b4_user_post_prologue
469 b4_percent_code_get
[]dnl
474 # include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
475 # define YY_(msgid) dgettext ("bison-runtime", msgid)
479 # define YY_(msgid) msgid
483 /* Suppress unused-variable warnings by "using" E. */
484 #define YYUSE(e) ((void) (e))
486 /* Enable debugging if requested. */
489 /* A pseudo ostream that takes yydebug_ into account. */
490 # define YYCDEBUG if (yydebug_) (*yycdebug_)
492 # define YY_SYMBOL_PRINT(Title, Symbol) \
496 *yycdebug_ << Title << ' '; \
497 yy_print_ (*yycdebug_, Symbol); \
498 *yycdebug_ << std::endl; \
502 # define YY_REDUCE_PRINT(Rule) \
505 yy_reduce_print_ (Rule); \
508 # define YY_STACK_PRINT() \
516 # define YYCDEBUG if (false) std::cerr
517 # define YY_SYMBOL_PRINT(Title, Symbol) static_cast<void>(0)
518 # define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
519 # define YY_STACK_PRINT() static_cast<void>(0)
521 #endif /* !YYDEBUG */
523 #define yyerrok (yyerrstatus_ = 0)
524 #define yyclearin (yyempty = true)
526 #define YYACCEPT goto yyacceptlab
527 #define YYABORT goto yyabortlab
528 #define YYERROR goto yyerrorlab
529 #define YYRECOVERING() (!!yyerrstatus_)
531 ]b4_namespace_open
[]b4_error_verbose_if([[
533 /* Return YYSTR after stripping away unnecessary quotes and
534 backslashes, so that it's suitable for yyerror. The heuristic is
535 that double-quoting is unnecessary unless the string contains an
536 apostrophe, a comma, or backslash (other than backslash-backslash).
537 YYSTR is taken from yytname. */
539 ]b4_parser_class_name
[::yytnamerr_ (const char *yystr
)
543 std::string yyr
= "";
544 char const *yyp
= yystr
;
551 goto do_not_strip_quotes
;
555 goto do_not_strip_quotes
;
564 do_not_strip_quotes
: ;
571 /// Build a parser object.
572 ]b4_parser_class_name::b4_parser_class_name
[ (]b4_parse_param_decl
[)]m4_ifset([b4_parse_param
], [
575 ]m4_ifset([b4_parse_param
], [ ], [ :])[yydebug_ (false),
576 yycdebug_ (&std::cerr
)]m4_ifset([b4_parse_param
], [,])[
577 #endif]b4_parse_param_cons[
581 ]b4_parser_class_name::~b4_parser_class_name
[ ()
590 ]b4_lex_symbol_if([], [b4_public_types_define
591 b4_symbol_constructor_definitions
])[
593 // stack_symbol_type.
594 ]b4_parser_class_name
[::stack_symbol_type::stack_symbol_type ()
600 ]b4_parser_class_name
[::stack_symbol_type::stack_symbol_type (]b4_args(
602 [const semantic_type
& v
],
603 b4_locations_if([const location_type
& l
]))[)
604 : super_type (v
]b4_locations_if([, l
])[)
610 ]b4_parser_class_name
[::stack_symbol_type::type_get_ () const
612 return yystos_
[state
];
616 template <typename Exact
>
618 ]b4_parser_class_name
[::yy_destroy_ (const char* yymsg
,
619 symbol_base_type
<Exact
>& yysym
) const
621 int yytype
= yysym
.type_get ();
624 YY_SYMBOL_PRINT (yymsg
, yysym
);
629 ]b4_symbol_foreach([b4_symbol_destructor
])dnl
635 b4_symbol_variant([[yytype]], [[yysym
.value
]], [[template destroy]])])[
639 template <typename Exact
>
641 ]b4_parser_class_name
[::yy_print_ (std::ostream
& yyo
,
642 const symbol_base_type
<Exact
>& yysym
) const
644 int yytype
= yysym
.type_get ();
645 yyo
<< (yytype
< yyntokens_
? "token" : "nterm")
646 << ' ' << yytname_
[yytype
] << " ("]b4_locations_if([
647 << yysym
.location
<< ": "])[;
650 ]b4_symbol_foreach([b4_symbol_printer
])dnl
659 ]b4_parser_class_name
[::yypush_ (const char* m
, state_type s
,
663 YY_SYMBOL_PRINT (m
, sym
);
665 [[ yystack_
.push (stack_symbol_type (]b4_args(
668 b4_locations_if([sym
.location
]))[));
669 ]b4_symbol_variant([[yystos_
[s
]]], [[yystack_
[0].value
]],
670 [build
], [sym
.value
])],
671 [[ yystack_
.push (stack_symbol_type (]b4_args(
674 b4_locations_if([sym
.location
]))[));]])[
678 ]b4_parser_class_name
[::yypush_ (const char* m
, stack_symbol_type
& s
)
681 YY_SYMBOL_PRINT (m
, s
);
683 [[ yystack_
.push (stack_symbol_type (]b4_args(
686 b4_locations_if([s
.location
]))[));
687 ]b4_symbol_variant([[yystos_
[s
.state
]]], [[yystack_
[0].value
]],
688 [build
], [s
.value
])],
689 [ yystack_
.push (s
);])[
693 ]b4_parser_class_name
[::yypop_ (unsigned int n
)
700 ]b4_parser_class_name
[::debug_stream () const
706 ]b4_parser_class_name
[::set_debug_stream (std::ostream
& o
)
712 ]b4_parser_class_name
[::debug_level_type
713 ]b4_parser_class_name
[::debug_level () const
719 ]b4_parser_class_name
[::set_debug_level (debug_level_type l
)
726 ]b4_parser_class_name
[::parse ()
728 /// Whether yyla contains a lookahead.
736 /* Error handling. */
738 int yyerrstatus_
= 0;
740 /// The lookahead symbol.
741 symbol_type yyla
;]b4_locations_if([[
743 /// The locations where the error started and ended.
744 stack_symbol_type yyerror_range
[2];]])[
747 stack_symbol_type yylhs
;
749 /// The return value of parse().
752 YYCDEBUG
<< "Starting parse" << std::endl
;
754 ]m4_ifdef([b4_initial_action
], [
755 m4_pushdef([b4_at_dollar
], [yyla
.location
])dnl
756 m4_pushdef([b4_dollar_dollar
], [yyla
.value
])dnl
757 /* User initialization code. */
758 b4_user_initial_action
759 m4_popdef([b4_dollar_dollar
])dnl
760 m4_popdef([b4_at_dollar
])])dnl
762 [ /* Initialize the stack. The initial state will be set in
763 yynewstate, since the latter expects the semantical and the
764 location values to have been already stored, initialize these
765 stacks with a primary value. */
766 yystack_
= stack_type (0);
767 yypush_ (0, 0, yyla
);
769 // A new state was pushed on the stack.
770 // Invariant: yystate == yystack_[0].state, i.e.,
771 // yystate was just pushed onto the state stack.
773 YYCDEBUG
<< "Entering state " << yystate
<< std::endl
;
776 if (yystate
== yyfinal_
)
784 /* Try to take a decision without lookahead. */
785 yyn
= yypact_
[yystate
];
786 if (yyn
== yypact_ninf_
)
789 /* Read a lookahead token. */
792 YYCDEBUG
<< "Reading a token: ";
794 [ yyla
= b4_c_function_call([yylex
], [symbol_type
],
795 m4_ifdef([b4_lex_param
], b4_lex_param
));],
796 [ yyla
.type
= yytranslate_ (b4_c_function_call([yylex
], [int],
797 [[YYSTYPE
*], [&yyla
.value
]][]dnl
798 b4_locations_if([, [[location
*], [&yyla
.location
]]])dnl
799 m4_ifdef([b4_lex_param
], [, ]b4_lex_param
)));])[
802 YY_SYMBOL_PRINT ("Next token is", yyla
);
804 /* If the proper action on seeing token YYLA.TYPE is to reduce or
805 to detect an error, take that action. */
807 if (yyn
< 0 || yylast_
< yyn
|| yycheck_
[yyn
] != yyla
.type
)
810 /* Reduce or error. */
814 if (yyn
== 0 || yyn
== yytable_ninf_
)
820 /* Discard the token being shifted. */
823 /* Count tokens shifted since error; after three, turn off error
828 /* Shift the lookahead token. */
830 yypush_ ("Shifting", yystate
, yyla
);
833 /*-----------------------------------------------------------.
834 | yydefault -- do the default action for the current state. |
835 `-----------------------------------------------------------*/
837 yyn
= yydefact_
[yystate
];
842 /*-----------------------------.
843 | yyreduce -- Do a reduction. |
844 `-----------------------------*/
846 yylen
= yyr2_
[yyn
];]b4_variant_if([
847 /* Variants are always initialized to an empty instance of the
848 correct type. The default $$=$1 action is NOT applied when using
850 ]b4_symbol_variant([[yyr1_@
{yyn@
}]], [yylhs
.value
], [build
]),[
851 /* If YYLEN is nonzero, implement the default value of the action:
852 `$$ = $1'. Otherwise, use the top of the stack.
854 Otherwise, the following line sets YYLHS.VALUE to garbage.
855 This behavior is undocumented and Bison
856 users should not rely upon it. */
858 yylhs
.value
= yystack_@
{yylen
- 1@
}.value
;
860 yylhs
.value
= yystack_@
{0@
}.value
;])[
861 ]b4_locations_if([dnl
863 // Compute the default @@$.
865 slice
<stack_symbol_type
, stack_type
> slice (yystack_
, yylen
);
866 YYLLOC_DEFAULT (yylhs
.location
, slice
, yylen
);
869 // Perform the reduction.
870 YY_REDUCE_PRINT (yyn
);
877 // Compute post-reduction state.
879 yystate
= yypgoto_
[yyn
- yyntokens_
] + yystack_
[yylen
].state
;
880 if (0 <= yystate
&& yystate
<= yylast_
881 && yycheck_
[yystate
] == yystack_
[yylen
].state
)
882 yystate
= yytable_
[yystate
];
884 yystate
= yydefgoto_
[yyn
- yyntokens_
];
885 yylhs
.state
= yystate
;
886 YY_SYMBOL_PRINT ("-> $$ =", yylhs
);
888 // Destroy the rhs symbols.
889 for (int i
= 0; i
< yylen
; ++i
)
890 // Destroy a variant which value may have been swapped with
891 // yylhs.value (for instance if the action was "std::swap($$,
892 // $1)"). The value of yylhs.value (hence possibly one of these
893 // rhs symbols) depends on the default contruction for this
894 // type. In the case of pointers for instance, no
895 // initialization is done, so the value is junk. Therefore do
896 // not try to report the value of symbols about to be destroyed
897 // in the debug trace, it's possibly junk. Hence yymsg = 0.
898 // Besides, that keeps exactly the same traces as with the other
900 yy_destroy_ (0, yystack_
[i
]);]])[
906 /* Shift the result of the reduction. */
910 /*--------------------------------------.
911 | yyerrlab -- here on detecting error. |
912 `--------------------------------------*/
914 /* If not already recovering from an error, report this error. */
918 error (]b4_args(b4_locations_if([yyla
.location
]),
919 [yysyntax_error_ (yystate
, yyla
.type
)])[);
923 yyerror_range
[0].location
= yyla
.location
;]])[
924 if (yyerrstatus_
== 3)
926 /* If just tried and failed to reuse lookahead token after an
927 error, discard it. */
929 /* Return failure if at end of input. */
930 if (yyla
.type
== yyeof_
)
934 yy_destroy_ ("Error: discarding", yyla
);
939 /* Else will try to reuse lookahead token after shifting the error
944 /*---------------------------------------------------.
945 | yyerrorlab -- error raised explicitly by YYERROR. |
946 `---------------------------------------------------*/
949 /* Pacify compilers like GCC when the user code never invokes
950 YYERROR and the label yyerrorlab therefore never appears in user
956 yyerror_range
[0].location
= yystack_
[yylen
- 1].location
;]])[
957 /* Do not reclaim the symbols of the rule which action triggered
961 yystate
= yystack_
[0].state
;
964 /*-------------------------------------------------------------.
965 | yyerrlab1 -- common code for both syntax error and YYERROR. |
966 `-------------------------------------------------------------*/
968 yyerrstatus_
= 3; /* Each real token shifted decrements this. */
970 stack_symbol_type error_token
;
973 yyn
= yypact_
[yystate
];
974 if (yyn
!= yypact_ninf_
)
977 if (0 <= yyn
&& yyn
<= yylast_
&& yycheck_
[yyn
] == yyterror_
)
985 // Pop the current state because it cannot handle the error token.
986 if (yystack_
.size () == 1)
989 yyerror_range
[0].location
= yystack_
[0].location
;]])[
990 yy_destroy_ ("Error: popping", yystack_
[0]);
992 yystate
= yystack_
[0].state
;
996 yyerror_range
[1].location
= yyla
.location
;
997 YYLLOC_DEFAULT (error_token
.location
, (yyerror_range
- 1), 2);]])[
999 /* Shift the error token. */
1000 error_token
.state
= yystate
= yyn
;
1001 yypush_ ("Shifting", error_token
);
1017 yy_destroy_ ("Cleanup: discarding lookahead", yyla
);
1019 /* Do not reclaim the symbols of the rule which action triggered
1020 this YYABORT or YYACCEPT. */
1022 while (yystack_
.size () != 1)
1024 yy_destroy_ ("Cleanup: popping", yystack_
[0]);
1031 // Generate an error message.
1033 ]b4_parser_class_name
[::yysyntax_error_ (]dnl
1034 b4_error_verbose_if([int yystate
, int yytoken
],
1037 std::string yyres
;]b4_error_verbose_if([[
1038 int yyn
= yypact_
[yystate
];
1039 if (yypact_ninf_
< yyn
&& yyn
<= yylast_
)
1041 /* Start YYX at -YYN if negative to avoid negative indexes in
1043 int yyxbegin
= yyn
< 0 ? -yyn
: 0;
1045 /* Stay within bounds of both yycheck and yytname. */
1046 int yychecklim
= yylast_
- yyn
+ 1;
1047 int yyxend
= yychecklim
< yyntokens_
? yychecklim
: yyntokens_
;
1049 // Number of reported tokens (one for the "unexpected", one per
1053 enum { YYERROR_VERBOSE_ARGS_MAXIMUM
= 5 };
1054 // Arguments of yyformat.
1055 char const *yyarg
[YYERROR_VERBOSE_ARGS_MAXIMUM
];
1056 yyarg
[yycount
++] = yytname_
[yytoken
];
1057 for (int yyx
= yyxbegin
; yyx
< yyxend
; ++yyx
)
1058 if (yycheck_
[yyx
+ yyn
] == yyx
&& yyx
!= yyterror_
)
1060 if (yycount
== YYERROR_VERBOSE_ARGS_MAXIMUM
)
1066 yyarg
[yycount
++] = yytname_
[yyx
];
1069 char const* yyformat
= 0;
1072 #define YYCASE_(N, S) \
1076 YYCASE_(1, YY_("syntax error, unexpected %s"));
1077 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1078 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1079 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1080 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1085 for (char const* yyp
= yyformat
; *yyp
; ++yyp
)
1086 if (yyp
[0] == '%' && yyp
[1] == 's' && yyi
< yycount
)
1088 yyres
+= yytnamerr_ (yyarg
[yyi
++]);
1096 [ yyres
= YY_("syntax error");
1101 const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
) b4_parser_class_name::yypact_ninf_
= b4_pact_ninf
[;
1103 const ]b4_int_type(b4_table_ninf
, b4_table_ninf
) b4_parser_class_name::yytable_ninf_
= b4_table_ninf
[;
1105 ]b4_parser_tables_define
[
1107 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
1108 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1109 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
1111 const ]b4_parser_class_name
[::yytname_
[] =
1118 ]b4_integral_parser_table_define([rline
], [b4_rline
])[
1120 // Print the state stack on the debug stream.
1122 ]b4_parser_class_name
[::yystack_print_ ()
1124 *yycdebug_
<< "Stack now";
1125 for (stack_type::const_iterator
1126 i
= yystack_
.begin (),
1127 i_end
= yystack_
.end ();
1129 *yycdebug_
<< ' ' << i
->state
;
1130 *yycdebug_
<< std::endl
;
1133 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1135 ]b4_parser_class_name
[::yy_reduce_print_ (int yyrule
)
1137 unsigned int yylno
= yyrline_
[yyrule
];
1138 int yynrhs
= yyr2_
[yyrule
];
1139 /* Print the symbols being reduced, and their result. */
1140 *yycdebug_
<< "Reducing stack by rule " << yyrule
- 1
1141 << " (line " << yylno
<< "):" << std::endl
;
1142 /* The symbols being reduced. */
1143 for (int yyi
= 0; yyi
< yynrhs
; yyi
++)
1144 YY_SYMBOL_PRINT (" $" << yyi
+ 1 << " =",
1145 ]b4_rhs_data(yynrhs
, yyi
+ 1)[);
1149 ]b4_lex_symbol_if([], [b4_yytranslate_definition
])[
1150 ]b4_namespace_close
[
1153 m4_popdef([b4_copyright_years
])dnl