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