]> git.saurik.com Git - bison.git/blame - data/lalr1.cc
tests: add -pedantic for --enable-gcc-warnings.
[bison.git] / data / lalr1.cc
CommitLineData
60491a94 1# C++ skeleton for Bison
b4721715 2
ea0a7676 3# Copyright (C) 2002-2011 Free Software Foundation, Inc.
60491a94 4
f16b0819 5# This program is free software: you can redistribute it and/or modify
60491a94 6# it under the terms of the GNU General Public License as published by
f16b0819 7# the Free Software Foundation, either version 3 of the License, or
60491a94 8# (at your option) any later version.
f16b0819 9#
60491a94
AD
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
f16b0819 14#
60491a94 15# You should have received a copy of the GNU General Public License
f16b0819 16# along with this program. If not, see <http://www.gnu.org/licenses/>.
60491a94 17
cf147260 18m4_include(b4_pkgdatadir/[c++.m4])
7eb8a0bc 19
6afc30cc 20m4_define([b4_parser_class_name],
a4e25e1d 21 [b4_percent_define_get([[parser_class_name]])])
34376418
AD
22
23# The header is mandatory.
24b4_defines_if([],
5f340b48 25 [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
34376418 26
95a2de56
AD
27b4_percent_define_ifdef([[location_type]], [],
28 [# Backward compatibility.
29 m4_define([b4_location_constructors])
30 m4_include(b4_pkgdatadir/[location.cc])])
a5eb1ed2 31
b526ee61
AD
32# We do want M4 expansion after # for CPP macros.
33m4_changecom()
08af01c2 34m4_divert_push(0)dnl
327afc7c 35b4_defines_if(
0d2b2ab0 36[@output(b4_spec_defines_file@)@
193d7c70 37b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
ea0a7676 38 [2002-2011])
fb9712a9 39dnl FIXME: This is wrong, we want computed header guards.
8bb4c753 40[
af3412cd
PE
41/* C++ LALR(1) parser skeleton written by Akim Demaille. */
42
c5e3e510
AD
43#ifndef PARSER_HEADER_H
44# define PARSER_HEADER_H
2b548aa6 45
a4e25e1d 46]b4_percent_code_get([[requires]])[
aef3da86 47
8d69a1a3 48#include <string>
717be197 49#include <iostream>
df5df58d 50#include "stack.hh"
95a2de56
AD
51]b4_percent_define_ifdef([[location_type]], [],
52 [[#include "location.hh"]])[
fc695704 53
69e2658b
RA
54/* Enabling traces. */
55#ifndef YYDEBUG
327afc7c 56# define YYDEBUG ]b4_debug_flag[
69e2658b
RA
57#endif
58
141f5793
PE
59/* Enabling verbose error messages. */
60#ifdef YYERROR_VERBOSE
61# undef YYERROR_VERBOSE
62# define YYERROR_VERBOSE 1
63#else
327afc7c 64# define YYERROR_VERBOSE ]b4_error_verbose_flag[
69e2658b
RA
65#endif
66
141f5793
PE
67/* Enabling the token table. */
68#ifndef YYTOKEN_TABLE
69# define YYTOKEN_TABLE ]b4_token_table[
70#endif
71
793fbca5 72]b4_namespace_open[
3f3eed27 73
efeed023 74 /// A Bison parser.
07fed891 75 class ]b4_parser_class_name[
2b548aa6 76 {
fb9712a9 77 public:
617a8f12 78 /// Symbol semantic values.
02650b7f 79#ifndef YYSTYPE
fb9712a9 80]m4_ifdef([b4_stype],
1221b78a 81[ union semantic_type
7ecec4dd 82 {
8ec0a172 83b4_user_stype
7ecec4dd 84 };],
ddc8ede1
PE
85[m4_if(b4_tag_seen_flag, 0,
86[[ typedef int semantic_type;]],
87[[ typedef YYSTYPE semantic_type;]])])[
fb9712a9 88#else
f479c6c6 89 typedef YYSTYPE semantic_type;
fb9712a9 90#endif
617a8f12 91 /// Symbol locations.
95a2de56
AD
92 typedef ]b4_percent_define_get([[location_type]],
93 [[location]])[ location_type;
fb9712a9
AD
94 /// Tokens.
95 struct token
96 {
97 ]b4_token_enums(b4_tokens)[
98 };
c095d689
AD
99 /// Token type.
100 typedef token::yytokentype token_type;
2b548aa6 101
efeed023 102 /// Build a parser object.
98ae9643
AD
103 ]b4_parser_class_name[ (]b4_parse_param_decl[);
104 virtual ~]b4_parser_class_name[ ();
2b548aa6 105
f69a4142
AD
106 /// Parse.
107 /// \returns 0 iff parsing succeeded.
e019c247 108 virtual int parse ();
2b548aa6 109
52cbbe84 110#if YYDEBUG
f69a4142 111 /// The current debugging stream.
9a1e9989
AD
112 std::ostream& debug_stream () const;
113 /// Set the current debugging stream.
114 void set_debug_stream (std::ostream &);
115
a3cb6248
AD
116 /// Type for debugging levels.
117 typedef int debug_level_type;
118 /// The current debugging level.
119 debug_level_type debug_level () const;
120 /// Set the current debugging level.
121 void set_debug_level (debug_level_type l);
52cbbe84 122#endif
a3cb6248 123
2b548aa6 124 private:
efeed023
AD
125 /// Report a syntax error.
126 /// \param loc where the syntax error is found.
127 /// \param msg a description of the syntax error.
99880de5 128 virtual void error (const location_type& loc, const std::string& msg);
efeed023 129
dbcdae2d 130 /// Generate an error message.
d4fb5e3c 131 /// \param state the state where the error occurred.
742e4900 132 /// \param tok the lookahead token.
1e05521d 133 virtual std::string yysyntax_error_ (int yystate, int tok);
efeed023 134
a5eb1ed2 135#if YYDEBUG
a0af42fc
AD
136 /// \brief Report a symbol value on the debug stream.
137 /// \param yytype The token type.
138 /// \param yyvaluep Its semantic value.
139 /// \param yylocationp Its location.
140 virtual void yy_symbol_value_print_ (int yytype,
02650b7f
PE
141 const semantic_type* yyvaluep,
142 const location_type* yylocationp);
f69a4142
AD
143 /// \brief Report a symbol on the debug stream.
144 /// \param yytype The token type.
145 /// \param yyvaluep Its semantic value.
146 /// \param yylocationp Its location.
a0af42fc 147 virtual void yy_symbol_print_ (int yytype,
02650b7f
PE
148 const semantic_type* yyvaluep,
149 const location_type* yylocationp);
fa7b79c0 150#endif
a5eb1ed2 151
4bb2bc3f 152
e019c247 153 /// State numbers.
f479c6c6 154 typedef int state_type;
e019c247
AD
155 /// State stack type.
156 typedef stack<state_type> state_stack_type;
157 /// Semantic value stack type.
158 typedef stack<semantic_type> semantic_stack_type;
159 /// location stack type.
160 typedef stack<location_type> location_stack_type;
161
f69a4142 162 /// The state stack.
e019c247 163 state_stack_type yystate_stack_;
f69a4142 164 /// The semantic value stack.
e019c247 165 semantic_stack_type yysemantic_stack_;
f69a4142 166 /// The location stack.
e019c247 167 location_stack_type yylocation_stack_;
2b548aa6 168
d5eb0826
JD
169 /// Whether the given \c yypact_ value indicates a defaulted state.
170 /// \param yyvalue the value to check
171 static bool yy_pact_value_is_default_ (int yyvalue);
172
173 /// Whether the given \c yytable_ value indicates a syntax error.
174 /// \param yyvalue the value to check
175 static bool yy_table_value_is_error_ (int yyvalue);
176
e019c247 177 /// Internal symbol numbers.
f479c6c6 178 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
2b548aa6 179 /* Tables. */
efeed023 180 /// For a state, the index in \a yytable_ of its portion.
617a8f12
AD
181 static const ]b4_int_type_for([b4_pact])[ yypact_[];
182 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
efeed023 183
620b5727 184 /// For a state, default reduction number.
efeed023
AD
185 /// Unless\a yytable_ specifies something else to do.
186 /// Zero means the default is an error.
617a8f12 187 static const ]b4_int_type_for([b4_defact])[ yydefact_[];
efeed023 188
617a8f12
AD
189 static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
190 static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
efeed023
AD
191
192 /// What to do in a state.
193 /// \a yytable_[yypact_[s]]: what to do in state \a s.
194 /// - if positive, shift that token.
195 /// - if negative, reduce the rule which number is the opposite.
196 /// - if zero, do what YYDEFACT says.
617a8f12
AD
197 static const ]b4_int_type_for([b4_table])[ yytable_[];
198 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
efeed023 199
617a8f12 200 static const ]b4_int_type_for([b4_check])[ yycheck_[];
efeed023
AD
201
202 /// For a state, its accessing symbol.
617a8f12 203 static const ]b4_int_type_for([b4_stos])[ yystos_[];
efeed023
AD
204
205 /// For a rule, its LHS.
617a8f12 206 static const ]b4_int_type_for([b4_r1])[ yyr1_[];
efeed023 207 /// For a rule, its RHS length.
617a8f12 208 static const ]b4_int_type_for([b4_r2])[ yyr2_[];
69e2658b 209
141f5793 210#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
efeed023 211 /// For a symbol, its name in clear.
9e0876fb 212 static const char* const yytname_[];
39f6a8d1 213#endif]b4_error_verbose_if([
9e0876fb 214
9e0876fb 215 /// Convert the symbol name \a n to a form suitable for a diagnostic.
39f6a8d1 216 static std::string yytnamerr_ (const char *n);])[
2b548aa6 217
69e2658b 218#if YYDEBUG
e019c247 219 /// A type to store symbol numbers and -1.
f479c6c6 220 typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
617a8f12 221 /// A `-1'-separated list of the rules' RHS.
99880de5 222 static const rhs_number_type yyrhs_[];
617a8f12
AD
223 /// For each rule, the index of the first RHS symbol in \a yyrhs_.
224 static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];
225 /// For each rule, its source line number.
226 static const ]b4_int_type_for([b4_rline])[ yyrline_[];
227 /// For each scanner token number, its symbol number.
228 static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
efeed023 229 /// Report on the debug stream that the rule \a r is going to be reduced.
d1ff7a7c 230 virtual void yy_reduce_print_ (int r);
efeed023 231 /// Print the state stack on the debug stream.
f69a4142 232 virtual void yystack_print_ ();
fa7b79c0
PE
233
234 /* Debugging. */
235 int yydebug_;
236 std::ostream* yycdebug_;
69e2658b 237#endif
2b548aa6 238
32c96bd7
AD
239 /// Convert a scanner token number \a t to a symbol number.
240 token_number_type yytranslate_ (int t);
f69a4142
AD
241
242 /// \brief Reclaim the memory associated to a symbol.
243 /// \param yymsg Why this token is reclaimed.
244 /// \param yytype The symbol type.
245 /// \param yyvaluep Its semantic value.
246 /// \param yylocationp Its location.
247 inline void yydestruct_ (const char* yymsg,
02650b7f
PE
248 int yytype,
249 semantic_type* yyvaluep,
250 location_type* yylocationp);
2b548aa6 251
52d5733f 252 /// Pop \a n symbols the three stacks.
f69a4142 253 inline void yypop_ (unsigned int n = 1);
52d5733f 254
762a801e 255 /* Constants. */
617a8f12 256 static const int yyeof_;
39912f52 257 /* LAST_ -- Last index in TABLE_. */
617a8f12
AD
258 static const int yylast_;
259 static const int yynnts_;
260 static const int yyempty_;
261 static const int yyfinal_;
262 static const int yyterror_;
263 static const int yyerrcode_;
264 static const int yyntokens_;
265 static const unsigned int yyuser_token_number_max_;
99880de5 266 static const token_number_type yyundef_token_;
caf37a36 267]b4_parse_param_vars[
2b548aa6 268 };
793fbca5 269]b4_namespace_close[
2b548aa6 270
592d0b1e 271]b4_percent_define_flag_if([[global_tokens_and_yystype]],
fb9712a9
AD
272[b4_token_defines(b4_tokens)
273
274#ifndef YYSTYPE
9d9b8b70 275 /* Redirection for backward compatibility. */
793fbca5 276# define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
fb9712a9 277#endif
9bc0dd67 278])
a4e25e1d 279b4_percent_code_get([[provides]])[]dnl
9bc0dd67
JD
280
281[#endif /* ! defined PARSER_HEADER_H */]
b61c6978 282])dnl
0d2b2ab0 283@output(b4_parser_file_name@)@
193d7c70 284b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
ea0a7676 285 [2002-2011])
a4e25e1d 286b4_percent_code_get([[top]])[]dnl
aa08666d 287m4_if(b4_prefix, [yy], [],
c5b95ccf
AD
288[
289// Take the name prefix into account.
9bc0dd67
JD
290#define yylex b4_prefix[]lex])[
291
292/* First part of user declarations. */
136a0f76 293]b4_user_pre_prologue
9bc0dd67 294
bd9d212b
JD
295b4_defines_if([[
296#include "@basename(]b4_spec_defines_file[@)"]])[
50997c6e 297
fb9712a9 298/* User implementation prologue. */
8e0a5e9e 299]b4_user_post_prologue
a4e25e1d 300b4_percent_code_get[]dnl
fb9712a9 301
8e0a5e9e 302[#ifndef YY_
06caf0e1 303# if defined YYENABLE_NLS && YYENABLE_NLS
30757c8c
PE
304# if ENABLE_NLS
305# include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
306# define YY_(msgid) dgettext ("bison-runtime", msgid)
307# endif
308# endif
309# ifndef YY_
310# define YY_(msgid) msgid
311# endif
989b5b8e
AD
312#endif
313
3d4a0cad
AD
314/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
315 If N is 0, then set CURRENT to the empty location which ends
316 the previous symbol: RHS[0] (always defined). */
317
318#define YYRHSLOC(Rhs, K) ((Rhs)[K])
319#ifndef YYLLOC_DEFAULT
320# define YYLLOC_DEFAULT(Current, Rhs, N) \
321 do \
322 if (N) \
323 { \
324 (Current).begin = YYRHSLOC (Rhs, 1).begin; \
325 (Current).end = YYRHSLOC (Rhs, N).end; \
326 } \
327 else \
328 { \
329 (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \
330 } \
331 while (false)
332#endif
333
2a4647a3 334/* Suppress unused-variable warnings by "using" E. */
12ce2df6 335#define YYUSE(e) ((void) (e))
2a4647a3 336
2b548aa6 337/* Enable debugging if requested. */
50997c6e 338#if YYDEBUG
284acc8b 339
fa7b79c0
PE
340/* A pseudo ostream that takes yydebug_ into account. */
341# define YYCDEBUG if (yydebug_) (*yycdebug_)
342
284acc8b
AD
343# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
344do { \
a3cb6248 345 if (yydebug_) \
284acc8b 346 { \
d1ff7a7c 347 *yycdebug_ << Title << ' '; \
a0af42fc 348 yy_symbol_print_ ((Type), (Value), (Location)); \
9a1e9989 349 *yycdebug_ << std::endl; \
284acc8b 350 } \
2a4647a3 351} while (false)
284acc8b 352
5348bfbe
AD
353# define YY_REDUCE_PRINT(Rule) \
354do { \
a3cb6248 355 if (yydebug_) \
d1ff7a7c 356 yy_reduce_print_ (Rule); \
2a4647a3 357} while (false)
284acc8b 358
25f66e1a
AD
359# define YY_STACK_PRINT() \
360do { \
a3cb6248 361 if (yydebug_) \
f69a4142 362 yystack_print_ (); \
2a4647a3 363} while (false)
284acc8b 364
2b548aa6 365#else /* !YYDEBUG */
284acc8b 366
a36b333c 367# define YYCDEBUG if (false) std::cerr
284acc8b 368# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
5348bfbe 369# define YY_REDUCE_PRINT(Rule)
25f66e1a 370# define YY_STACK_PRINT()
284acc8b 371
2b548aa6
RA
372#endif /* !YYDEBUG */
373
98e26a92
AD
374#define yyerrok (yyerrstatus_ = 0)
375#define yyclearin (yychar = yyempty_)
376
60a777aa
AD
377#define YYACCEPT goto yyacceptlab
378#define YYABORT goto yyabortlab
47301314 379#define YYERROR goto yyerrorlab
98e26a92 380#define YYRECOVERING() (!!yyerrstatus_)
60a777aa 381
39f6a8d1 382]b4_namespace_open[]b4_error_verbose_if([[
9e0876fb 383
aa08666d
AD
384 /* Return YYSTR after stripping away unnecessary quotes and
385 backslashes, so that it's suitable for yyerror. The heuristic is
386 that double-quoting is unnecessary unless the string contains an
387 apostrophe, a comma, or backslash (other than backslash-backslash).
388 YYSTR is taken from yytname. */
389 std::string
390 ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
391 {
392 if (*yystr == '"')
393 {
394 std::string yyr = "";
395 char const *yyp = yystr;
193d7c70 396
aa08666d
AD
397 for (;;)
398 switch (*++yyp)
399 {
400 case '\'':
401 case ',':
402 goto do_not_strip_quotes;
193d7c70 403
aa08666d
AD
404 case '\\':
405 if (*++yyp != '\\')
406 goto do_not_strip_quotes;
407 /* Fall through. */
408 default:
409 yyr += *yyp;
410 break;
193d7c70 411
aa08666d
AD
412 case '"':
413 return yyr;
414 }
415 do_not_strip_quotes: ;
416 }
193d7c70 417
aa08666d
AD
418 return yystr;
419 }
39f6a8d1 420]])[
9e0876fb 421
98ae9643 422 /// Build a parser object.
fa7b79c0
PE
423 ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
424 :])[
425#if YYDEBUG
426 ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
427 yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
428#endif]b4_parse_param_cons[
98ae9643
AD
429 {
430 }
a0e68930 431
98ae9643
AD
432 ]b4_parser_class_name::~b4_parser_class_name[ ()
433 {
434 }
a0e68930 435
98ae9643
AD
436#if YYDEBUG
437 /*--------------------------------.
438 | Print this symbol on YYOUTPUT. |
439 `--------------------------------*/
a0e68930 440
a0af42fc
AD
441 inline void
442 ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
02650b7f 443 const semantic_type* yyvaluep, const location_type* yylocationp)
98ae9643 444 {
98ae9643
AD
445 YYUSE (yylocationp);
446 YYUSE (yyvaluep);
98ae9643
AD
447 switch (yytype)
448 {
449 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
450[ default:
02650b7f 451 break;
98ae9643 452 }
a0af42fc
AD
453 }
454
455
456 void
457 ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
02650b7f 458 const semantic_type* yyvaluep, const location_type* yylocationp)
a0af42fc
AD
459 {
460 *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
02650b7f
PE
461 << ' ' << yytname_[yytype] << " ("
462 << *yylocationp << ": ";
a0af42fc 463 yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
98ae9643
AD
464 *yycdebug_ << ')';
465 }
fa7b79c0 466#endif
a0e68930 467
98ae9643
AD
468 void
469 ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
02650b7f 470 int yytype, semantic_type* yyvaluep, location_type* yylocationp)
98ae9643
AD
471 {
472 YYUSE (yylocationp);
473 YYUSE (yymsg);
474 YYUSE (yyvaluep);
475
476 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
477
478 switch (yytype)
479 {
480 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
02650b7f
PE
481 default:
482 break;
98ae9643
AD
483 }
484 }
60a777aa 485
98ae9643
AD
486 void
487 ]b4_parser_class_name[::yypop_ (unsigned int n)
488 {
489 yystate_stack_.pop (n);
490 yysemantic_stack_.pop (n);
491 yylocation_stack_.pop (n);
492 }
52d5733f 493
fa7b79c0 494#if YYDEBUG
98ae9643
AD
495 std::ostream&
496 ]b4_parser_class_name[::debug_stream () const
497 {
498 return *yycdebug_;
499 }
9a1e9989 500
98ae9643
AD
501 void
502 ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
503 {
504 yycdebug_ = &o;
505 }
9a1e9989
AD
506
507
98ae9643
AD
508 ]b4_parser_class_name[::debug_level_type
509 ]b4_parser_class_name[::debug_level () const
510 {
511 return yydebug_;
512 }
a3cb6248 513
98ae9643
AD
514 void
515 ]b4_parser_class_name[::set_debug_level (debug_level_type l)
516 {
517 yydebug_ = l;
518 }
fa7b79c0 519#endif
a3cb6248 520
d5eb0826
JD
521 inline bool
522 ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
523 {
524 return yyvalue == yypact_ninf_;
525 }
526
527 inline bool
528 ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue)
529 {
e4bcae3c 530 return yyvalue == yytable_ninf_;
d5eb0826
JD
531 }
532
98ae9643
AD
533 int
534 ]b4_parser_class_name[::parse ()
535 {
742e4900 536 /// Lookahead and lookahead in internal form.
98ae9643
AD
537 int yychar = yyempty_;
538 int yytoken = 0;
d4fb5e3c 539
98ae9643
AD
540 /* State. */
541 int yyn;
a85284cf 542 int yylen = 0;
98ae9643 543 int yystate = 0;
d4fb5e3c 544
9d9b8b70 545 /* Error handling. */
98ae9643
AD
546 int yynerrs_ = 0;
547 int yyerrstatus_ = 0;
dbcdae2d 548
742e4900 549 /// Semantic value of the lookahead.
98ae9643 550 semantic_type yylval;
742e4900 551 /// Location of the lookahead.
98ae9643
AD
552 location_type yylloc;
553 /// The locations where the error started and ended.
a005dbcb 554 location_type yyerror_range[3];
dbcdae2d 555
98ae9643
AD
556 /// $$.
557 semantic_type yyval;
558 /// @@$.
559 location_type yyloc;
dbcdae2d 560
98ae9643 561 int yyresult;
ad745863 562
98ae9643 563 YYCDEBUG << "Starting parse" << std::endl;
451364ed 564
451364ed 565]m4_ifdef([b4_initial_action], [
99880de5
AD
566m4_pushdef([b4_at_dollar], [yylloc])dnl
567m4_pushdef([b4_dollar_dollar], [yylval])dnl
9d9b8b70 568 /* User initialization code. */
8ec0a172 569 b4_user_initial_action
451364ed 570m4_popdef([b4_dollar_dollar])dnl
8ec0a172 571m4_popdef([b4_at_dollar])])dnl
451364ed 572
98ae9643
AD
573 [ /* Initialize the stacks. The initial state will be pushed in
574 yynewstate, since the latter expects the semantical and the
575 location values to have been already stored, initialize these
576 stacks with a primary value. */
577 yystate_stack_ = state_stack_type (0);
578 yysemantic_stack_ = semantic_stack_type (0);
579 yylocation_stack_ = location_stack_type (0);
580 yysemantic_stack_.push (yylval);
581 yylocation_stack_.push (yylloc);
582
583 /* New state. */
584 yynewstate:
585 yystate_stack_.push (yystate);
586 YYCDEBUG << "Entering state " << yystate << std::endl;
868d2d96
JD
587
588 /* Accept? */
589 if (yystate == yyfinal_)
590 goto yyacceptlab;
591
98ae9643
AD
592 goto yybackup;
593
594 /* Backup. */
595 yybackup:
596
742e4900 597 /* Try to take a decision without lookahead. */
98ae9643 598 yyn = yypact_[yystate];
d5eb0826 599 if (yy_pact_value_is_default_ (yyn))
98ae9643
AD
600 goto yydefault;
601
742e4900 602 /* Read a lookahead token. */
98ae9643
AD
603 if (yychar == yyempty_)
604 {
02650b7f
PE
605 YYCDEBUG << "Reading a token: ";
606 yychar = ]b4_c_function_call([yylex], [int],
607 [[YYSTYPE*], [&yylval]][]dnl
327afc7c 608b4_locations_if([, [[location*], [&yylloc]]])dnl
dbcdae2d 609m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
98ae9643
AD
610 }
611
612
613 /* Convert token to internal form. */
614 if (yychar <= yyeof_)
615 {
02650b7f
PE
616 yychar = yytoken = yyeof_;
617 YYCDEBUG << "Now at end of input." << std::endl;
98ae9643
AD
618 }
619 else
620 {
02650b7f
PE
621 yytoken = yytranslate_ (yychar);
622 YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
98ae9643
AD
623 }
624
625 /* If the proper action on seeing token YYTOKEN is to reduce or to
626 detect an error, take that action. */
627 yyn += yytoken;
34ec3579 628 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
98ae9643
AD
629 goto yydefault;
630
631 /* Reduce or error. */
632 yyn = yytable_[yyn];
633 if (yyn <= 0)
634 {
d5eb0826
JD
635 if (yy_table_value_is_error_ (yyn))
636 goto yyerrlab;
02650b7f
PE
637 yyn = -yyn;
638 goto yyreduce;
98ae9643
AD
639 }
640
742e4900 641 /* Shift the lookahead token. */
98ae9643
AD
642 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
643
868d2d96
JD
644 /* Discard the token being shifted. */
645 yychar = yyempty_;
98ae9643
AD
646
647 yysemantic_stack_.push (yylval);
648 yylocation_stack_.push (yylloc);
649
650 /* Count tokens shifted since error; after three, turn off error
651 status. */
652 if (yyerrstatus_)
653 --yyerrstatus_;
654
655 yystate = yyn;
656 goto yynewstate;
657
658 /*-----------------------------------------------------------.
659 | yydefault -- do the default action for the current state. |
660 `-----------------------------------------------------------*/
661 yydefault:
662 yyn = yydefact_[yystate];
663 if (yyn == 0)
664 goto yyerrlab;
665 goto yyreduce;
666
667 /*-----------------------------.
668 | yyreduce -- Do a reduction. |
669 `-----------------------------*/
670 yyreduce:
671 yylen = yyr2_[yyn];
a85284cf 672 /* If YYLEN is nonzero, implement the default value of the action:
98ae9643
AD
673 `$$ = $1'. Otherwise, use the top of the stack.
674
675 Otherwise, the following line sets YYVAL to garbage.
676 This behavior is undocumented and Bison
677 users should not rely upon it. */
678 if (yylen)
679 yyval = yysemantic_stack_[yylen - 1];
680 else
681 yyval = yysemantic_stack_[0];
2b548aa6 682
2b548aa6 683 {
98ae9643
AD
684 slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);
685 YYLLOC_DEFAULT (yyloc, slice, yylen);
2b548aa6 686 }
98ae9643
AD
687 YY_REDUCE_PRINT (yyn);
688 switch (yyn)
689 {
8ec0a172 690 ]b4_user_actions[
cf98343c
AD
691 default:
692 break;
98ae9643 693 }
3b837882
JD
694 /* User semantic actions sometimes alter yychar, and that requires
695 that yytoken be updated with the new translation. We take the
696 approach of translating immediately before every use of yytoken.
697 One alternative is translating here after every semantic action,
698 but that translation would be missed if the semantic action
699 invokes YYABORT, YYACCEPT, or YYERROR immediately after altering
700 yychar. In the case of YYABORT or YYACCEPT, an incorrect
701 destructor might then be invoked immediately. In the case of
702 YYERROR, subsequent parser actions might lead to an incorrect
703 destructor call or verbose syntax error message before the
704 lookahead is translated. */
d1ff7a7c 705 YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
98ae9643
AD
706
707 yypop_ (yylen);
a85284cf 708 yylen = 0;
98ae9643
AD
709 YY_STACK_PRINT ();
710
711 yysemantic_stack_.push (yyval);
712 yylocation_stack_.push (yyloc);
713
714 /* Shift the result of the reduction. */
715 yyn = yyr1_[yyn];
716 yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];
717 if (0 <= yystate && yystate <= yylast_
34ec3579 718 && yycheck_[yystate] == yystate_stack_[0])
98ae9643
AD
719 yystate = yytable_[yystate];
720 else
721 yystate = yydefgoto_[yyn - yyntokens_];
722 goto yynewstate;
723
724 /*------------------------------------.
725 | yyerrlab -- here on detecting error |
726 `------------------------------------*/
727 yyerrlab:
3b837882
JD
728 /* Make sure we have latest lookahead translation. See comments at
729 user semantic actions for why this is necessary. */
730 yytoken = yytranslate_ (yychar);
731
98ae9643
AD
732 /* If not already recovering from an error, report this error. */
733 if (!yyerrstatus_)
734 {
02650b7f 735 ++yynerrs_;
095a1d11
JD
736 if (yychar == yyempty_)
737 yytoken = yyempty_;
1e05521d 738 error (yylloc, yysyntax_error_ (yystate, yytoken));
98ae9643
AD
739 }
740
a005dbcb 741 yyerror_range[1] = yylloc;
98ae9643
AD
742 if (yyerrstatus_ == 3)
743 {
742e4900 744 /* If just tried and failed to reuse lookahead token after an
02650b7f
PE
745 error, discard it. */
746
747 if (yychar <= yyeof_)
748 {
749 /* Return failure if at end of input. */
750 if (yychar == yyeof_)
751 YYABORT;
752 }
753 else
754 {
755 yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
756 yychar = yyempty_;
757 }
98ae9643
AD
758 }
759
742e4900 760 /* Else will try to reuse lookahead token after shifting the error
98ae9643
AD
761 token. */
762 goto yyerrlab1;
763
764
765 /*---------------------------------------------------.
766 | yyerrorlab -- error raised explicitly by YYERROR. |
767 `---------------------------------------------------*/
768 yyerrorlab:
769
770 /* Pacify compilers like GCC when the user code never invokes
771 YYERROR and the label yyerrorlab therefore never appears in user
772 code. */
773 if (false)
774 goto yyerrorlab;
775
a005dbcb 776 yyerror_range[1] = yylocation_stack_[yylen - 1];
a85284cf 777 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 778 this YYERROR. */
98ae9643 779 yypop_ (yylen);
a85284cf 780 yylen = 0;
98ae9643
AD
781 yystate = yystate_stack_[0];
782 goto yyerrlab1;
783
784 /*-------------------------------------------------------------.
785 | yyerrlab1 -- common code for both syntax error and YYERROR. |
786 `-------------------------------------------------------------*/
787 yyerrlab1:
788 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
789
790 for (;;)
791 {
02650b7f 792 yyn = yypact_[yystate];
d5eb0826 793 if (!yy_pact_value_is_default_ (yyn))
02650b7f
PE
794 {
795 yyn += yyterror_;
34ec3579 796 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
02650b7f
PE
797 {
798 yyn = yytable_[yyn];
799 if (0 < yyn)
800 break;
801 }
802 }
803
804 /* Pop the current state because it cannot handle the error token. */
805 if (yystate_stack_.height () == 1)
806 YYABORT;
807
a005dbcb 808 yyerror_range[1] = yylocation_stack_[0];
02650b7f
PE
809 yydestruct_ ("Error: popping",
810 yystos_[yystate],
811 &yysemantic_stack_[0], &yylocation_stack_[0]);
812 yypop_ ();
813 yystate = yystate_stack_[0];
814 YY_STACK_PRINT ();
98ae9643
AD
815 }
816
a005dbcb 817 yyerror_range[2] = yylloc;
98ae9643 818 // Using YYLLOC is tempting, but would change the location of
742e4900 819 // the lookahead. YYLOC is available though.
a005dbcb 820 YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
98ae9643
AD
821 yysemantic_stack_.push (yylval);
822 yylocation_stack_.push (yyloc);
823
9d9b8b70 824 /* Shift the error token. */
98ae9643 825 YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
482dc52f 826 &yysemantic_stack_[0], &yylocation_stack_[0]);
98ae9643
AD
827
828 yystate = yyn;
829 goto yynewstate;
830
831 /* Accept. */
832 yyacceptlab:
833 yyresult = 0;
834 goto yyreturn;
835
836 /* Abort. */
837 yyabortlab:
838 yyresult = 1;
839 goto yyreturn;
840
841 yyreturn:
868d2d96 842 if (yychar != yyempty_)
3b837882
JD
843 {
844 /* Make sure we have latest lookahead translation. See comments
845 at user semantic actions for why this is necessary. */
846 yytoken = yytranslate_ (yychar);
847 yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval,
848 &yylloc);
849 }
98ae9643 850
a85284cf 851 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 852 this YYABORT or YYACCEPT. */
a85284cf 853 yypop_ (yylen);
98ae9643
AD
854 while (yystate_stack_.height () != 1)
855 {
02650b7f
PE
856 yydestruct_ ("Cleanup: popping",
857 yystos_[yystate_stack_[0]],
858 &yysemantic_stack_[0],
859 &yylocation_stack_[0]);
860 yypop_ ();
98ae9643
AD
861 }
862
863 return yyresult;
864 }
2b548aa6 865
98ae9643
AD
866 // Generate an error message.
867 std::string
39f6a8d1
AD
868 ]b4_parser_class_name[::yysyntax_error_ (]dnl
869b4_error_verbose_if([int yystate, int yytoken],
870 [int, int])[)
678094a2
JD
871 {]b4_error_verbose_if([[
872 std::string yyres;
095a1d11
JD
873 // Number of reported tokens (one for the "unexpected", one per
874 // "expected").
875 size_t yycount = 0;
876 // Its maximum.
877 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
878 // Arguments of yyformat.
879 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
880
881 /* There are many possibilities here to consider:
882 - If this state is a consistent state with a default action, then
883 the only way this function was invoked is if the default action
884 is an error action. In that case, don't check for expected
885 tokens because there are none.
886 - The only way there can be no lookahead present (in yytoken) is
887 if this state is a consistent state with a default action.
888 Thus, detecting the absence of a lookahead is sufficient to
889 determine that there is no unexpected or expected token to
890 report. In that case, just report a simple "syntax error".
891 - Don't assume there isn't a lookahead just because this state is
892 a consistent state with a default action. There might have
893 been a previous inconsistent state, consistent state with a
894 non-default action, or user semantic action that manipulated
895 yychar.
896 - Of course, the expected token list depends on states to have
897 correct lookahead information, and it depends on the parser not
898 to perform extra reductions after fetching a lookahead from the
899 scanner and before detecting a syntax error. Thus, state
900 merging (from LALR or IELR) and default reductions corrupt the
901 expected token list. However, the list is correct for
902 canonical LR with one exception: it will still contain any
903 token that will not be accepted due to an error action in a
904 later state.
905 */
906 if (yytoken != yyempty_)
98ae9643 907 {
095a1d11
JD
908 yyarg[yycount++] = yytname_[yytoken];
909 int yyn = yypact_[yystate];
910 if (!yy_pact_value_is_default_ (yyn))
911 {
f953cb20
JD
912 /* Start YYX at -YYN if negative to avoid negative indexes in
913 YYCHECK. In other words, skip the first -YYN actions for
914 this state because they are default actions. */
915 int yyxbegin = yyn < 0 ? -yyn : 0;
f953cb20
JD
916 /* Stay within bounds of both yycheck and yytname. */
917 int yychecklim = yylast_ - yyn + 1;
918 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
f953cb20
JD
919 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
920 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
921 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
922 {
923 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
924 {
925 yycount = 1;
926 break;
927 }
928 else
929 yyarg[yycount++] = yytname_[yyx];
930 }
095a1d11
JD
931 }
932 }
f953cb20
JD
933
934 char const* yyformat = 0;
935 switch (yycount)
936 {
937#define YYCASE_(N, S) \
938 case N: \
939 yyformat = S; \
940 break
095a1d11 941 YYCASE_(0, YY_("syntax error"));
f953cb20
JD
942 YYCASE_(1, YY_("syntax error, unexpected %s"));
943 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
944 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
945 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
946 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
e657f369 947#undef YYCASE_
98ae9643 948 }
095a1d11 949
f953cb20
JD
950 // Argument number.
951 size_t yyi = 0;
952 for (char const* yyp = yyformat; *yyp; ++yyp)
953 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
954 {
955 yyres += yytnamerr_ (yyarg[yyi++]);
956 ++yyp;
957 }
958 else
959 yyres += *yyp;
678094a2
JD
960 return yyres;]], [[
961 return YY_("syntax error");]])[
98ae9643 962 }
a08460b0 963
5348bfbe 964
98ae9643
AD
965 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
966 STATE-NUM. */
967 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
968 const ]b4_int_type_for([b4_pact])[
969 ]b4_parser_class_name[::yypact_[] =
970 {
971 ]b4_pact[
972 };
2b548aa6 973
620b5727
JD
974 /* YYDEFACT[S] -- default reduction number in state S. Performed when
975 YYTABLE doesn't specify something else to do. Zero means the
976 default is an error. */
98ae9643
AD
977 const ]b4_int_type_for([b4_defact])[
978 ]b4_parser_class_name[::yydefact_[] =
979 {
980 ]b4_defact[
981 };
2b548aa6 982
98ae9643
AD
983 /* YYPGOTO[NTERM-NUM]. */
984 const ]b4_int_type_for([b4_pgoto])[
985 ]b4_parser_class_name[::yypgoto_[] =
986 {
987 ]b4_pgoto[
988 };
2b548aa6 989
98ae9643
AD
990 /* YYDEFGOTO[NTERM-NUM]. */
991 const ]b4_int_type_for([b4_defgoto])[
992 ]b4_parser_class_name[::yydefgoto_[] =
993 {
994 ]b4_defgoto[
995 };
2b548aa6 996
98ae9643
AD
997 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
998 positive, shift that token. If negative, reduce the rule which
e4bcae3c 999 number is the opposite. If YYTABLE_NINF_, syntax error. */
98ae9643
AD
1000 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1001 const ]b4_int_type_for([b4_table])[
1002 ]b4_parser_class_name[::yytable_[] =
1003 {
1004 ]b4_table[
1005 };
1006
1007 /* YYCHECK. */
1008 const ]b4_int_type_for([b4_check])[
1009 ]b4_parser_class_name[::yycheck_[] =
1010 {
1011 ]b4_check[
1012 };
1013
1014 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
1015 symbol of state STATE-NUM. */
1016 const ]b4_int_type_for([b4_stos])[
1017 ]b4_parser_class_name[::yystos_[] =
1018 {
1019 ]b4_stos[
1020 };
769b430f 1021
45d5982f 1022#if YYDEBUG
98ae9643
AD
1023 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
1024 to YYLEX-NUM. */
1025 const ]b4_int_type_for([b4_toknum])[
1026 ]b4_parser_class_name[::yytoken_number_[] =
1027 {
1028 ]b4_toknum[
1029 };
769b430f
AD
1030#endif
1031
98ae9643
AD
1032 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
1033 const ]b4_int_type_for([b4_r1])[
1034 ]b4_parser_class_name[::yyr1_[] =
1035 {
1036 ]b4_r1[
1037 };
2b548aa6 1038
98ae9643
AD
1039 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
1040 const ]b4_int_type_for([b4_r2])[
1041 ]b4_parser_class_name[::yyr2_[] =
1042 {
1043 ]b4_r2[
1044 };
2b548aa6 1045
141f5793 1046#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
98ae9643 1047 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
9d9b8b70 1048 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
98ae9643
AD
1049 const char*
1050 const ]b4_parser_class_name[::yytname_[] =
1051 {
1052 ]b4_tname[
1053 };
69e2658b 1054#endif
2b548aa6 1055
69e2658b 1056#if YYDEBUG
9d9b8b70 1057 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
98ae9643
AD
1058 const ]b4_parser_class_name[::rhs_number_type
1059 ]b4_parser_class_name[::yyrhs_[] =
1060 {
1061 ]b4_rhs[
1062 };
2b548aa6 1063
98ae9643
AD
1064 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
1065 YYRHS. */
1066 const ]b4_int_type_for([b4_prhs])[
1067 ]b4_parser_class_name[::yyprhs_[] =
1068 {
1069 ]b4_prhs[
1070 };
2b548aa6 1071
98ae9643
AD
1072 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
1073 const ]b4_int_type_for([b4_rline])[
1074 ]b4_parser_class_name[::yyrline_[] =
1075 {
1076 ]b4_rline[
1077 };
5348bfbe 1078
98ae9643
AD
1079 // Print the state stack on the debug stream.
1080 void
1081 ]b4_parser_class_name[::yystack_print_ ()
1082 {
1083 *yycdebug_ << "Stack now";
1084 for (state_stack_type::const_iterator i = yystate_stack_.begin ();
02650b7f 1085 i != yystate_stack_.end (); ++i)
98ae9643
AD
1086 *yycdebug_ << ' ' << *i;
1087 *yycdebug_ << std::endl;
1088 }
25f66e1a 1089
98ae9643
AD
1090 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1091 void
d1ff7a7c 1092 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
98ae9643
AD
1093 {
1094 unsigned int yylno = yyrline_[yyrule];
d1ff7a7c 1095 int yynrhs = yyr2_[yyrule];
98ae9643
AD
1096 /* Print the symbols being reduced, and their result. */
1097 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
7cff04b5 1098 << " (line " << yylno << "):" << std::endl;
d1ff7a7c
AD
1099 /* The symbols being reduced. */
1100 for (int yyi = 0; yyi < yynrhs; yyi++)
1101 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
02650b7f
PE
1102 yyrhs_[yyprhs_[yyrule] + yyi],
1103 &]b4_rhs_value(yynrhs, yyi + 1)[,
1104 &]b4_rhs_location(yynrhs, yyi + 1)[);
98ae9643 1105 }
5348bfbe 1106#endif // YYDEBUG
69e2658b 1107
98ae9643
AD
1108 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
1109 ]b4_parser_class_name[::token_number_type
32c96bd7 1110 ]b4_parser_class_name[::yytranslate_ (int t)
2b548aa6 1111 {
98ae9643
AD
1112 static
1113 const token_number_type
1114 translate_table[] =
1115 {
1116 ]b4_translate[
1117 };
32c96bd7
AD
1118 if ((unsigned int) t <= yyuser_token_number_max_)
1119 return translate_table[t];
98ae9643
AD
1120 else
1121 return yyundef_token_;
1122 }
1123
1124 const int ]b4_parser_class_name[::yyeof_ = 0;
1125 const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
1126 const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
1127 const int ]b4_parser_class_name[::yyempty_ = -2;
1128 const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
1129 const int ]b4_parser_class_name[::yyterror_ = 1;
1130 const int ]b4_parser_class_name[::yyerrcode_ = 256;
1131 const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
1132
1133 const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
1134 const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
2b548aa6 1135
793fbca5 1136]b4_namespace_close[
2b548aa6 1137
c5e3e510 1138]b4_epilogue
21846f69 1139dnl
0d2b2ab0 1140@output(b4_dir_prefix[]stack.hh@)@
193d7c70 1141b4_copyright([Stack handling for Bison parsers in C++],
ea0a7676 1142 [2002-2011])[
98254360 1143
2b548aa6
RA
1144#ifndef BISON_STACK_HH
1145# define BISON_STACK_HH
1146
45119f04 1147#include <deque>
2b548aa6 1148
793fbca5 1149]b4_namespace_open[
f85a5e6f 1150 template <class T, class S = std::deque<T> >
99880de5 1151 class stack
2b548aa6
RA
1152 {
1153 public:
1154
ecfe33e7
AD
1155 // Hide our reversed order.
1156 typedef typename S::reverse_iterator iterator;
1157 typedef typename S::const_reverse_iterator const_iterator;
2b548aa6 1158
99880de5 1159 stack () : seq_ ()
2b548aa6
RA
1160 {
1161 }
1162
99880de5 1163 stack (unsigned int n) : seq_ (n)
2b548aa6
RA
1164 {
1165 }
1166
1167 inline
1168 T&
779e7ceb 1169 operator [] (unsigned int i)
2b548aa6 1170 {
1d4055aa 1171 return seq_[i];
2b548aa6
RA
1172 }
1173
1174 inline
1175 const T&
779e7ceb 1176 operator [] (unsigned int i) const
2b548aa6 1177 {
1d4055aa 1178 return seq_[i];
2b548aa6
RA
1179 }
1180
1181 inline
1182 void
1183 push (const T& t)
1184 {
45119f04 1185 seq_.push_front (t);
2b548aa6
RA
1186 }
1187
1188 inline
1189 void
779e7ceb 1190 pop (unsigned int n = 1)
2b548aa6
RA
1191 {
1192 for (; n; --n)
45119f04 1193 seq_.pop_front ();
2b548aa6
RA
1194 }
1195
762a801e 1196 inline
779e7ceb 1197 unsigned int
762a801e
RA
1198 height () const
1199 {
1200 return seq_.size ();
1201 }
1202
ecfe33e7
AD
1203 inline const_iterator begin () const { return seq_.rbegin (); }
1204 inline const_iterator end () const { return seq_.rend (); }
2b548aa6
RA
1205
1206 private:
1207
1208 S seq_;
1209 };
374f5a14 1210
e019c247 1211 /// Present a slice of the top of a stack.
99880de5
AD
1212 template <class T, class S = stack<T> >
1213 class slice
374f5a14
RA
1214 {
1215 public:
1216
99880de5 1217 slice (const S& stack,
779e7ceb
PE
1218 unsigned int range) : stack_ (stack),
1219 range_ (range)
374f5a14
RA
1220 {
1221 }
1222
1223 inline
1224 const T&
779e7ceb 1225 operator [] (unsigned int i) const
374f5a14 1226 {
1d4055aa 1227 return stack_[range_ - i];
374f5a14
RA
1228 }
1229
1230 private:
1231
1232 const S& stack_;
779e7ceb 1233 unsigned int range_;
374f5a14 1234 };
793fbca5 1235]b4_namespace_close[
2b548aa6 1236
cf98343c
AD
1237#endif // not BISON_STACK_HH[]dnl
1238]
08af01c2 1239m4_divert_pop(0)