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