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