]> git.saurik.com Git - bison.git/blame - data/lalr1.cc
Agregate yylval and yylloc.
[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
6082531a
AD
820 /// The lookahead symbol.
821 data_type yyla;
822
98ae9643 823 /// The locations where the error started and ended.
8901f32e 824 data_type yyerror_range[2];
dbcdae2d 825
e1f93869
AD
826 /// $$ and @@$.
827 data_type yylhs;
dbcdae2d 828
e1f93869 829 /// The return value of parse().
98ae9643 830 int yyresult;
ad745863 831
98ae9643 832 YYCDEBUG << "Starting parse" << std::endl;
451364ed 833
451364ed 834]m4_ifdef([b4_initial_action], [
6082531a
AD
835m4_pushdef([b4_at_dollar], [yyla.location])dnl
836m4_pushdef([b4_dollar_dollar], [yyla.value])dnl
9d9b8b70 837 /* User initialization code. */
8ec0a172 838 b4_user_initial_action
451364ed 839m4_popdef([b4_dollar_dollar])dnl
8ec0a172 840m4_popdef([b4_at_dollar])])dnl
451364ed 841
8901f32e 842 [ /* Initialize the stack. The initial state will be set in
98ae9643
AD
843 yynewstate, since the latter expects the semantical and the
844 location values to have been already stored, initialize these
845 stacks with a primary value. */
8901f32e 846 yystack_ = stack_type (0);
6082531a 847 yypush_ (0, yyla.state, yyla.value, yyla.location);
98ae9643 848
7dedf26e
AD
849 // A new state was pushed on the stack.
850 // Invariant: yystate == yystack_[0].state, i.e.,
851 // yystate was just pushed onto the state stack.
98ae9643 852 yynewstate:
98ae9643 853 YYCDEBUG << "Entering state " << yystate << std::endl;
868d2d96
JD
854
855 /* Accept? */
856 if (yystate == yyfinal_)
857 goto yyacceptlab;
858
98ae9643
AD
859 goto yybackup;
860
861 /* Backup. */
862 yybackup:
863
742e4900 864 /* Try to take a decision without lookahead. */
98ae9643
AD
865 yyn = yypact_[yystate];
866 if (yyn == yypact_ninf_)
867 goto yydefault;
868
742e4900 869 /* Read a lookahead token. */
98ae9643
AD
870 if (yychar == yyempty_)
871 {
02650b7f
PE
872 YYCDEBUG << "Reading a token: ";
873 yychar = ]b4_c_function_call([yylex], [int],
6082531a
AD
874 [[YYSTYPE*], [&yyla.value]][]dnl
875b4_locations_if([, [[location*], [&yyla.location]]])dnl
dbcdae2d 876m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
98ae9643
AD
877 }
878
879
880 /* Convert token to internal form. */
881 if (yychar <= yyeof_)
882 {
02650b7f
PE
883 yychar = yytoken = yyeof_;
884 YYCDEBUG << "Now at end of input." << std::endl;
98ae9643
AD
885 }
886 else
887 {
02650b7f 888 yytoken = yytranslate_ (yychar);
6082531a 889 YY_SYMBOL_PRINT ("Next token is", yytoken, yyla.value, yyla.location);
98ae9643
AD
890 }
891
892 /* If the proper action on seeing token YYTOKEN is to reduce or to
893 detect an error, take that action. */
894 yyn += yytoken;
34ec3579 895 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
98ae9643
AD
896 goto yydefault;
897
898 /* Reduce or error. */
899 yyn = yytable_[yyn];
900 if (yyn <= 0)
901 {
02650b7f 902 if (yyn == 0 || yyn == yytable_ninf_)
6082531a 903 goto yyerrlab;
02650b7f
PE
904 yyn = -yyn;
905 goto yyreduce;
98ae9643
AD
906 }
907
868d2d96
JD
908 /* Discard the token being shifted. */
909 yychar = yyempty_;
98ae9643
AD
910
911 /* Count tokens shifted since error; after three, turn off error
912 status. */
913 if (yyerrstatus_)
914 --yyerrstatus_;
915
9380cfd0 916 /* Shift the lookahead token. */
6082531a
AD
917 yyla.state = yystate = yyn;
918 yypush_ ("Shifting", yyla.state, yyla.value, yyla.location);
98ae9643
AD
919 goto yynewstate;
920
921 /*-----------------------------------------------------------.
922 | yydefault -- do the default action for the current state. |
923 `-----------------------------------------------------------*/
924 yydefault:
925 yyn = yydefact_[yystate];
926 if (yyn == 0)
927 goto yyerrlab;
928 goto yyreduce;
929
930 /*-----------------------------.
931 | yyreduce -- Do a reduction. |
932 `-----------------------------*/
933 yyreduce:
5ab8c47b
AD
934 yylen = yyr2_[yyn];]b4_variant_if([
935 /* Variants are always initialized to an empty instance of the
936 correct type. The default $$=$1 rule is NOT applied when using
937 variants */
e1f93869 938 ]b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])[],[
a85284cf 939 /* If YYLEN is nonzero, implement the default value of the action:
98ae9643
AD
940 `$$ = $1'. Otherwise, use the top of the stack.
941
e1f93869 942 Otherwise, the following line sets YYLHS.VALUE to garbage.
98ae9643
AD
943 This behavior is undocumented and Bison
944 users should not rely upon it. */
945 if (yylen)
e1f93869 946 yylhs.value = yystack_@{yylen - 1@}.value;
98ae9643 947 else
e1f93869 948 yylhs.value = yystack_@{0@}.value;])[
2b548aa6 949
8901f32e 950 // Compute the default @@$.
2b548aa6 951 {
8901f32e 952 slice<data_type, stack_type> slice (yystack_, yylen);
e1f93869 953 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
2b548aa6 954 }
8901f32e
AD
955
956 // Perform the reduction.
98ae9643
AD
957 YY_REDUCE_PRINT (yyn);
958 switch (yyn)
959 {
8ec0a172 960 ]b4_user_actions[
cf98343c
AD
961 default:
962 break;
98ae9643 963 }
e1f93869
AD
964 // Compute post-reduction state.
965 yyn = yyr1_[yyn];
966 yystate = yypgoto_[yyn - yyntokens_] + yystack_[yylen].state;
967 if (0 <= yystate && yystate <= yylast_
968 && yycheck_[yystate] == yystack_[yylen].state)
969 yystate = yytable_[yystate];
970 else
971 yystate = yydefgoto_[yyn - yyntokens_];
972 yylhs.state = yystate;
973 YY_SYMBOL_PRINT ("-> $$ =", yyn, yylhs.value, yylhs.location);
8901f32e
AD
974]b4_variant_if([[
975 // Destroy the lhs symbols.
976 for (int i = 0; i < yylen; ++i)
e1f93869
AD
977 // Destroy a variant which value may have be swapped with
978 // yylhs.value. The value of yylhs.value (hence maybe one of
979 // these lhs symbols) depends on what does the default
980 // contruction for this type. In the case of pointers for
981 // instance, nothing is done, so the value is junk. Therefore
982 // do not try to report the content in the debug trace, it's
983 // junk. Hence yymsg = 0. Besides, that keeps exactly the same
984 // traces as with the other Bison skeletons.
8901f32e
AD
985 yydestruct_ (0,
986 yystos_[yystack_[i].state],
987 yystack_[i].value, yystack_[i].location);]])[
98ae9643
AD
988
989 yypop_ (yylen);
a85284cf 990 yylen = 0;
98ae9643 991 YY_STACK_PRINT ();
98ae9643
AD
992
993 /* Shift the result of the reduction. */
e1f93869 994 yypush_ (0, yylhs.state, yylhs.value, yylhs.location);
98ae9643
AD
995 goto yynewstate;
996
997 /*------------------------------------.
998 | yyerrlab -- here on detecting error |
999 `------------------------------------*/
1000 yyerrlab:
1001 /* If not already recovering from an error, report this error. */
1002 if (!yyerrstatus_)
1003 {
02650b7f 1004 ++yynerrs_;
6082531a 1005 error (yyla.location, yysyntax_error_ (yystate, yytoken));
98ae9643
AD
1006 }
1007
6082531a 1008 yyerror_range[0].location = yyla.location;
98ae9643
AD
1009 if (yyerrstatus_ == 3)
1010 {
742e4900 1011 /* If just tried and failed to reuse lookahead token after an
02650b7f
PE
1012 error, discard it. */
1013
1014 if (yychar <= yyeof_)
1015 {
8901f32e
AD
1016 /* Return failure if at end of input. */
1017 if (yychar == yyeof_)
1018 YYABORT;
02650b7f
PE
1019 }
1020 else
1021 {
6082531a
AD
1022 yydestruct_ ("Error: discarding",
1023 yytoken, yyla.value, yyla.location);
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
6082531a 1086 yyerror_range[1].location = yyla.location;
e1f93869
AD
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_)
6082531a
AD
1107 yydestruct_ ("Cleanup: discarding lookahead",
1108 yytoken, yyla.value, yyla.location);
98ae9643 1109
a85284cf 1110 /* Do not reclaim the symbols of the rule which action triggered
9d9b8b70 1111 this YYABORT or YYACCEPT. */
a85284cf 1112 yypop_ (yylen);
8901f32e 1113 while (yystack_.size () != 1)
98ae9643 1114 {
02650b7f 1115 yydestruct_ ("Cleanup: popping",
8901f32e
AD
1116 yystos_[yystack_[0].state],
1117 yystack_[0].value, yystack_[0].location);
02650b7f 1118 yypop_ ();
98ae9643
AD
1119 }
1120
1121 return yyresult;
1122 }
2b548aa6 1123
98ae9643
AD
1124 // Generate an error message.
1125 std::string
8901f32e
AD
1126 ]b4_parser_class_name[::yysyntax_error_ (int yystate, int]dnl
1127b4_error_verbose_if([ tok])[)
98ae9643
AD
1128 {
1129 std::string res;
c66dfadd 1130 YYUSE (yystate);
a08460b0 1131#if YYERROR_VERBOSE
98ae9643 1132 int yyn = yypact_[yystate];
d6645148 1133 if (yypact_ninf_ < yyn && yyn <= yylast_)
98ae9643 1134 {
02650b7f
PE
1135 /* Start YYX at -YYN if negative to avoid negative indexes in
1136 YYCHECK. */
1137 int yyxbegin = yyn < 0 ? -yyn : 0;
1138
1139 /* Stay within bounds of both yycheck and yytname. */
d6645148 1140 int yychecklim = yylast_ - yyn + 1;
02650b7f
PE
1141 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
1142 int count = 0;
1143 for (int x = yyxbegin; x < yyxend; ++x)
34ec3579 1144 if (yycheck_[x + yyn] == x && x != yyterror_)
02650b7f
PE
1145 ++count;
1146
1147 // FIXME: This method of building the message is not compatible
1148 // with internationalization. It should work like yacc.c does it.
1149 // That is, first build a string that looks like this:
1150 // "syntax error, unexpected %s or %s or %s"
1151 // Then, invoke YY_ on this string.
1152 // Finally, use the string as a format to output
1153 // yytname_[tok], etc.
1154 // Until this gets fixed, this message appears in English only.
1155 res = "syntax error, unexpected ";
1156 res += yytnamerr_ (yytname_[tok]);
1157 if (count < 5)
1158 {
1159 count = 0;
1160 for (int x = yyxbegin; x < yyxend; ++x)
34ec3579 1161 if (yycheck_[x + yyn] == x && x != yyterror_)
02650b7f
PE
1162 {
1163 res += (!count++) ? ", expecting " : " or ";
1164 res += yytnamerr_ (yytname_[x]);
1165 }
1166 }
98ae9643
AD
1167 }
1168 else
dbcdae2d 1169#endif
98ae9643
AD
1170 res = YY_("syntax error");
1171 return res;
1172 }
a08460b0 1173
5348bfbe 1174
98ae9643
AD
1175 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
1176 STATE-NUM. */
1177 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
8901f32e 1178 ]b4_table_define([pact], [b4_pact])[;
2b548aa6 1179
98ae9643
AD
1180 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
1181 doesn't specify something else to do. Zero means the default is an
1182 error. */
8901f32e 1183 ]b4_table_define([defact], [b4_defact])[;
2b548aa6 1184
98ae9643 1185 /* YYPGOTO[NTERM-NUM]. */
8901f32e 1186 ]b4_table_define([pgoto], [b4_pgoto])[;
2b548aa6 1187
98ae9643 1188 /* YYDEFGOTO[NTERM-NUM]. */
8901f32e 1189 ]b4_table_define([defgoto], [b4_defgoto])[;
2b548aa6 1190
98ae9643
AD
1191 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
1192 positive, shift that token. If negative, reduce the rule which
1193 number is the opposite. If zero, do what YYDEFACT says. */
1194 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
8901f32e 1195 ]b4_table_define([table], [b4_table])[;
98ae9643
AD
1196
1197 /* YYCHECK. */
8901f32e 1198 ]b4_table_define([check], [b4_check])[;
98ae9643
AD
1199
1200 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
1201 symbol of state STATE-NUM. */
8901f32e 1202 ]b4_table_define([stos], [b4_stos])[;
769b430f 1203
45d5982f 1204#if YYDEBUG
98ae9643
AD
1205 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
1206 to YYLEX-NUM. */
8901f32e 1207 ]b4_table_define([token_number], [b4_toknum])[;
769b430f
AD
1208#endif
1209
98ae9643 1210 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
8901f32e 1211 ]b4_table_define([r1], [b4_r1])[;
2b548aa6 1212
98ae9643 1213 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
8901f32e 1214 ]b4_table_define([r2], [b4_r2])[;
2b548aa6 1215
141f5793 1216#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
98ae9643 1217 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
9d9b8b70 1218 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
98ae9643
AD
1219 const char*
1220 const ]b4_parser_class_name[::yytname_[] =
1221 {
8901f32e 1222 ]b4_tname[
98ae9643 1223 };
69e2658b 1224#endif
2b548aa6 1225
69e2658b 1226#if YYDEBUG
98ae9643 1227 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
8901f32e 1228 ]b4_table_define([rline], [b4_rline])[;
5348bfbe 1229
98ae9643
AD
1230 // Print the state stack on the debug stream.
1231 void
1232 ]b4_parser_class_name[::yystack_print_ ()
1233 {
1234 *yycdebug_ << "Stack now";
8901f32e
AD
1235 for (stack_type::const_iterator
1236 i = yystack_.begin (),
1237 i_end = yystack_.end ();
1238 i != i_end; ++i)
1239 *yycdebug_ << ' ' << i->state;
98ae9643
AD
1240 *yycdebug_ << std::endl;
1241 }
25f66e1a 1242
98ae9643
AD
1243 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1244 void
d1ff7a7c 1245 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
98ae9643
AD
1246 {
1247 unsigned int yylno = yyrline_[yyrule];
d1ff7a7c 1248 int yynrhs = yyr2_[yyrule];
98ae9643
AD
1249 /* Print the symbols being reduced, and their result. */
1250 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
7cff04b5 1251 << " (line " << yylno << "):" << std::endl;
d1ff7a7c
AD
1252 /* The symbols being reduced. */
1253 for (int yyi = 0; yyi < yynrhs; yyi++)
1254 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
33c195cc 1255 ]yystos_@{b4_rhs_state(yynrhs, yyi + 1)@}[,
c4585f1e
AD
1256 ]b4_rhs_value(yynrhs, yyi + 1)[,
1257 ]b4_rhs_location(yynrhs, yyi + 1)[);
98ae9643 1258 }
5348bfbe 1259#endif // YYDEBUG
69e2658b 1260
98ae9643
AD
1261 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
1262 ]b4_parser_class_name[::token_number_type
32c96bd7 1263 ]b4_parser_class_name[::yytranslate_ (int t)
2b548aa6 1264 {
98ae9643
AD
1265 static
1266 const token_number_type
1267 translate_table[] =
1268 {
8901f32e 1269 ]b4_translate[
98ae9643 1270 };
32c96bd7
AD
1271 if ((unsigned int) t <= yyuser_token_number_max_)
1272 return translate_table[t];
98ae9643
AD
1273 else
1274 return yyundef_token_;
1275 }
1276
1277 const int ]b4_parser_class_name[::yyeof_ = 0;
1278 const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
1279 const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
1280 const int ]b4_parser_class_name[::yyempty_ = -2;
1281 const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
1282 const int ]b4_parser_class_name[::yyterror_ = 1;
1283 const int ]b4_parser_class_name[::yyerrcode_ = 256;
1284 const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
1285
1286 const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
1287 const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
2b548aa6 1288
793fbca5 1289]b4_namespace_close[
2b548aa6 1290
8901f32e 1291]b4_epilogue[]dnl
a0d4650a 1292@output(b4_dir_prefix[]stack.hh@)@
a9ce3f54 1293b4_copyright([Stack handling for Bison parsers in C++])[
98254360 1294
2b548aa6
RA
1295#ifndef BISON_STACK_HH
1296# define BISON_STACK_HH
1297
45119f04 1298#include <deque>
2b548aa6 1299
793fbca5 1300]b4_namespace_open[
f85a5e6f 1301 template <class T, class S = std::deque<T> >
99880de5 1302 class stack
2b548aa6
RA
1303 {
1304 public:
1305
ecfe33e7
AD
1306 // Hide our reversed order.
1307 typedef typename S::reverse_iterator iterator;
1308 typedef typename S::const_reverse_iterator const_iterator;
2b548aa6 1309
99880de5 1310 stack () : seq_ ()
2b548aa6
RA
1311 {
1312 }
1313
99880de5 1314 stack (unsigned int n) : seq_ (n)
2b548aa6
RA
1315 {
1316 }
1317
1318 inline
1319 T&
779e7ceb 1320 operator [] (unsigned int i)
2b548aa6 1321 {
1d4055aa 1322 return seq_[i];
2b548aa6
RA
1323 }
1324
1325 inline
1326 const T&
779e7ceb 1327 operator [] (unsigned int i) const
2b548aa6 1328 {
1d4055aa 1329 return seq_[i];
2b548aa6
RA
1330 }
1331
1332 inline
1333 void
1334 push (const T& t)
1335 {
45119f04 1336 seq_.push_front (t);
2b548aa6
RA
1337 }
1338
1339 inline
1340 void
779e7ceb 1341 pop (unsigned int n = 1)
2b548aa6
RA
1342 {
1343 for (; n; --n)
45119f04 1344 seq_.pop_front ();
2b548aa6
RA
1345 }
1346
762a801e 1347 inline
56017c17
AD
1348 typename S::size_type
1349 size () const
762a801e
RA
1350 {
1351 return seq_.size ();
1352 }
1353
ecfe33e7 1354 inline const_iterator begin () const { return seq_.rbegin (); }
56017c17 1355 inline const_iterator end () const { return seq_.rend (); }
2b548aa6
RA
1356
1357 private:
56017c17 1358 /// The wrapped container.
2b548aa6
RA
1359 S seq_;
1360 };
374f5a14 1361
e019c247 1362 /// Present a slice of the top of a stack.
99880de5
AD
1363 template <class T, class S = stack<T> >
1364 class slice
374f5a14
RA
1365 {
1366 public:
1367
99880de5 1368 slice (const S& stack,
779e7ceb
PE
1369 unsigned int range) : stack_ (stack),
1370 range_ (range)
374f5a14
RA
1371 {
1372 }
1373
1374 inline
1375 const T&
779e7ceb 1376 operator [] (unsigned int i) const
374f5a14 1377 {
1d4055aa 1378 return stack_[range_ - i];
374f5a14
RA
1379 }
1380
1381 private:
1382
1383 const S& stack_;
779e7ceb 1384 unsigned int range_;
374f5a14 1385 };
793fbca5 1386]b4_namespace_close[
2b548aa6 1387
cf98343c
AD
1388#endif // not BISON_STACK_HH[]dnl
1389]
08af01c2 1390m4_divert_pop(0)
a9ce3f54 1391m4_popdef([b4_copyright_years])dnl