]> git.saurik.com Git - bison.git/blame - data/lalr1.cc
lalrl1.cc: give a chance to user defined YYLLOC_DEFAULT.
[bison.git] / data / lalr1.cc
CommitLineData
60491a94 1# C++ skeleton for Bison
b4721715 2
1462fcee 3# Copyright (C) 2002-2010 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++],
1462fcee 38 [2002-2010])
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++],
1462fcee 285 [2002-2010])
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 }
d1ff7a7c 694 YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
98ae9643
AD
695
696 yypop_ (yylen);
a85284cf 697 yylen = 0;
98ae9643
AD
698 YY_STACK_PRINT ();
699
700 yysemantic_stack_.push (yyval);
701 yylocation_stack_.push (yyloc);
702
703 /* Shift the result of the reduction. */
704 yyn = yyr1_[yyn];
705 yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];
706 if (0 <= yystate && yystate <= yylast_
34ec3579 707 && yycheck_[yystate] == yystate_stack_[0])
98ae9643
AD
708 yystate = yytable_[yystate];
709 else
710 yystate = yydefgoto_[yyn - yyntokens_];
711 goto yynewstate;
712
713 /*------------------------------------.
714 | yyerrlab -- here on detecting error |
715 `------------------------------------*/
716 yyerrlab:
717 /* If not already recovering from an error, report this error. */
718 if (!yyerrstatus_)
719 {
02650b7f 720 ++yynerrs_;
1e05521d 721 error (yylloc, yysyntax_error_ (yystate, yytoken));
98ae9643
AD
722 }
723
a005dbcb 724 yyerror_range[1] = yylloc;
98ae9643
AD
725 if (yyerrstatus_ == 3)
726 {
742e4900 727 /* If just tried and failed to reuse lookahead token after an
02650b7f
PE
728 error, discard it. */
729
730 if (yychar <= yyeof_)
731 {
732 /* Return failure if at end of input. */
733 if (yychar == yyeof_)
734 YYABORT;
735 }
736 else
737 {
738 yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
739 yychar = yyempty_;
740 }
98ae9643
AD
741 }
742
742e4900 743 /* Else will try to reuse lookahead token after shifting the error
98ae9643
AD
744 token. */
745 goto yyerrlab1;
746
747
748 /*---------------------------------------------------.
749 | yyerrorlab -- error raised explicitly by YYERROR. |
750 `---------------------------------------------------*/
751 yyerrorlab:
752
753 /* Pacify compilers like GCC when the user code never invokes
754 YYERROR and the label yyerrorlab therefore never appears in user
755 code. */
756 if (false)
757 goto yyerrorlab;
758
a005dbcb 759 yyerror_range[1] = yylocation_stack_[yylen - 1];
a85284cf 760 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 761 this YYERROR. */
98ae9643 762 yypop_ (yylen);
a85284cf 763 yylen = 0;
98ae9643
AD
764 yystate = yystate_stack_[0];
765 goto yyerrlab1;
766
767 /*-------------------------------------------------------------.
768 | yyerrlab1 -- common code for both syntax error and YYERROR. |
769 `-------------------------------------------------------------*/
770 yyerrlab1:
771 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
772
773 for (;;)
774 {
02650b7f 775 yyn = yypact_[yystate];
d5eb0826 776 if (!yy_pact_value_is_default_ (yyn))
02650b7f
PE
777 {
778 yyn += yyterror_;
34ec3579 779 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
02650b7f
PE
780 {
781 yyn = yytable_[yyn];
782 if (0 < yyn)
783 break;
784 }
785 }
786
787 /* Pop the current state because it cannot handle the error token. */
788 if (yystate_stack_.height () == 1)
789 YYABORT;
790
a005dbcb 791 yyerror_range[1] = yylocation_stack_[0];
02650b7f
PE
792 yydestruct_ ("Error: popping",
793 yystos_[yystate],
794 &yysemantic_stack_[0], &yylocation_stack_[0]);
795 yypop_ ();
796 yystate = yystate_stack_[0];
797 YY_STACK_PRINT ();
98ae9643
AD
798 }
799
a005dbcb 800 yyerror_range[2] = yylloc;
98ae9643 801 // Using YYLLOC is tempting, but would change the location of
742e4900 802 // the lookahead. YYLOC is available though.
a005dbcb 803 YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
98ae9643
AD
804 yysemantic_stack_.push (yylval);
805 yylocation_stack_.push (yyloc);
806
9d9b8b70 807 /* Shift the error token. */
98ae9643 808 YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
482dc52f 809 &yysemantic_stack_[0], &yylocation_stack_[0]);
98ae9643
AD
810
811 yystate = yyn;
812 goto yynewstate;
813
814 /* Accept. */
815 yyacceptlab:
816 yyresult = 0;
817 goto yyreturn;
818
819 /* Abort. */
820 yyabortlab:
821 yyresult = 1;
822 goto yyreturn;
823
824 yyreturn:
868d2d96 825 if (yychar != yyempty_)
98ae9643
AD
826 yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
827
a85284cf 828 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 829 this YYABORT or YYACCEPT. */
a85284cf 830 yypop_ (yylen);
98ae9643
AD
831 while (yystate_stack_.height () != 1)
832 {
02650b7f
PE
833 yydestruct_ ("Cleanup: popping",
834 yystos_[yystate_stack_[0]],
835 &yysemantic_stack_[0],
836 &yylocation_stack_[0]);
837 yypop_ ();
98ae9643
AD
838 }
839
840 return yyresult;
841 }
2b548aa6 842
98ae9643
AD
843 // Generate an error message.
844 std::string
39f6a8d1
AD
845 ]b4_parser_class_name[::yysyntax_error_ (]dnl
846b4_error_verbose_if([int yystate, int yytoken],
847 [int, int])[)
98ae9643 848 {
39f6a8d1 849 std::string yyres;]b4_error_verbose_if([[
98ae9643 850 int yyn = yypact_[yystate];
d6645148 851 if (yypact_ninf_ < yyn && yyn <= yylast_)
98ae9643 852 {
02650b7f 853 /* Start YYX at -YYN if negative to avoid negative indexes in
77373efa
JD
854 YYCHECK. In other words, skip the first -YYN actions for this
855 state because they are default actions. */
02650b7f
PE
856 int yyxbegin = yyn < 0 ? -yyn : 0;
857
858 /* Stay within bounds of both yycheck and yytname. */
d6645148 859 int yychecklim = yylast_ - yyn + 1;
02650b7f 860 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
e657f369 861
8200219a
AD
862 // Number of reported tokens (one for the "unexpected", one per
863 // "expected").
e657f369
AD
864 size_t yycount = 0;
865 // Its maximum.
866 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
867 // Arguments of yyformat.
868 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
869 yyarg[yycount++] = yytname_[yytoken];
870 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
871 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
872 && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
873 {
874 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
875 {
876 yycount = 1;
877 break;
878 }
879 else
880 yyarg[yycount++] = yytname_[yyx];
881 }
882
883 char const* yyformat = 0;
884 switch (yycount)
885 {
886#define YYCASE_(N, S) \
887 case N: \
888 yyformat = S; \
889 break
890 YYCASE_(1, YY_("syntax error, unexpected %s"));
891 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
892 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
893 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
894 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
895#undef YYCASE_
896 }
897 // Argument number.
898 size_t yyi = 0;
899 for (char const* yyp = yyformat; *yyp; ++yyp)
900 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
901 {
902 yyres += yytnamerr_ (yyarg[yyi++]);
903 ++yyp;
904 }
905 else
906 yyres += *yyp;
98ae9643
AD
907 }
908 else
39f6a8d1
AD
909 ]])dnl
910[ yyres = YY_("syntax error");
e657f369 911 return yyres;
98ae9643 912 }
a08460b0 913
5348bfbe 914
98ae9643
AD
915 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
916 STATE-NUM. */
917 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
918 const ]b4_int_type_for([b4_pact])[
919 ]b4_parser_class_name[::yypact_[] =
920 {
921 ]b4_pact[
922 };
2b548aa6 923
620b5727
JD
924 /* YYDEFACT[S] -- default reduction number in state S. Performed when
925 YYTABLE doesn't specify something else to do. Zero means the
926 default is an error. */
98ae9643
AD
927 const ]b4_int_type_for([b4_defact])[
928 ]b4_parser_class_name[::yydefact_[] =
929 {
930 ]b4_defact[
931 };
2b548aa6 932
98ae9643
AD
933 /* YYPGOTO[NTERM-NUM]. */
934 const ]b4_int_type_for([b4_pgoto])[
935 ]b4_parser_class_name[::yypgoto_[] =
936 {
937 ]b4_pgoto[
938 };
2b548aa6 939
98ae9643
AD
940 /* YYDEFGOTO[NTERM-NUM]. */
941 const ]b4_int_type_for([b4_defgoto])[
942 ]b4_parser_class_name[::yydefgoto_[] =
943 {
944 ]b4_defgoto[
945 };
2b548aa6 946
98ae9643
AD
947 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
948 positive, shift that token. If negative, reduce the rule which
e4bcae3c 949 number is the opposite. If YYTABLE_NINF_, syntax error. */
98ae9643
AD
950 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
951 const ]b4_int_type_for([b4_table])[
952 ]b4_parser_class_name[::yytable_[] =
953 {
954 ]b4_table[
955 };
956
957 /* YYCHECK. */
958 const ]b4_int_type_for([b4_check])[
959 ]b4_parser_class_name[::yycheck_[] =
960 {
961 ]b4_check[
962 };
963
964 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
965 symbol of state STATE-NUM. */
966 const ]b4_int_type_for([b4_stos])[
967 ]b4_parser_class_name[::yystos_[] =
968 {
969 ]b4_stos[
970 };
769b430f 971
45d5982f 972#if YYDEBUG
98ae9643
AD
973 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
974 to YYLEX-NUM. */
975 const ]b4_int_type_for([b4_toknum])[
976 ]b4_parser_class_name[::yytoken_number_[] =
977 {
978 ]b4_toknum[
979 };
769b430f
AD
980#endif
981
98ae9643
AD
982 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
983 const ]b4_int_type_for([b4_r1])[
984 ]b4_parser_class_name[::yyr1_[] =
985 {
986 ]b4_r1[
987 };
2b548aa6 988
98ae9643
AD
989 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
990 const ]b4_int_type_for([b4_r2])[
991 ]b4_parser_class_name[::yyr2_[] =
992 {
993 ]b4_r2[
994 };
2b548aa6 995
141f5793 996#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
98ae9643 997 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
9d9b8b70 998 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
98ae9643
AD
999 const char*
1000 const ]b4_parser_class_name[::yytname_[] =
1001 {
1002 ]b4_tname[
1003 };
69e2658b 1004#endif
2b548aa6 1005
69e2658b 1006#if YYDEBUG
9d9b8b70 1007 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
98ae9643
AD
1008 const ]b4_parser_class_name[::rhs_number_type
1009 ]b4_parser_class_name[::yyrhs_[] =
1010 {
1011 ]b4_rhs[
1012 };
2b548aa6 1013
98ae9643
AD
1014 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
1015 YYRHS. */
1016 const ]b4_int_type_for([b4_prhs])[
1017 ]b4_parser_class_name[::yyprhs_[] =
1018 {
1019 ]b4_prhs[
1020 };
2b548aa6 1021
98ae9643
AD
1022 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
1023 const ]b4_int_type_for([b4_rline])[
1024 ]b4_parser_class_name[::yyrline_[] =
1025 {
1026 ]b4_rline[
1027 };
5348bfbe 1028
98ae9643
AD
1029 // Print the state stack on the debug stream.
1030 void
1031 ]b4_parser_class_name[::yystack_print_ ()
1032 {
1033 *yycdebug_ << "Stack now";
1034 for (state_stack_type::const_iterator i = yystate_stack_.begin ();
02650b7f 1035 i != yystate_stack_.end (); ++i)
98ae9643
AD
1036 *yycdebug_ << ' ' << *i;
1037 *yycdebug_ << std::endl;
1038 }
25f66e1a 1039
98ae9643
AD
1040 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1041 void
d1ff7a7c 1042 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
98ae9643
AD
1043 {
1044 unsigned int yylno = yyrline_[yyrule];
d1ff7a7c 1045 int yynrhs = yyr2_[yyrule];
98ae9643
AD
1046 /* Print the symbols being reduced, and their result. */
1047 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
7cff04b5 1048 << " (line " << yylno << "):" << std::endl;
d1ff7a7c
AD
1049 /* The symbols being reduced. */
1050 for (int yyi = 0; yyi < yynrhs; yyi++)
1051 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
02650b7f
PE
1052 yyrhs_[yyprhs_[yyrule] + yyi],
1053 &]b4_rhs_value(yynrhs, yyi + 1)[,
1054 &]b4_rhs_location(yynrhs, yyi + 1)[);
98ae9643 1055 }
5348bfbe 1056#endif // YYDEBUG
69e2658b 1057
98ae9643
AD
1058 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
1059 ]b4_parser_class_name[::token_number_type
32c96bd7 1060 ]b4_parser_class_name[::yytranslate_ (int t)
2b548aa6 1061 {
98ae9643
AD
1062 static
1063 const token_number_type
1064 translate_table[] =
1065 {
1066 ]b4_translate[
1067 };
32c96bd7
AD
1068 if ((unsigned int) t <= yyuser_token_number_max_)
1069 return translate_table[t];
98ae9643
AD
1070 else
1071 return yyundef_token_;
1072 }
1073
1074 const int ]b4_parser_class_name[::yyeof_ = 0;
1075 const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
1076 const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
1077 const int ]b4_parser_class_name[::yyempty_ = -2;
1078 const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
1079 const int ]b4_parser_class_name[::yyterror_ = 1;
1080 const int ]b4_parser_class_name[::yyerrcode_ = 256;
1081 const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
1082
1083 const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
1084 const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
2b548aa6 1085
793fbca5 1086]b4_namespace_close[
2b548aa6 1087
c5e3e510 1088]b4_epilogue
21846f69 1089dnl
0d2b2ab0 1090@output(b4_dir_prefix[]stack.hh@)@
193d7c70 1091b4_copyright([Stack handling for Bison parsers in C++],
1462fcee 1092 [2002-2010])[
98254360 1093
2b548aa6
RA
1094#ifndef BISON_STACK_HH
1095# define BISON_STACK_HH
1096
45119f04 1097#include <deque>
2b548aa6 1098
793fbca5 1099]b4_namespace_open[
f85a5e6f 1100 template <class T, class S = std::deque<T> >
99880de5 1101 class stack
2b548aa6
RA
1102 {
1103 public:
1104
ecfe33e7
AD
1105 // Hide our reversed order.
1106 typedef typename S::reverse_iterator iterator;
1107 typedef typename S::const_reverse_iterator const_iterator;
2b548aa6 1108
99880de5 1109 stack () : seq_ ()
2b548aa6
RA
1110 {
1111 }
1112
99880de5 1113 stack (unsigned int n) : seq_ (n)
2b548aa6
RA
1114 {
1115 }
1116
1117 inline
1118 T&
779e7ceb 1119 operator [] (unsigned int i)
2b548aa6 1120 {
1d4055aa 1121 return seq_[i];
2b548aa6
RA
1122 }
1123
1124 inline
1125 const T&
779e7ceb 1126 operator [] (unsigned int i) const
2b548aa6 1127 {
1d4055aa 1128 return seq_[i];
2b548aa6
RA
1129 }
1130
1131 inline
1132 void
1133 push (const T& t)
1134 {
45119f04 1135 seq_.push_front (t);
2b548aa6
RA
1136 }
1137
1138 inline
1139 void
779e7ceb 1140 pop (unsigned int n = 1)
2b548aa6
RA
1141 {
1142 for (; n; --n)
45119f04 1143 seq_.pop_front ();
2b548aa6
RA
1144 }
1145
762a801e 1146 inline
779e7ceb 1147 unsigned int
762a801e
RA
1148 height () const
1149 {
1150 return seq_.size ();
1151 }
1152
ecfe33e7
AD
1153 inline const_iterator begin () const { return seq_.rbegin (); }
1154 inline const_iterator end () const { return seq_.rend (); }
2b548aa6
RA
1155
1156 private:
1157
1158 S seq_;
1159 };
374f5a14 1160
e019c247 1161 /// Present a slice of the top of a stack.
99880de5
AD
1162 template <class T, class S = stack<T> >
1163 class slice
374f5a14
RA
1164 {
1165 public:
1166
99880de5 1167 slice (const S& stack,
779e7ceb
PE
1168 unsigned int range) : stack_ (stack),
1169 range_ (range)
374f5a14
RA
1170 {
1171 }
1172
1173 inline
1174 const T&
779e7ceb 1175 operator [] (unsigned int i) const
374f5a14 1176 {
1d4055aa 1177 return stack_[range_ - i];
374f5a14
RA
1178 }
1179
1180 private:
1181
1182 const S& stack_;
779e7ceb 1183 unsigned int range_;
374f5a14 1184 };
793fbca5 1185]b4_namespace_close[
2b548aa6 1186
cf98343c
AD
1187#endif // not BISON_STACK_HH[]dnl
1188]
08af01c2 1189m4_divert_pop(0)