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