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