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