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