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