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