]> git.saurik.com Git - bison.git/blob - data/lalr1.cc
Prefer M4 to CPP.
[bison.git] / data / lalr1.cc
1 # C++ skeleton for Bison
2
3 # Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
4 # Free Software Foundation, Inc.
5
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19 m4_include(b4_pkgdatadir/[c++.m4])
20
21 # b4_table_define(TABLE-NAME, CONTENT)
22 # ------------------------------------
23 # Define "parser::yy<TABLE-NAME>_" which contents is CONTENT.
24 m4_define([b4_table_define],
25 [const b4_int_type_for([$2])
26 b4_parser_class_name::yy$1_[[]] =
27 {
28 $2
29 }dnl
30 ])
31
32 # b4_symbol_value_template(VAL, [TYPE])
33 # -------------------------------------
34 # Same as b4_symbol_value, but used in a template method.
35 m4_copy([b4_symbol_value], [b4_symbol_value_template])
36
37 # How the semantic value is extracted when using variants.
38 b4_variant_if([
39 # b4_symbol_value(VAL, [TYPE])
40 # ----------------------------
41 m4_define([b4_symbol_value],
42 [m4_ifval([$2],
43 [$1.as<$2>()],
44 [$1])])
45
46 # b4_symbol_value_template(VAL, [TYPE])
47 # -------------------------------------
48 # Same as b4_symbol_value, but used in a template method.
49 m4_define([b4_symbol_value_template],
50 [m4_ifval([$2],
51 [$1.template as<$2>()],
52 [$1])])
53 ]) # b4_variant_if
54
55
56 # b4_lex_symbol_if([IF-YYLEX-RETURNS-A-COMPLETE-SYMBOL], [IF-NOT])
57 # ----------------------------------------------------------------
58 m4_define([b4_lex_symbol_if],
59 [b4_percent_define_ifdef([[lex_symbol]], [$1], [$2])])
60
61
62 # b4_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT])
63 # ------------------------------------------------
64 m4_define([b4_assert_if],
65 [b4_percent_define_ifdef([[assert]], [$1], [$2])])
66
67
68 # b4_lhs_value([TYPE])
69 # --------------------
70 # Expansion of $<TYPE>$.
71 m4_define([b4_lhs_value],
72 [b4_symbol_value([yylhs.value], [$1])])
73
74
75 # b4_lhs_location()
76 # -----------------
77 # Expansion of @$.
78 m4_define([b4_lhs_location],
79 [yylhs.location])
80
81
82 # b4_rhs_data(RULE-LENGTH, NUM)
83 # -----------------------------
84 # Return the data corresponding to the symbol #NUM, where the current
85 # rule has RULE-LENGTH symbols on RHS.
86 m4_define([b4_rhs_data],
87 [yystack_@{($1) - ($2)@}])
88
89
90 # b4_rhs_state(RULE-LENGTH, NUM)
91 # -----------------------------
92 # The state corresponding to the symbol #NUM, where the current
93 # rule has RULE-LENGTH symbols on RHS.
94 m4_define([b4_rhs_state],
95 [b4_rhs_data([$1], [$2]).state])
96
97
98 # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
99 # --------------------------------------
100 # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
101 # symbols on RHS.
102 m4_define([b4_rhs_value],
103 [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])])
104
105
106 # b4_rhs_location(RULE-LENGTH, NUM)
107 # ---------------------------------
108 # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
109 # on RHS.
110 m4_define([b4_rhs_location],
111 [b4_rhs_data([$1], [$2]).location])
112
113
114 # b4_symbol(NUM, FIELD)
115 # ---------------------
116 # Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if
117 # undefined.
118 m4_define([b4_symbol],
119 [m4_indir([b4_symbol($1, $2)])])
120
121
122 # b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
123 # -------------------------------------------
124 # If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE.
125 # Otherwise an error.
126 m4_define([b4_symbol_if],
127 [m4_case(b4_symbol([$1], [$2]),
128 [1], [$3],
129 [0], [$4],
130 [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
131
132
133 # b4_symbol_actions(FILENAME, LINENO,
134 # SYMBOL-TAG, SYMBOL-NUM,
135 # SYMBOL-ACTION, SYMBOL-TYPENAME)
136 # -------------------------------------------------
137 # Same as in C, but using references instead of pointers.
138 m4_define([b4_symbol_actions],
139 [m4_pushdef([b4_dollar_dollar],
140 [b4_symbol_value_template([yysym.value], [$6])])dnl
141 m4_pushdef([b4_at_dollar], [yysym.location])dnl
142 case $4: // $3
143 b4_syncline([$2], [$1])
144 $5;
145 b4_syncline([@oline@], [@ofile@])
146 break;
147 m4_popdef([b4_at_dollar])dnl
148 m4_popdef([b4_dollar_dollar])dnl
149 ])
150
151
152 # b4_symbol_case_(SYMBOL-NUM)
153 # ---------------------------
154 # Issue a "case NUM" for SYMBOL-NUM.
155 m4_define([b4_symbol_case_],
156 [ case b4_symbol([$1], [number]): // b4_symbol([$1], [tag])
157 ])
158
159
160 # b4_type_action_(NUMS)
161 # ---------------------
162 # Run actions for the symbol NUMS that all have the same type-name.
163 # Skip NUMS that have no type-name.
164 m4_define([b4_type_action_],
165 [b4_symbol_if([$1], [has_type_name],
166 [m4_map([b4_symbol_case_], [$@])[]dnl
167 b4_dollar_dollar([b4_symbol([$1], [number])],
168 [b4_symbol([$1], [tag])],
169 [b4_symbol([$1], [type_name])]);
170 break;
171
172 ])])
173
174
175 # b4_symbol_constructor_declaration_(SYMBOL-NUMBERS)
176 # ----------------------------------------------------
177 # Declare the overloaded version of make_symbol for the (common) type of
178 # these SYMBOL-NUMBERS. Use at class-level.
179 m4_define([b4_symbol_constructor_declaration_],
180 [ template <token_type>
181 static inline symbol_type
182 make_symbol (b4_symbol_if([$1], [has_type_name],
183 [const b4_symbol([$1], [type_name])& v, ])dnl
184 const location_type& l);
185
186 ])
187
188 # b4_symbol_constructor_declarations
189 # ----------------------------------
190 # Declare the overloaded versions of make_symbol for all the value types.
191 # Use at class-level.
192 m4_define([b4_symbol_constructor_declarations],
193 [b4_variant_if([
194 // Declaration of make_symbol for each value type.
195 m4_map([b4_symbol_constructor_declaration_], m4_defn([b4_type_names]))])])
196
197
198
199 # b4_symbol_constructor_specialization_(SYMBOL-NUMBER)
200 # ----------------------------------------------------
201 # Declare the specialization of make_symbol for this each SYMBOL-NUMBER.
202 # Specializations cannot be declared at class-level, this must be done
203 # at namespace-level.
204 m4_define([b4_symbol_constructor_specialization_],
205 [b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [tag_is_id],
206 [ template <>
207 inline
208 b4_parser_class_name::symbol_type
209 b4_parser_class_name::make_symbol <b4_parser_class_name::token::b4_symbol([$1], [tag])> (dnl
210 b4_symbol_if([$1], [has_type_name],
211 [const b4_symbol([$1], [type_name])& v, ])dnl
212 const b4_parser_class_name::location_type& l);
213 ])])])
214
215 # b4_symbol_constructor_specializations
216 # -------------------------------------
217 # Declare specializations of make_symbol.
218 m4_define([b4_symbol_constructor_specializations],
219 [b4_variant_if([
220 // Specializations of make_symbol for each symbol type.
221 m4_map([b4_symbol_constructor_specialization_],
222 m4_defn([b4_symbol_numbers]))])dnl
223 ])
224
225
226
227 # b4_symbol_constructor_definition_(SYMBOL-NUMBER)
228 # ------------------------------------------------
229 # Define make_symbol for this SYMBOL-NUMBER.
230 m4_define([b4_symbol_constructor_definition_],
231 [b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [tag_is_id],
232 [ template <>
233 b4_parser_class_name::symbol_type
234 b4_parser_class_name::make_symbol <b4_parser_class_name::token::b4_symbol([$1], [tag])> (dnl
235 b4_symbol_if([$1], [has_type_name],
236 [const b4_symbol([$1], [type_name])& v, ])dnl
237 const location_type& l)
238 {
239 return symbol_type (yytranslate_ (token::b4_symbol([$1], [tag])),dnl
240 b4_symbol_if([$1], [has_type_name], [v, ])l);
241 }
242
243 ])])])
244
245
246 # b4_symbol_constructor_declarations
247 # ----------------------------------
248 # Define the overloaded versions of make_symbol for all the value types.
249 m4_define([b4_symbol_constructor_definitions],
250 [b4_variant_if(
251 [ // Implementation of make_symbol for each symbol type.
252 m4_map([b4_symbol_constructor_definition_], m4_defn([b4_symbol_numbers]))])])
253
254
255 # b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])
256 # ------------------------------------------------
257 # Run some ACTION ("build", or "destroy") on YYVAL of symbol type
258 # YYTYPE.
259 m4_define([b4_symbol_variant],
260 [m4_pushdef([b4_dollar_dollar],
261 [$2.$3<$][3>(m4_shift3($@))])dnl
262 switch ($1)
263 {
264 m4_map([b4_type_action_], m4_defn([b4_type_names]))[]dnl
265 default:
266 break;
267 }
268 m4_popdef([b4_dollar_dollar])dnl
269 ])
270
271
272 # _b4_char_sizeof_counter
273 # -----------------------
274 # A counter used by _b4_char_sizeof_dummy to create fresh symbols.
275 m4_define([_b4_char_sizeof_counter],
276 [0])
277
278 # _b4_char_sizeof_dummy
279 # ---------------------
280 # At each call return a new C++ identifier.
281 m4_define([_b4_char_sizeof_dummy],
282 [m4_define([_b4_char_sizeof_counter], m4_incr(_b4_char_sizeof_counter))dnl
283 dummy[]_b4_char_sizeof_counter])
284
285
286 # b4_char_sizeof(SYMBOL-NUM)
287 # --------------------------
288 # To be mapped on the list of type names to produce:
289 #
290 # char dummy1[sizeof(type_name_1)];
291 # char dummy2[sizeof(type_name_2)];
292 #
293 # for defined type names.
294 # $3 is doubly-quoted, do not quote it again.
295 m4_define([b4_char_sizeof],
296 [m4_ifval(b4_symbol([$1], [type_name]),
297 [
298 char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type_name])])@}; // b4_symbol([$1], [tag])])dnl
299 ])
300
301
302 m4_pushdef([b4_copyright_years],
303 [2002, 2003, 2004, 2005, 2006, 2007, 2008])
304
305 m4_define([b4_parser_class_name],
306 [b4_percent_define_get([[parser_class_name]])])
307
308 # The header is mandatory.
309 b4_defines_if([],
310 [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
311
312 # Backward compatibility.
313 m4_define([b4_location_constructors])
314 m4_include(b4_pkgdatadir/[location.cc])
315
316 # We do want M4 expansion after # for CPP macros.
317 m4_changecom()
318 m4_divert_push(0)dnl
319 b4_defines_if(
320 [@output(b4_spec_defines_file@)@
321 b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
322 dnl FIXME: This is wrong, we want computed header guards.
323 [
324 /* C++ LALR(1) parser skeleton written by Akim Demaille. */
325
326 #ifndef PARSER_HEADER_H
327 # define PARSER_HEADER_H
328
329 ]b4_percent_code_get([[requires]])[
330
331 ]b4_assert_if([#include <cassert>])[
332 #include <string>
333 #include <iostream>
334 #include "stack.hh"
335
336 ]b4_namespace_open[
337 class position;
338 class location;
339 ]b4_variant_if(
340 [[
341 /// A char[S] buffer to store and retrieve objects.
342 ///
343 /// Sort of a variant, but does not keep track of the nature
344 /// of the stored data, since that knowledge is available
345 /// via the current state.
346 template <size_t S>
347 struct variant
348 {]b4_assert_if([
349 /// Whether something is contained.
350 bool built;
351 ])[
352 /// Empty construction.
353 inline
354 variant ()]b4_assert_if([
355 : built(false)])[
356 {}
357
358 /// Instantiate a \a T in here.
359 template <typename T>
360 inline T&
361 build()
362 {]b4_assert_if([
363 assert(!built);
364 built = true;])[
365 return *new (buffer) T;
366 }
367
368 /// Instantiate a \a T in here from \a t.
369 template <typename T>
370 inline T&
371 build(const T& t)
372 {]b4_assert_if([
373 assert(!built);
374 built = true;])[
375 return *new (buffer) T(t);
376 }
377
378 /// Construct and fill.
379 template <typename T>
380 inline
381 variant (const T& t)]b4_assert_if([
382 : built(true)])[
383 {
384 new (buffer) T(t);
385 }
386
387 /// Accessor to a built \a T.
388 template <typename T>
389 inline T&
390 as()
391 {]b4_assert_if([
392 assert(built);])[
393 return reinterpret_cast<T&>(buffer);
394 }
395
396 /// Const accessor to a built \a T (for %printer).
397 template <typename T>
398 inline const T&
399 as() const
400 {]b4_assert_if([
401 assert(built);])[
402 return reinterpret_cast<const T&>(buffer);
403 }
404
405 /// Swap the content with \a other.
406 template <typename T>
407 inline void
408 swap(variant<S>& other)
409 {
410 std::swap(as<T>(), other.as<T>());
411 }
412
413 /// Assign the content of \a other to this.
414 /// Destroys \a other.
415 template <typename T>
416 inline void
417 build(variant<S>& other)
418 {
419 build<T>();
420 swap<T>(other);
421 other.destroy<T>();
422 }
423
424 /// Destroy the stored \a T.
425 template <typename T>
426 inline void
427 destroy()
428 {
429 as<T>().~T();]b4_assert_if([
430 built = false;])[
431 }
432
433 /// A buffer large enough to store any of the semantic values.
434 char buffer[S];
435 };
436 ]])[
437 ]b4_namespace_close[
438
439 #include "location.hh"
440
441 /* Enabling traces. */
442 #ifndef YYDEBUG
443 # define YYDEBUG ]b4_debug_flag[
444 #endif
445
446 /* Enabling verbose error messages. */
447 #ifdef YYERROR_VERBOSE
448 # undef YYERROR_VERBOSE
449 # define YYERROR_VERBOSE 1
450 #else
451 # define YYERROR_VERBOSE ]b4_error_verbose_flag[
452 #endif
453
454 /* Enabling the token table. */
455 #ifndef YYTOKEN_TABLE
456 # define YYTOKEN_TABLE ]b4_token_table[
457 #endif
458
459 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
460 If N is 0, then set CURRENT to the empty location which ends
461 the previous symbol: RHS[0] (always defined). */
462
463 #ifndef YYLLOC_DEFAULT
464 # define YYLLOC_DEFAULT(Current, Rhs, N) \
465 do { \
466 if (N) \
467 { \
468 (Current).begin = (Rhs)[1].location.begin; \
469 (Current).end = (Rhs)[N].location.end; \
470 } \
471 else \
472 { \
473 (Current).begin = (Current).end = (Rhs)[0].location.end; \
474 } \
475 } while (false)
476 #endif
477
478 ]b4_namespace_open[
479
480 /// A Bison parser.
481 class ]b4_parser_class_name[
482 {
483 public:
484 #ifndef YYSTYPE
485 ]b4_variant_if(
486 [ /// An auxiliary type to compute the largest semantic type.
487 union union_type
488 {]m4_map([b4_char_sizeof], m4_defn([b4_symbol_numbers]))[
489 };
490
491 /// Symbol semantic values.
492 typedef variant<sizeof(union_type)> semantic_type;],
493 [ /// Symbol semantic values.
494 m4_ifdef([b4_stype],
495 [ union semantic_type
496 {b4_user_stype
497 };],
498 [m4_if(b4_tag_seen_flag, 0,
499 [[ typedef int semantic_type;]],
500 [[ typedef YYSTYPE semantic_type;]])])])[
501 #else
502 typedef YYSTYPE semantic_type;
503 #endif
504 /// Symbol locations.
505 typedef ]b4_percent_define_get([[location_type]])[ location_type;
506 /// Tokens.
507 struct token
508 {
509 ]b4_token_enums(b4_tokens)[
510 };
511 /// Token type.
512 typedef token::yytokentype token_type;
513
514 /// Build a parser object.
515 ]b4_parser_class_name[ (]b4_parse_param_decl[);
516 virtual ~]b4_parser_class_name[ ();
517
518 /// Parse.
519 /// \returns 0 iff parsing succeeded.
520 virtual int parse ();
521
522 #if YYDEBUG
523 /// The current debugging stream.
524 std::ostream& debug_stream () const;
525 /// Set the current debugging stream.
526 void set_debug_stream (std::ostream &);
527
528 /// Type for debugging levels.
529 typedef int debug_level_type;
530 /// The current debugging level.
531 debug_level_type debug_level () const;
532 /// Set the current debugging level.
533 void set_debug_level (debug_level_type l);
534 #endif
535
536 private:
537 /// Report a syntax error.
538 /// \param loc where the syntax error is found.
539 /// \param msg a description of the syntax error.
540 virtual void error (const location_type& loc, const std::string& msg);
541
542 /// Generate an error message.
543 /// \param state the state where the error occurred.
544 /// \param tok the lookahead token.
545 virtual std::string yysyntax_error_ (int yystate, int tok);
546
547 /// State numbers.
548 typedef int state_type;
549
550 /// Internal symbol numbers.
551 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
552 /* Tables. */
553 /// For a state, the index in \a yytable_ of its portion.
554 static const ]b4_int_type_for([b4_pact])[ yypact_[];
555 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
556
557 /// For a state, default rule to reduce.
558 /// Unless\a yytable_ specifies something else to do.
559 /// Zero means the default is an error.
560 static const ]b4_int_type_for([b4_defact])[ yydefact_[];
561
562 static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
563 static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
564
565 /// What to do in a state.
566 /// \a yytable_[yypact_[s]]: what to do in state \a s.
567 /// - if positive, shift that token.
568 /// - if negative, reduce the rule which number is the opposite.
569 /// - if zero, do what YYDEFACT says.
570 static const ]b4_int_type_for([b4_table])[ yytable_[];
571 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
572
573 static const ]b4_int_type_for([b4_check])[ yycheck_[];
574
575 /// For a state, its accessing symbol.
576 static const ]b4_int_type_for([b4_stos])[ yystos_[];
577
578 /// For a rule, its LHS.
579 static const ]b4_int_type_for([b4_r1])[ yyr1_[];
580 /// For a rule, its RHS length.
581 static const ]b4_int_type_for([b4_r2])[ yyr2_[];
582
583 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
584 /// For a symbol, its name in clear.
585 static const char* const yytname_[];
586 #endif]b4_error_verbose_if([
587
588 /// Convert the symbol name \a n to a form suitable for a diagnostic.
589 static std::string yytnamerr_ (const char *n);])[
590
591 #if YYDEBUG
592 /// For each rule, its source line number.
593 static const ]b4_int_type_for([b4_rline])[ yyrline_[];
594 /// For each scanner token number, its symbol number.
595 static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
596 /// Report on the debug stream that the rule \a r is going to be reduced.
597 virtual void yy_reduce_print_ (int r);
598 /// Print the state stack on the debug stream.
599 virtual void yystack_print_ ();
600
601 /* Debugging. */
602 int yydebug_;
603 std::ostream* yycdebug_;
604 #endif
605
606 /// Convert a scanner token number \a t to a symbol number.
607 static inline token_number_type yytranslate_ (int t);
608
609 /// A complete symbol, with its type.
610 template <typename Exact>
611 struct symbol_base_type
612 {
613 /// Default constructor.
614 inline symbol_base_type ();
615
616 /// Constructor.
617 inline symbol_base_type (const location_type& l);
618 inline symbol_base_type (const semantic_type& v, const location_type& l);
619
620 /// Return this with its exact type.
621 const Exact& self () const;
622 Exact& self ();
623
624 /// Return the type of this symbol.
625 int type_get () const;
626
627 /// The semantic value.
628 semantic_type value;
629
630 /// The location.
631 location_type location;
632 };
633
634 #if YYDEBUG
635 /// \brief Display a symbol type, value and location.
636 /// \param yyo The output stream.
637 /// \param yysym The symbol.
638 template <typename Exact>
639 void yy_print_ (std::ostream& yyo,
640 const symbol_base_type<Exact>& yysym) const;
641 #endif
642
643 /// \brief Reclaim the memory associated to a symbol.
644 /// \param yymsg Why this token is reclaimed.
645 /// If null, print nothing.
646 /// \param s The symbol.
647 template <typename Exact>
648 inline void yy_destroy_ (const char* yymsg,
649 symbol_base_type<Exact>& yysym) const;
650
651 public:
652 /// Element of the stack: a state and its attributes.
653 struct symbol_type : symbol_base_type<symbol_type>
654 {
655 /// The parent class.
656 typedef symbol_base_type<symbol_type> super_type;
657
658 /// Default constructor.
659 inline symbol_type ();
660
661 /// Constructor.
662 inline symbol_type (int t,
663 const semantic_type& v, const location_type& l);
664
665 inline symbol_type (int t,
666 const location_type& l);
667
668 /// The symbol type.
669 int type;
670
671 /// Return the type corresponding to this state.
672 inline int type_get_ () const;
673 };
674
675 ]b4_symbol_constructor_declarations[
676
677 private:
678 /// Element of the stack: a state and its attributes.
679 struct stack_symbol_type : symbol_base_type<stack_symbol_type>
680 {
681 /// The parent class.
682 typedef symbol_base_type<stack_symbol_type> super_type;
683
684 /// Default constructor.
685 inline stack_symbol_type ();
686
687 /// Constructor.
688 inline stack_symbol_type (state_type s,
689 const semantic_type& v, const location_type& l);
690
691 /// The state.
692 state_type state;
693
694 /// Return the type corresponding to this state.
695 inline int type_get_ () const;
696 };
697
698 /// Stack type.
699 typedef stack<stack_symbol_type> stack_type;
700
701 /// The stack.
702 stack_type yystack_;
703
704 /// Push a new state on the stack.
705 /// \param m a debug message to display
706 /// if null, no trace is output.
707 /// \param s the symbol
708 /// \warning the contents of \a s.value is stolen.
709 inline void yypush_ (const char* m, stack_symbol_type& s);
710
711 /// Push a new look ahead token on the state on the stack.
712 /// \param m a debug message to display
713 /// if null, no trace is output.
714 /// \param s the state
715 /// \param sym the symbol (for its value and location).
716 /// \warning the contents of \a s.value is stolen.
717 inline void yypush_ (const char* m, state_type s, symbol_type& sym);
718
719 /// Pop \a n symbols the three stacks.
720 inline void yypop_ (unsigned int n = 1);
721
722 /* Constants. */
723 enum
724 {
725 yyeof_ = 0,
726 yylast_ = ]b4_last[, //< Last index in yytable_.
727 yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols.
728 yyempty_ = -2,
729 yyfinal_ = ]b4_final_state_number[, //< Termination state number.
730 yyterror_ = 1,
731 yyerrcode_ = 256,
732 yyntokens_ = ]b4_tokens_number[, //< Number of tokens.
733 };
734
735 ]b4_parse_param_vars[
736 };
737 ]b4_symbol_constructor_specializations[
738 ]b4_namespace_close[
739
740 ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
741 [b4_token_defines(b4_tokens)
742
743 #ifndef YYSTYPE
744 /* Redirection for backward compatibility. */
745 # define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
746 #endif
747 ])
748 b4_percent_code_get([[provides]])[]dnl
749
750 [#endif /* ! defined PARSER_HEADER_H */]
751 ])dnl
752 @output(b4_parser_file_name@)@
753 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
754 b4_percent_code_get([[top]])[]dnl
755 m4_if(b4_prefix, [yy], [],
756 [
757 // Take the name prefix into account.
758 #define yylex b4_prefix[]lex])[
759
760 /* First part of user declarations. */
761 ]b4_user_pre_prologue
762
763 b4_defines_if([[
764 #include "@basename(]b4_spec_defines_file[@)"]])[
765
766 /* User implementation prologue. */
767 ]b4_user_post_prologue
768 b4_percent_code_get[]dnl
769
770 [#ifndef YY_
771 # if YYENABLE_NLS
772 # if ENABLE_NLS
773 # include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
774 # define YY_(msgid) dgettext ("bison-runtime", msgid)
775 # endif
776 # endif
777 # ifndef YY_
778 # define YY_(msgid) msgid
779 # endif
780 #endif
781
782 /* Suppress unused-variable warnings by "using" E. */
783 #define YYUSE(e) ((void) (e))
784
785 /* Enable debugging if requested. */
786 #if YYDEBUG
787
788 /* A pseudo ostream that takes yydebug_ into account. */
789 # define YYCDEBUG if (yydebug_) (*yycdebug_)
790
791 # define YY_SYMBOL_PRINT(Title, Symbol) \
792 do { \
793 if (yydebug_) \
794 { \
795 *yycdebug_ << Title << ' '; \
796 yy_print_ (*yycdebug_, Symbol); \
797 *yycdebug_ << std::endl; \
798 } \
799 } while (false)
800
801 # define YY_REDUCE_PRINT(Rule) \
802 do { \
803 if (yydebug_) \
804 yy_reduce_print_ (Rule); \
805 } while (false)
806
807 # define YY_STACK_PRINT() \
808 do { \
809 if (yydebug_) \
810 yystack_print_ (); \
811 } while (false)
812
813 #else /* !YYDEBUG */
814
815 # define YYCDEBUG if (false) std::cerr
816 # define YY_SYMBOL_PRINT(Title, Symbol) static_cast<void>(0)
817 # define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
818 # define YY_STACK_PRINT() static_cast<void>(0)
819
820 #endif /* !YYDEBUG */
821
822 #define yyerrok (yyerrstatus_ = 0)
823 #define yyclearin (yyempty = true)
824
825 #define YYACCEPT goto yyacceptlab
826 #define YYABORT goto yyabortlab
827 #define YYERROR goto yyerrorlab
828 #define YYRECOVERING() (!!yyerrstatus_)
829
830 ]b4_namespace_open[]b4_error_verbose_if([[
831
832 /* Return YYSTR after stripping away unnecessary quotes and
833 backslashes, so that it's suitable for yyerror. The heuristic is
834 that double-quoting is unnecessary unless the string contains an
835 apostrophe, a comma, or backslash (other than backslash-backslash).
836 YYSTR is taken from yytname. */
837 std::string
838 ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
839 {
840 if (*yystr == '"')
841 {
842 std::string yyr = "";
843 char const *yyp = yystr;
844
845 for (;;)
846 switch (*++yyp)
847 {
848 case '\'':
849 case ',':
850 goto do_not_strip_quotes;
851
852 case '\\':
853 if (*++yyp != '\\')
854 goto do_not_strip_quotes;
855 /* Fall through. */
856 default:
857 yyr += *yyp;
858 break;
859
860 case '"':
861 return yyr;
862 }
863 do_not_strip_quotes: ;
864 }
865
866 return yystr;
867 }
868 ]])[
869
870 /// Build a parser object.
871 ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
872 :])[
873 #if YYDEBUG
874 ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
875 yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
876 #endif]b4_parse_param_cons[
877 {
878 }
879
880 ]b4_parser_class_name::~b4_parser_class_name[ ()
881 {
882 }
883
884
885 /*---------------.
886 | Symbol types. |
887 `---------------*/
888
889 // symbol_base_type.
890 template <typename Exact>
891 ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type ()
892 : value()
893 , location()
894 {
895 }
896
897 template <typename Exact>
898 ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type (const location_type& l)
899 : value()
900 , location(l)
901 {
902 }
903
904 template <typename Exact>
905 ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type (const semantic_type& v, const location_type& l)
906 : value(v)
907 , location(l)
908 {
909 }
910
911 template <typename Exact>
912 const Exact&
913 ]b4_parser_class_name[::symbol_base_type<Exact>::self () const
914 {
915 return static_cast<const Exact&>(*this);
916 }
917
918 template <typename Exact>
919 Exact&
920 ]b4_parser_class_name[::symbol_base_type<Exact>::self ()
921 {
922 return static_cast<Exact&>(*this);
923 }
924
925 template <typename Exact>
926 int
927 ]b4_parser_class_name[::symbol_base_type<Exact>::type_get () const
928 {
929 return self ().type_get_ ();
930 }
931
932 // symbol_type.
933 ]b4_parser_class_name[::symbol_type::symbol_type ()
934 : super_type ()
935 , type ()
936 {
937 }
938
939 ]b4_parser_class_name[::symbol_type::symbol_type (int t,
940 const location_type& l)
941 : super_type (l)
942 , type (t)
943 {
944 }
945
946 ]b4_parser_class_name[::symbol_type::symbol_type (int t,
947 const semantic_type& v, const location_type& l)
948 : super_type (v, l)
949 , type (t)
950 {
951 }
952
953 int
954 ]b4_parser_class_name[::symbol_type::type_get_ () const
955 {
956 return type;
957 }
958
959 ]b4_symbol_constructor_definitions[
960
961 // stack_symbol_type.
962 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
963 : super_type ()
964 , state ()
965 {
966 }
967
968 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s,
969 const semantic_type& v, const location_type& l)
970 : super_type (v, l)
971 , state (s)
972 {
973 }
974
975 int
976 ]b4_parser_class_name[::stack_symbol_type::type_get_ () const
977 {
978 return yystos_[state];
979 }
980
981
982 template <typename Exact>
983 void
984 ]b4_parser_class_name[::yy_destroy_ (const char* yymsg,
985 symbol_base_type<Exact>& yysym) const
986 {
987 int yytype = yysym.type_get ();
988 YYUSE (yymsg);
989 if (yymsg)
990 YY_SYMBOL_PRINT (yymsg, yysym);
991
992 // User destructor.
993 switch (yytype)
994 {
995 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
996 default:
997 break;
998 }]b4_variant_if([
999
1000 // Type destructor.
1001 b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[
1002 }
1003
1004 #if YYDEBUG
1005 template <typename Exact>
1006 void
1007 ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
1008 const symbol_base_type<Exact>& yysym) const
1009 {
1010 int yytype = yysym.type_get ();
1011 yyo << (yytype < yyntokens_ ? "token" : "nterm")
1012 << ' ' << yytname_[yytype] << " ("
1013 << yysym.location << ": ";
1014 switch (yytype)
1015 {
1016 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))[
1017 default:
1018 break;
1019 }
1020 yyo << ')';
1021 }
1022 #endif
1023
1024 void
1025 ]b4_parser_class_name[::yypush_ (const char* m, state_type s,
1026 symbol_type& sym)
1027 {
1028 if (m)
1029 YY_SYMBOL_PRINT (m, sym);
1030 ]b4_variant_if(
1031 [[ yystack_.push (stack_symbol_type (s, semantic_type(), sym.location));
1032 ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]],
1033 [build], [sym.value])],
1034 [ yystack_.push (stack_symbol_type (s, sym.value, sym.location));])[
1035 }
1036
1037 void
1038 ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
1039 {
1040 if (m)
1041 YY_SYMBOL_PRINT (m, s);
1042 ]b4_variant_if(
1043 [[ yystack_.push (stack_symbol_type (s.state, semantic_type(), s.location));
1044 ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]],
1045 [build], [s.value])],
1046 [ yystack_.push (s);])[
1047 }
1048
1049 void
1050 ]b4_parser_class_name[::yypop_ (unsigned int n)
1051 {
1052 yystack_.pop (n);
1053 }
1054
1055 #if YYDEBUG
1056 std::ostream&
1057 ]b4_parser_class_name[::debug_stream () const
1058 {
1059 return *yycdebug_;
1060 }
1061
1062 void
1063 ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
1064 {
1065 yycdebug_ = &o;
1066 }
1067
1068
1069 ]b4_parser_class_name[::debug_level_type
1070 ]b4_parser_class_name[::debug_level () const
1071 {
1072 return yydebug_;
1073 }
1074
1075 void
1076 ]b4_parser_class_name[::set_debug_level (debug_level_type l)
1077 {
1078 yydebug_ = l;
1079 }
1080 #endif
1081
1082 int
1083 ]b4_parser_class_name[::parse ()
1084 {
1085 /// Whether yyla contains a lookahead.
1086 bool yyempty = true;
1087
1088 /* State. */
1089 int yyn;
1090 int yylen = 0;
1091 int yystate = 0;
1092
1093 /* Error handling. */
1094 int yynerrs_ = 0;
1095 int yyerrstatus_ = 0;
1096
1097 /// The lookahead symbol.
1098 symbol_type yyla;
1099
1100 /// The locations where the error started and ended.
1101 stack_symbol_type yyerror_range[2];
1102
1103 /// $$ and @@$.
1104 stack_symbol_type yylhs;
1105
1106 /// The return value of parse().
1107 int yyresult;
1108
1109 YYCDEBUG << "Starting parse" << std::endl;
1110
1111 ]m4_ifdef([b4_initial_action], [
1112 m4_pushdef([b4_at_dollar], [yyla.location])dnl
1113 m4_pushdef([b4_dollar_dollar], [yyla.value])dnl
1114 /* User initialization code. */
1115 b4_user_initial_action
1116 m4_popdef([b4_dollar_dollar])dnl
1117 m4_popdef([b4_at_dollar])])dnl
1118
1119 [ /* Initialize the stack. The initial state will be set in
1120 yynewstate, since the latter expects the semantical and the
1121 location values to have been already stored, initialize these
1122 stacks with a primary value. */
1123 yystack_ = stack_type (0);
1124 yypush_ (0, 0, yyla);
1125
1126 // A new state was pushed on the stack.
1127 // Invariant: yystate == yystack_[0].state, i.e.,
1128 // yystate was just pushed onto the state stack.
1129 yynewstate:
1130 YYCDEBUG << "Entering state " << yystate << std::endl;
1131
1132 /* Accept? */
1133 if (yystate == yyfinal_)
1134 goto yyacceptlab;
1135
1136 goto yybackup;
1137
1138 /* Backup. */
1139 yybackup:
1140
1141 /* Try to take a decision without lookahead. */
1142 yyn = yypact_[yystate];
1143 if (yyn == yypact_ninf_)
1144 goto yydefault;
1145
1146 /* Read a lookahead token. */
1147 if (yyempty)
1148 {
1149 YYCDEBUG << "Reading a token: ";
1150 ]b4_lex_symbol_if(
1151 [ yyla = yylex();],
1152 [ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int],
1153 [[YYSTYPE*], [&yyla.value]][]dnl
1154 b4_locations_if([, [[location*], [&yyla.location]]])dnl
1155 m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
1156 yyempty = false;
1157 }
1158 YY_SYMBOL_PRINT ("Next token is", yyla);
1159
1160 /* If the proper action on seeing token YYLA.TYPE is to reduce or
1161 to detect an error, take that action. */
1162 yyn += yyla.type;
1163 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
1164 goto yydefault;
1165
1166 /* Reduce or error. */
1167 yyn = yytable_[yyn];
1168 if (yyn <= 0)
1169 {
1170 if (yyn == 0 || yyn == yytable_ninf_)
1171 goto yyerrlab;
1172 yyn = -yyn;
1173 goto yyreduce;
1174 }
1175
1176 /* Discard the token being shifted. */
1177 yyempty = true;
1178
1179 /* Count tokens shifted since error; after three, turn off error
1180 status. */
1181 if (yyerrstatus_)
1182 --yyerrstatus_;
1183
1184 /* Shift the lookahead token. */
1185 yystate = yyn;
1186 yypush_ ("Shifting", yystate, yyla);
1187 goto yynewstate;
1188
1189 /*-----------------------------------------------------------.
1190 | yydefault -- do the default action for the current state. |
1191 `-----------------------------------------------------------*/
1192 yydefault:
1193 yyn = yydefact_[yystate];
1194 if (yyn == 0)
1195 goto yyerrlab;
1196 goto yyreduce;
1197
1198 /*-----------------------------.
1199 | yyreduce -- Do a reduction. |
1200 `-----------------------------*/
1201 yyreduce:
1202 yylen = yyr2_[yyn];]b4_variant_if([
1203 /* Variants are always initialized to an empty instance of the
1204 correct type. The default $$=$1 rule is NOT applied when using
1205 variants */
1206 ]b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])[],[
1207 /* If YYLEN is nonzero, implement the default value of the action:
1208 `$$ = $1'. Otherwise, use the top of the stack.
1209
1210 Otherwise, the following line sets YYLHS.VALUE to garbage.
1211 This behavior is undocumented and Bison
1212 users should not rely upon it. */
1213 if (yylen)
1214 yylhs.value = yystack_@{yylen - 1@}.value;
1215 else
1216 yylhs.value = yystack_@{0@}.value;])[
1217
1218 // Compute the default @@$.
1219 {
1220 slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
1221 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
1222 }
1223
1224 // Perform the reduction.
1225 YY_REDUCE_PRINT (yyn);
1226 switch (yyn)
1227 {
1228 ]b4_user_actions[
1229 default:
1230 break;
1231 }
1232 // Compute post-reduction state.
1233 yyn = yyr1_[yyn];
1234 yystate = yypgoto_[yyn - yyntokens_] + yystack_[yylen].state;
1235 if (0 <= yystate && yystate <= yylast_
1236 && yycheck_[yystate] == yystack_[yylen].state)
1237 yystate = yytable_[yystate];
1238 else
1239 yystate = yydefgoto_[yyn - yyntokens_];
1240 yylhs.state = yystate;
1241 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
1242 ]b4_variant_if([[
1243 // Destroy the lhs symbols.
1244 for (int i = 0; i < yylen; ++i)
1245 // Destroy a variant which value may have be swapped with
1246 // yylhs.value. The value of yylhs.value (hence maybe one of
1247 // these lhs symbols) depends on what does the default
1248 // contruction for this type. In the case of pointers for
1249 // instance, nothing is done, so the value is junk. Therefore
1250 // do not try to report the content in the debug trace, it's
1251 // junk. Hence yymsg = 0. Besides, that keeps exactly the same
1252 // traces as with the other Bison skeletons.
1253 yy_destroy_ (0, yystack_[i]);]])[
1254
1255 yypop_ (yylen);
1256 yylen = 0;
1257 YY_STACK_PRINT ();
1258
1259 /* Shift the result of the reduction. */
1260 yypush_ (0, yylhs);
1261 goto yynewstate;
1262
1263 /*------------------------------------.
1264 | yyerrlab -- here on detecting error |
1265 `------------------------------------*/
1266 yyerrlab:
1267 /* If not already recovering from an error, report this error. */
1268 if (!yyerrstatus_)
1269 {
1270 ++yynerrs_;
1271 error (yyla.location, yysyntax_error_ (yystate, yyla.type));
1272 }
1273
1274 yyerror_range[0].location = yyla.location;
1275 if (yyerrstatus_ == 3)
1276 {
1277 /* If just tried and failed to reuse lookahead token after an
1278 error, discard it. */
1279
1280 /* Return failure if at end of input. */
1281 if (yyla.type == yyeof_)
1282 YYABORT;
1283 else
1284 {
1285 yy_destroy_ ("Error: discarding", yyla);
1286 yyempty = true;
1287 }
1288 }
1289
1290 /* Else will try to reuse lookahead token after shifting the error
1291 token. */
1292 goto yyerrlab1;
1293
1294
1295 /*---------------------------------------------------.
1296 | yyerrorlab -- error raised explicitly by YYERROR. |
1297 `---------------------------------------------------*/
1298 yyerrorlab:
1299
1300 /* Pacify compilers like GCC when the user code never invokes
1301 YYERROR and the label yyerrorlab therefore never appears in user
1302 code. */
1303 if (false)
1304 goto yyerrorlab;
1305
1306 yyerror_range[0].location = yystack_[yylen - 1].location;
1307 /* Do not reclaim the symbols of the rule which action triggered
1308 this YYERROR. */
1309 yypop_ (yylen);
1310 yylen = 0;
1311 yystate = yystack_[0].state;
1312 goto yyerrlab1;
1313
1314 /*-------------------------------------------------------------.
1315 | yyerrlab1 -- common code for both syntax error and YYERROR. |
1316 `-------------------------------------------------------------*/
1317 yyerrlab1:
1318 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
1319 {
1320 stack_symbol_type error_token;
1321 for (;;)
1322 {
1323 yyn = yypact_[yystate];
1324 if (yyn != yypact_ninf_)
1325 {
1326 yyn += yyterror_;
1327 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
1328 {
1329 yyn = yytable_[yyn];
1330 if (0 < yyn)
1331 break;
1332 }
1333 }
1334
1335 // Pop the current state because it cannot handle the error token.
1336 if (yystack_.size () == 1)
1337 YYABORT;
1338
1339 yyerror_range[0].location = yystack_[0].location;
1340 yy_destroy_ ("Error: popping", yystack_[0]);
1341 yypop_ ();
1342 yystate = yystack_[0].state;
1343 YY_STACK_PRINT ();
1344 }
1345
1346 yyerror_range[1].location = yyla.location;
1347 YYLLOC_DEFAULT (error_token.location, (yyerror_range - 1), 2);
1348
1349 /* Shift the error token. */
1350 error_token.state = yystate = yyn;
1351 yypush_ ("Shifting", error_token);
1352 }
1353 goto yynewstate;
1354
1355 /* Accept. */
1356 yyacceptlab:
1357 yyresult = 0;
1358 goto yyreturn;
1359
1360 /* Abort. */
1361 yyabortlab:
1362 yyresult = 1;
1363 goto yyreturn;
1364
1365 yyreturn:
1366 if (!yyempty)
1367 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
1368
1369 /* Do not reclaim the symbols of the rule which action triggered
1370 this YYABORT or YYACCEPT. */
1371 yypop_ (yylen);
1372 while (yystack_.size () != 1)
1373 {
1374 yy_destroy_ ("Cleanup: popping", yystack_[0]);
1375 yypop_ ();
1376 }
1377
1378 return yyresult;
1379 }
1380
1381 // Generate an error message.
1382 std::string
1383 ]b4_parser_class_name[::yysyntax_error_ (]dnl
1384 b4_error_verbose_if([int yystate, int yytoken],
1385 [int, int])[)
1386 {
1387 std::string yyres;]b4_error_verbose_if([[
1388 int yyn = yypact_[yystate];
1389 if (yypact_ninf_ < yyn && yyn <= yylast_)
1390 {
1391 /* Start YYX at -YYN if negative to avoid negative indexes in
1392 YYCHECK. */
1393 int yyxbegin = yyn < 0 ? -yyn : 0;
1394
1395 /* Stay within bounds of both yycheck and yytname. */
1396 int yychecklim = yylast_ - yyn + 1;
1397 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
1398
1399 // Number of "expected" tokens.
1400 size_t yycount = 0;
1401 // Its maximum.
1402 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1403 // Arguments of yyformat.
1404 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1405 yyarg[yycount++] = yytname_[yytoken];
1406 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
1407 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_)
1408 {
1409 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1410 {
1411 yycount = 1;
1412 break;
1413 }
1414 else
1415 yyarg[yycount++] = yytname_[yyx];
1416 }
1417
1418 char const* yyformat = 0;
1419 switch (yycount)
1420 {
1421 #define YYCASE_(N, S) \
1422 case N: \
1423 yyformat = S; \
1424 break
1425 YYCASE_(1, YY_("syntax error, unexpected %s"));
1426 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1427 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1428 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1429 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1430 #undef YYCASE_
1431 }
1432 // Argument number.
1433 size_t yyi = 0;
1434 for (char const* yyp = yyformat; *yyp; ++yyp)
1435 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1436 {
1437 yyres += yytnamerr_ (yyarg[yyi++]);
1438 ++yyp;
1439 }
1440 else
1441 yyres += *yyp;
1442 }
1443 else
1444 ]])dnl
1445 [ yyres = YY_("syntax error");
1446 return yyres;
1447 }
1448
1449
1450 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
1451 STATE-NUM. */
1452 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
1453 ]b4_table_define([pact], [b4_pact])[;
1454
1455 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
1456 doesn't specify something else to do. Zero means the default is an
1457 error. */
1458 ]b4_table_define([defact], [b4_defact])[;
1459
1460 /* YYPGOTO[NTERM-NUM]. */
1461 ]b4_table_define([pgoto], [b4_pgoto])[;
1462
1463 /* YYDEFGOTO[NTERM-NUM]. */
1464 ]b4_table_define([defgoto], [b4_defgoto])[;
1465
1466 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
1467 positive, shift that token. If negative, reduce the rule which
1468 number is the opposite. If zero, do what YYDEFACT says. */
1469 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1470 ]b4_table_define([table], [b4_table])[;
1471
1472 /* YYCHECK. */
1473 ]b4_table_define([check], [b4_check])[;
1474
1475 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
1476 symbol of state STATE-NUM. */
1477 ]b4_table_define([stos], [b4_stos])[;
1478
1479 #if YYDEBUG
1480 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
1481 to YYLEX-NUM. */
1482 ]b4_table_define([token_number], [b4_toknum])[;
1483 #endif
1484
1485 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
1486 ]b4_table_define([r1], [b4_r1])[;
1487
1488 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
1489 ]b4_table_define([r2], [b4_r2])[;
1490
1491 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
1492 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1493 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
1494 const char*
1495 const ]b4_parser_class_name[::yytname_[] =
1496 {
1497 ]b4_tname[
1498 };
1499 #endif
1500
1501 #if YYDEBUG
1502 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
1503 ]b4_table_define([rline], [b4_rline])[;
1504
1505 // Print the state stack on the debug stream.
1506 void
1507 ]b4_parser_class_name[::yystack_print_ ()
1508 {
1509 *yycdebug_ << "Stack now";
1510 for (stack_type::const_iterator
1511 i = yystack_.begin (),
1512 i_end = yystack_.end ();
1513 i != i_end; ++i)
1514 *yycdebug_ << ' ' << i->state;
1515 *yycdebug_ << std::endl;
1516 }
1517
1518 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1519 void
1520 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
1521 {
1522 unsigned int yylno = yyrline_[yyrule];
1523 int yynrhs = yyr2_[yyrule];
1524 /* Print the symbols being reduced, and their result. */
1525 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
1526 << " (line " << yylno << "):" << std::endl;
1527 /* The symbols being reduced. */
1528 for (int yyi = 0; yyi < yynrhs; yyi++)
1529 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1530 ]b4_rhs_data(yynrhs, yyi + 1)[);
1531 }
1532 #endif // YYDEBUG
1533
1534 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
1535 ]b4_parser_class_name[::token_number_type
1536 ]b4_parser_class_name[::yytranslate_ (int t)
1537 {
1538 static
1539 const token_number_type
1540 translate_table[] =
1541 {
1542 ]b4_translate[
1543 };
1544 const unsigned int user_token_number_max_ = ]b4_user_token_number_max[;
1545 const token_number_type undef_token_ = ]b4_undef_token_number[;
1546
1547 if (t <= yyeof_)
1548 return yyeof_;
1549 else if (static_cast<unsigned int> (t) <= user_token_number_max_)
1550 return translate_table[t];
1551 else
1552 return undef_token_;
1553 }
1554
1555 ]b4_namespace_close[
1556
1557 ]b4_epilogue[]dnl
1558 @output(b4_dir_prefix[]stack.hh@)@
1559 b4_copyright([Stack handling for Bison parsers in C++])[
1560
1561 #ifndef BISON_STACK_HH
1562 # define BISON_STACK_HH
1563
1564 #include <deque>
1565
1566 ]b4_namespace_open[
1567 template <class T, class S = std::deque<T> >
1568 class stack
1569 {
1570 public:
1571
1572 // Hide our reversed order.
1573 typedef typename S::reverse_iterator iterator;
1574 typedef typename S::const_reverse_iterator const_iterator;
1575
1576 stack () : seq_ ()
1577 {
1578 }
1579
1580 stack (unsigned int n) : seq_ (n)
1581 {
1582 }
1583
1584 inline
1585 T&
1586 operator [] (unsigned int i)
1587 {
1588 return seq_[i];
1589 }
1590
1591 inline
1592 const T&
1593 operator [] (unsigned int i) const
1594 {
1595 return seq_[i];
1596 }
1597
1598 inline
1599 void
1600 push (const T& t)
1601 {
1602 seq_.push_front (t);
1603 }
1604
1605 inline
1606 void
1607 pop (unsigned int n = 1)
1608 {
1609 for (; n; --n)
1610 seq_.pop_front ();
1611 }
1612
1613 inline
1614 typename S::size_type
1615 size () const
1616 {
1617 return seq_.size ();
1618 }
1619
1620 inline const_iterator begin () const { return seq_.rbegin (); }
1621 inline const_iterator end () const { return seq_.rend (); }
1622
1623 private:
1624 /// The wrapped container.
1625 S seq_;
1626 };
1627
1628 /// Present a slice of the top of a stack.
1629 template <class T, class S = stack<T> >
1630 class slice
1631 {
1632 public:
1633
1634 slice (const S& stack,
1635 unsigned int range) : stack_ (stack),
1636 range_ (range)
1637 {
1638 }
1639
1640 inline
1641 const T&
1642 operator [] (unsigned int i) const
1643 {
1644 return stack_[range_ - i];
1645 }
1646
1647 private:
1648
1649 const S& stack_;
1650 unsigned int range_;
1651 };
1652 ]b4_namespace_close[
1653
1654 #endif // not BISON_STACK_HH[]dnl
1655 ]
1656 m4_divert_pop(0)
1657 m4_popdef([b4_copyright_years])dnl