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