]> git.saurik.com Git - bison.git/blob - data/lalr1.cc
Factor b4_assert_if, b4_lex_symbol_if, and b4_variant_if.
[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_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
23 # --------------------------------------------------------------
24 # Declare "parser::yy<TABLE-NAME>_" which contents is CONTENT.
25 m4_define([b4_integral_parser_table_declare],
26 [m4_ifval([$3], [b4_c_comment([$3], [ ])
27 ])dnl
28 static const b4_int_type_for([$2]) yy$1_[[]];dnl
29 ])
30
31 # b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
32 # ---------------------------------------------
33 # Define "parser::yy<TABLE-NAME>_" which contents is CONTENT.
34 m4_define([b4_integral_parser_table_define],
35 [ const b4_int_type_for([$2])
36 b4_parser_class_name::yy$1_[[]] =
37 {
38 $2
39 };dnl
40 ])
41
42
43 # b4_symbol_value_template(VAL, [TYPE])
44 # -------------------------------------
45 # Same as b4_symbol_value, but used in a template method. It makes
46 # a difference when using variants.
47 m4_copy([b4_symbol_value], [b4_symbol_value_template])
48
49
50 # b4_lhs_value([TYPE])
51 # --------------------
52 # Expansion of $<TYPE>$.
53 m4_define([b4_lhs_value],
54 [b4_symbol_value([yylhs.value], [$1])])
55
56
57 # b4_lhs_location()
58 # -----------------
59 # Expansion of @$.
60 m4_define([b4_lhs_location],
61 [yylhs.location])
62
63
64 # b4_rhs_data(RULE-LENGTH, NUM)
65 # -----------------------------
66 # Return the data corresponding to the symbol #NUM, where the current
67 # rule has RULE-LENGTH symbols on RHS.
68 m4_define([b4_rhs_data],
69 [yystack_@{b4_subtract($@)@}])
70
71
72 # b4_rhs_state(RULE-LENGTH, NUM)
73 # ------------------------------
74 # The state corresponding to the symbol #NUM, where the current
75 # rule has RULE-LENGTH symbols on RHS.
76 m4_define([b4_rhs_state],
77 [b4_rhs_data([$1], [$2]).state])
78
79
80 # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
81 # --------------------------------------
82 # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
83 # symbols on RHS.
84 m4_define([b4_rhs_value],
85 [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])])
86
87
88 # b4_rhs_location(RULE-LENGTH, NUM)
89 # ---------------------------------
90 # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
91 # on RHS.
92 m4_define([b4_rhs_location],
93 [b4_rhs_data([$1], [$2]).location])
94
95
96 # b4_symbol_action(SYMBOL-NUM, KIND)
97 # ----------------------------------
98 # Run the action KIND (destructor or printer) for SYMBOL-NUM.
99 # Same as in C, but using references instead of pointers.
100 m4_define([b4_symbol_action],
101 [b4_symbol_if([$1], [has_$2],
102 [m4_pushdef([b4_dollar_dollar],
103 [b4_symbol_value_template([yysym.value],
104 b4_symbol_if([$1], [has_type],
105 [b4_symbol([$1], [type])]))])dnl
106 m4_pushdef([b4_at_dollar], [yysym.location])dnl
107 b4_symbol_case_([$1])
108 b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
109 b4_symbol([$1], [$2])
110 b4_syncline([@oline@], [@ofile@])
111 break;
112
113 m4_popdef([b4_at_dollar])dnl
114 m4_popdef([b4_dollar_dollar])dnl
115 ])])
116
117 # b4_symbol_constructor_declaration_(SYMBOL-NUMBER)
118 # -------------------------------------------------
119 # Declare the overloaded version of make_symbol for the (common) type of
120 # these SYMBOL-NUMBERS. Use at class-level.
121 m4_define([b4_symbol_constructor_declaration_],
122 [b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
123 [ static inline
124 symbol_type
125 make_[]b4_symbol_([$1], [id]) (dnl
126 b4_args(b4_symbol_if([$1], [has_type],
127 [const b4_symbol([$1], [type])& v]),
128 b4_locations_if([const location_type& l])));
129
130 ])])])
131
132
133 # b4_symbol_constructor_declarations
134 # ----------------------------------
135 # Declare symbol constructors for all the value types.
136 # Use at class-level.
137 m4_define([b4_symbol_constructor_declarations],
138 [b4_variant_if([
139 // Symbol constructors declarations.
140 b4_symbol_foreach([b4_symbol_constructor_declaration_])])])
141
142
143
144 # b4_symbol_constructor_definition_(SYMBOL-NUMBER)
145 # ------------------------------------------------
146 # Define symbol constructor for this SYMBOL-NUMBER.
147 m4_define([b4_symbol_constructor_definition_],
148 [b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
149 [ b4_parser_class_name::symbol_type
150 b4_parser_class_name::make_[]b4_symbol_([$1], [id]) (dnl
151 b4_args(b4_symbol_if([$1], [has_type],
152 [const b4_symbol([$1], [type])& v]),
153 b4_locations_if([const location_type& l])))
154 {
155 return symbol_type (b4_args([yytranslate_ (token::b4_symbol([$1], [id]))],
156 b4_symbol_if([$1], [has_type], [v]),
157 b4_locations_if([l])));
158 }
159
160 ])])])
161
162
163 # b4_symbol_constructor_definitions
164 # ----------------------------------
165 # Define the overloaded versions of make_symbol for all the value types.
166 m4_define([b4_symbol_constructor_definitions],
167 [b4_variant_if([
168 // Implementation of make_symbol for each symbol type.
169 b4_symbol_foreach([b4_symbol_constructor_definition_])])])
170
171
172 # b4_yytranslate_definition
173 # -------------------------
174 # Define yytranslate_. Sometimes we want it in the header file,
175 # sometimes the cc file suffices.
176 m4_define([b4_yytranslate_definition],
177 [[ // Symbol number corresponding to token number t.
178 ]b4_parser_class_name[::token_number_type
179 ]b4_parser_class_name[::yytranslate_ (]b4_lex_symbol_if([token_type],
180 [int])[ t)
181 {
182 static
183 const token_number_type
184 translate_table[] =
185 {
186 ]b4_translate[
187 };
188 const unsigned int user_token_number_max_ = ]b4_user_token_number_max[;
189 const token_number_type undef_token_ = ]b4_undef_token_number[;
190
191 if (static_cast<int>(t) <= yyeof_)
192 return yyeof_;
193 else if (static_cast<unsigned int> (t) <= user_token_number_max_)
194 return translate_table[t];
195 else
196 return undef_token_;
197 }
198 ]])
199
200
201 m4_pushdef([b4_copyright_years],
202 [2002, 2003, 2004, 2005, 2006, 2007, 2008])
203
204 m4_define([b4_parser_class_name],
205 [b4_percent_define_get([[parser_class_name]])])
206
207 # The header is mandatory.
208 b4_defines_if([],
209 [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
210
211 b4_locations_if(
212 [# Backward compatibility.
213 m4_define([b4_location_constructors])
214 m4_include(b4_pkgdatadir/[location.cc])])
215 m4_include(b4_pkgdatadir/[stack.hh])
216 b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
217
218 # We do want M4 expansion after # for CPP macros.
219 m4_changecom()
220 m4_divert_push(0)dnl
221 @output(b4_spec_defines_file@)@
222 b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
223 dnl FIXME: This is wrong, we want computed header guards.
224 [
225 /* C++ LALR(1) parser skeleton written by Akim Demaille. */
226
227 #ifndef PARSER_HEADER_H
228 # define PARSER_HEADER_H
229
230 ]b4_percent_code_get([[requires]])[
231
232 ]b4_assert_if([#include <cassert>])[
233 #include <string>
234 #include <iostream>
235 #include "stack.hh"
236
237 ]b4_namespace_open[
238 ]b4_locations_if([ class position;
239 class location;])[
240 ]b4_variant_if([b4_variant_definition])[
241 ]b4_namespace_close[
242
243 ]b4_locations_if([#include "location.hh"])[
244
245 /* Enabling traces. */
246 #ifndef YYDEBUG
247 # define YYDEBUG ]b4_debug_flag[
248 #endif
249
250 /* Enabling verbose error messages. */
251 #ifdef YYERROR_VERBOSE
252 # undef YYERROR_VERBOSE
253 # define YYERROR_VERBOSE 1
254 #else
255 # define YYERROR_VERBOSE ]b4_error_verbose_flag[
256 #endif
257
258 /* Enabling the token table. */
259 #ifndef YYTOKEN_TABLE
260 # define YYTOKEN_TABLE ]b4_token_table[
261 #endif
262
263 ]b4_locations_if([dnl
264 [/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
265 If N is 0, then set CURRENT to the empty location which ends
266 the previous symbol: RHS[0] (always defined). */
267
268 #ifndef YYLLOC_DEFAULT
269 # define YYLLOC_DEFAULT(Current, Rhs, N) \
270 do { \
271 if (N) \
272 { \
273 (Current).begin = (Rhs)[1].location.begin; \
274 (Current).end = (Rhs)[N].location.end; \
275 } \
276 else \
277 { \
278 (Current).begin = (Current).end = (Rhs)[0].location.end; \
279 } \
280 } while (false)
281 #endif]])[
282
283 ]b4_namespace_open[
284
285 /// A Bison parser.
286 class ]b4_parser_class_name[
287 {
288 public:
289 ]b4_public_types_declare[
290 ]b4_symbol_constructor_declarations[
291 /// Build a parser object.
292 ]b4_parser_class_name[ (]b4_parse_param_decl[);
293 virtual ~]b4_parser_class_name[ ();
294
295 /// Parse.
296 /// \returns 0 iff parsing succeeded.
297 virtual int parse ();
298
299 #if YYDEBUG
300 /// The current debugging stream.
301 std::ostream& debug_stream () const;
302 /// Set the current debugging stream.
303 void set_debug_stream (std::ostream &);
304
305 /// Type for debugging levels.
306 typedef int debug_level_type;
307 /// The current debugging level.
308 debug_level_type debug_level () const;
309 /// Set the current debugging level.
310 void set_debug_level (debug_level_type l);
311 #endif
312
313 /// Report a syntax error.]b4_locations_if([
314 /// \param loc where the syntax error is found.])[
315 /// \param msg a description of the syntax error.
316 virtual void error (]b4_locations_if([const location_type& loc, ])[const std::string& msg);
317
318 private:
319 /// Generate an error message.
320 /// \param state the state where the error occurred.
321 /// \param tok the lookahead token.
322 virtual std::string yysyntax_error_ (int yystate, int tok);
323
324 /// State numbers.
325 typedef int state_type;
326
327 /// Internal symbol numbers.
328 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
329 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
330 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
331
332 /* Tables. */
333 ]b4_parser_tables_declare[
334
335 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
336 /// For a symbol, its name in clear.
337 static const char* const yytname_[];
338 #endif]b4_error_verbose_if([
339
340 /// Convert the symbol name \a n to a form suitable for a diagnostic.
341 static std::string yytnamerr_ (const char *n);])[
342
343 #if YYDEBUG
344 ]b4_integral_parser_table_declare([rline], [b4_rline],
345 [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
346 /// Report on the debug stream that the rule \a r is going to be reduced.
347 virtual void yy_reduce_print_ (int r);
348 /// Print the state stack on the debug stream.
349 virtual void yystack_print_ ();
350
351 /* Debugging. */
352 int yydebug_;
353 std::ostream* yycdebug_;
354 #endif
355
356 /// Convert a scanner token number \a t to a symbol number.
357 static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t);
358
359 #if YYDEBUG
360 /// \brief Display a symbol type, value and location.
361 /// \param yyo The output stream.
362 /// \param yysym The symbol.
363 template <typename Exact>
364 void yy_print_ (std::ostream& yyo,
365 const symbol_base_type<Exact>& yysym) const;
366 #endif
367
368 /// \brief Reclaim the memory associated to a symbol.
369 /// \param yymsg Why this token is reclaimed.
370 /// If null, print nothing.
371 /// \param s The symbol.
372 template <typename Exact>
373 inline void yy_destroy_ (const char* yymsg,
374 symbol_base_type<Exact>& yysym) const;
375
376 private:
377 /// Element of the stack: a state and its attributes.
378 struct stack_symbol_type : symbol_base_type<stack_symbol_type>
379 {
380 /// The parent class.
381 typedef symbol_base_type<stack_symbol_type> super_type;
382
383 /// Default constructor.
384 inline stack_symbol_type ();
385
386 /// Constructor.
387 inline stack_symbol_type (]b4_args([state_type s],
388 [const semantic_type& v],
389 b4_locations_if([const location_type& l]))[);
390
391 /// The state.
392 state_type state;
393
394 /// Return the type corresponding to this state.
395 inline int type_get_ () const;
396 };
397
398 /// Stack type.
399 typedef stack<stack_symbol_type> stack_type;
400
401 /// The stack.
402 stack_type yystack_;
403
404 /// Push a new state on the stack.
405 /// \param m a debug message to display
406 /// if null, no trace is output.
407 /// \param s the symbol
408 /// \warning the contents of \a s.value is stolen.
409 inline void yypush_ (const char* m, stack_symbol_type& s);
410
411 /// Push a new look ahead token on the state on the stack.
412 /// \param m a debug message to display
413 /// if null, no trace is output.
414 /// \param s the state
415 /// \param sym the symbol (for its value and location).
416 /// \warning the contents of \a s.value is stolen.
417 inline void yypush_ (const char* m, state_type s, symbol_type& sym);
418
419 /// Pop \a n symbols the three stacks.
420 inline void yypop_ (unsigned int n = 1);
421
422 /* Constants. */
423 enum
424 {
425 yyeof_ = 0,
426 yylast_ = ]b4_last[, //< Last index in yytable_.
427 yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols.
428 yyempty_ = -2,
429 yyfinal_ = ]b4_final_state_number[, //< Termination state number.
430 yyterror_ = 1,
431 yyerrcode_ = 256,
432 yyntokens_ = ]b4_tokens_number[, //< Number of tokens.
433 };
434
435 ]b4_parse_param_vars[
436 };
437
438 ]b4_lex_symbol_if([b4_yytranslate_definition
439 b4_public_types_define
440 b4_symbol_constructor_definitions])[
441 ]b4_namespace_close[
442
443 ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
444 [b4_token_defines(b4_tokens)
445
446 #ifndef YYSTYPE
447 /* Redirection for backward compatibility. */
448 # define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
449 #endif
450 ])
451 b4_percent_code_get([[provides]])[]dnl
452
453 [#endif /* ! defined PARSER_HEADER_H */]
454 @output(b4_parser_file_name@)@
455 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
456 b4_percent_code_get([[top]])[]dnl
457 m4_if(b4_prefix, [yy], [],
458 [
459 // Take the name prefix into account.
460 #define yylex b4_prefix[]lex])[
461
462 /* First part of user declarations. */
463 ]b4_user_pre_prologue[
464
465 #include "@basename(]b4_spec_defines_file[@)"
466
467 /* User implementation prologue. */
468 ]b4_user_post_prologue
469 b4_percent_code_get[]dnl
470
471 [#ifndef YY_
472 # if YYENABLE_NLS
473 # if ENABLE_NLS
474 # include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
475 # define YY_(msgid) dgettext ("bison-runtime", msgid)
476 # endif
477 # endif
478 # ifndef YY_
479 # define YY_(msgid) msgid
480 # endif
481 #endif
482
483 /* Suppress unused-variable warnings by "using" E. */
484 #define YYUSE(e) ((void) (e))
485
486 /* Enable debugging if requested. */
487 #if YYDEBUG
488
489 /* A pseudo ostream that takes yydebug_ into account. */
490 # define YYCDEBUG if (yydebug_) (*yycdebug_)
491
492 # define YY_SYMBOL_PRINT(Title, Symbol) \
493 do { \
494 if (yydebug_) \
495 { \
496 *yycdebug_ << Title << ' '; \
497 yy_print_ (*yycdebug_, Symbol); \
498 *yycdebug_ << std::endl; \
499 } \
500 } while (false)
501
502 # define YY_REDUCE_PRINT(Rule) \
503 do { \
504 if (yydebug_) \
505 yy_reduce_print_ (Rule); \
506 } while (false)
507
508 # define YY_STACK_PRINT() \
509 do { \
510 if (yydebug_) \
511 yystack_print_ (); \
512 } while (false)
513
514 #else /* !YYDEBUG */
515
516 # define YYCDEBUG if (false) std::cerr
517 # define YY_SYMBOL_PRINT(Title, Symbol) static_cast<void>(0)
518 # define YY_REDUCE_PRINT(Rule) static_cast<void>(0)
519 # define YY_STACK_PRINT() static_cast<void>(0)
520
521 #endif /* !YYDEBUG */
522
523 #define yyerrok (yyerrstatus_ = 0)
524 #define yyclearin (yyempty = true)
525
526 #define YYACCEPT goto yyacceptlab
527 #define YYABORT goto yyabortlab
528 #define YYERROR goto yyerrorlab
529 #define YYRECOVERING() (!!yyerrstatus_)
530
531 ]b4_namespace_open[]b4_error_verbose_if([[
532
533 /* Return YYSTR after stripping away unnecessary quotes and
534 backslashes, so that it's suitable for yyerror. The heuristic is
535 that double-quoting is unnecessary unless the string contains an
536 apostrophe, a comma, or backslash (other than backslash-backslash).
537 YYSTR is taken from yytname. */
538 std::string
539 ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
540 {
541 if (*yystr == '"')
542 {
543 std::string yyr = "";
544 char const *yyp = yystr;
545
546 for (;;)
547 switch (*++yyp)
548 {
549 case '\'':
550 case ',':
551 goto do_not_strip_quotes;
552
553 case '\\':
554 if (*++yyp != '\\')
555 goto do_not_strip_quotes;
556 /* Fall through. */
557 default:
558 yyr += *yyp;
559 break;
560
561 case '"':
562 return yyr;
563 }
564 do_not_strip_quotes: ;
565 }
566
567 return yystr;
568 }
569 ]])[
570
571 /// Build a parser object.
572 ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
573 :])[
574 #if YYDEBUG
575 ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
576 yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
577 #endif]b4_parse_param_cons[
578 {
579 }
580
581 ]b4_parser_class_name::~b4_parser_class_name[ ()
582 {
583 }
584
585
586 /*---------------.
587 | Symbol types. |
588 `---------------*/
589
590 ]b4_lex_symbol_if([], [b4_public_types_define
591 b4_symbol_constructor_definitions])[
592
593 // stack_symbol_type.
594 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
595 : super_type ()
596 , state ()
597 {
598 }
599
600 ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_args(
601 [state_type s],
602 [const semantic_type& v],
603 b4_locations_if([const location_type& l]))[)
604 : super_type (v]b4_locations_if([, l])[)
605 , state (s)
606 {
607 }
608
609 int
610 ]b4_parser_class_name[::stack_symbol_type::type_get_ () const
611 {
612 return yystos_[state];
613 }
614
615
616 template <typename Exact>
617 void
618 ]b4_parser_class_name[::yy_destroy_ (const char* yymsg,
619 symbol_base_type<Exact>& yysym) const
620 {
621 int yytype = yysym.type_get ();
622 YYUSE (yymsg);
623 if (yymsg)
624 YY_SYMBOL_PRINT (yymsg, yysym);
625
626 // User destructor.
627 switch (yytype)
628 {
629 ]b4_symbol_foreach([b4_symbol_destructor])dnl
630 [ default:
631 break;
632 }]b4_variant_if([
633
634 // Type destructor.
635 b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[
636 }
637
638 #if YYDEBUG
639 template <typename Exact>
640 void
641 ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
642 const symbol_base_type<Exact>& yysym) const
643 {
644 int yytype = yysym.type_get ();
645 yyo << (yytype < yyntokens_ ? "token" : "nterm")
646 << ' ' << yytname_[yytype] << " ("]b4_locations_if([
647 << yysym.location << ": "])[;
648 switch (yytype)
649 {
650 ]b4_symbol_foreach([b4_symbol_printer])dnl
651 [ default:
652 break;
653 }
654 yyo << ')';
655 }
656 #endif
657
658 void
659 ]b4_parser_class_name[::yypush_ (const char* m, state_type s,
660 symbol_type& sym)
661 {
662 if (m)
663 YY_SYMBOL_PRINT (m, sym);
664 ]b4_variant_if(
665 [[ yystack_.push (stack_symbol_type (]b4_args(
666 [s],
667 [semantic_type()],
668 b4_locations_if([sym.location]))[));
669 ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]],
670 [build], [sym.value])],
671 [[ yystack_.push (stack_symbol_type (]b4_args(
672 [s],
673 [sym.value],
674 b4_locations_if([sym.location]))[));]])[
675 }
676
677 void
678 ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
679 {
680 if (m)
681 YY_SYMBOL_PRINT (m, s);
682 ]b4_variant_if(
683 [[ yystack_.push (stack_symbol_type (]b4_args(
684 [s.state],
685 [semantic_type()],
686 b4_locations_if([s.location]))[));
687 ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]],
688 [build], [s.value])],
689 [ yystack_.push (s);])[
690 }
691
692 void
693 ]b4_parser_class_name[::yypop_ (unsigned int n)
694 {
695 yystack_.pop (n);
696 }
697
698 #if YYDEBUG
699 std::ostream&
700 ]b4_parser_class_name[::debug_stream () const
701 {
702 return *yycdebug_;
703 }
704
705 void
706 ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
707 {
708 yycdebug_ = &o;
709 }
710
711
712 ]b4_parser_class_name[::debug_level_type
713 ]b4_parser_class_name[::debug_level () const
714 {
715 return yydebug_;
716 }
717
718 void
719 ]b4_parser_class_name[::set_debug_level (debug_level_type l)
720 {
721 yydebug_ = l;
722 }
723 #endif
724
725 int
726 ]b4_parser_class_name[::parse ()
727 {
728 /// Whether yyla contains a lookahead.
729 bool yyempty = true;
730
731 /* State. */
732 int yyn;
733 int yylen = 0;
734 int yystate = 0;
735
736 /* Error handling. */
737 int yynerrs_ = 0;
738 int yyerrstatus_ = 0;
739
740 /// The lookahead symbol.
741 symbol_type yyla;]b4_locations_if([[
742
743 /// The locations where the error started and ended.
744 stack_symbol_type yyerror_range[2];]])[
745
746 /// $$ and @@$.
747 stack_symbol_type yylhs;
748
749 /// The return value of parse().
750 int yyresult;
751
752 YYCDEBUG << "Starting parse" << std::endl;
753
754 ]m4_ifdef([b4_initial_action], [
755 m4_pushdef([b4_at_dollar], [yyla.location])dnl
756 m4_pushdef([b4_dollar_dollar], [yyla.value])dnl
757 /* User initialization code. */
758 b4_user_initial_action
759 m4_popdef([b4_dollar_dollar])dnl
760 m4_popdef([b4_at_dollar])])dnl
761
762 [ /* Initialize the stack. The initial state will be set in
763 yynewstate, since the latter expects the semantical and the
764 location values to have been already stored, initialize these
765 stacks with a primary value. */
766 yystack_ = stack_type (0);
767 yypush_ (0, 0, yyla);
768
769 // A new state was pushed on the stack.
770 // Invariant: yystate == yystack_[0].state, i.e.,
771 // yystate was just pushed onto the state stack.
772 yynewstate:
773 YYCDEBUG << "Entering state " << yystate << std::endl;
774
775 /* Accept? */
776 if (yystate == yyfinal_)
777 goto yyacceptlab;
778
779 goto yybackup;
780
781 /* Backup. */
782 yybackup:
783
784 /* Try to take a decision without lookahead. */
785 yyn = yypact_[yystate];
786 if (yyn == yypact_ninf_)
787 goto yydefault;
788
789 /* Read a lookahead token. */
790 if (yyempty)
791 {
792 YYCDEBUG << "Reading a token: ";
793 ]b4_lex_symbol_if(
794 [ yyla = b4_c_function_call([yylex], [symbol_type],
795 m4_ifdef([b4_lex_param], b4_lex_param));],
796 [ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int],
797 [[YYSTYPE*], [&yyla.value]][]dnl
798 b4_locations_if([, [[location*], [&yyla.location]]])dnl
799 m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
800 yyempty = false;
801 }
802 YY_SYMBOL_PRINT ("Next token is", yyla);
803
804 /* If the proper action on seeing token YYLA.TYPE is to reduce or
805 to detect an error, take that action. */
806 yyn += yyla.type;
807 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
808 goto yydefault;
809
810 /* Reduce or error. */
811 yyn = yytable_[yyn];
812 if (yyn <= 0)
813 {
814 if (yyn == 0 || yyn == yytable_ninf_)
815 goto yyerrlab;
816 yyn = -yyn;
817 goto yyreduce;
818 }
819
820 /* Discard the token being shifted. */
821 yyempty = true;
822
823 /* Count tokens shifted since error; after three, turn off error
824 status. */
825 if (yyerrstatus_)
826 --yyerrstatus_;
827
828 /* Shift the lookahead token. */
829 yystate = yyn;
830 yypush_ ("Shifting", yystate, yyla);
831 goto yynewstate;
832
833 /*-----------------------------------------------------------.
834 | yydefault -- do the default action for the current state. |
835 `-----------------------------------------------------------*/
836 yydefault:
837 yyn = yydefact_[yystate];
838 if (yyn == 0)
839 goto yyerrlab;
840 goto yyreduce;
841
842 /*-----------------------------.
843 | yyreduce -- Do a reduction. |
844 `-----------------------------*/
845 yyreduce:
846 yylen = yyr2_[yyn];]b4_variant_if([
847 /* Variants are always initialized to an empty instance of the
848 correct type. The default $$=$1 action is NOT applied when using
849 variants. */
850 ]b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build]),[
851 /* If YYLEN is nonzero, implement the default value of the action:
852 `$$ = $1'. Otherwise, use the top of the stack.
853
854 Otherwise, the following line sets YYLHS.VALUE to garbage.
855 This behavior is undocumented and Bison
856 users should not rely upon it. */
857 if (yylen)
858 yylhs.value = yystack_@{yylen - 1@}.value;
859 else
860 yylhs.value = yystack_@{0@}.value;])[
861 ]b4_locations_if([dnl
862 [
863 // Compute the default @@$.
864 {
865 slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
866 YYLLOC_DEFAULT (yylhs.location, slice, yylen);
867 }]])[
868
869 // Perform the reduction.
870 YY_REDUCE_PRINT (yyn);
871 switch (yyn)
872 {
873 ]b4_user_actions[
874 default:
875 break;
876 }
877 // Compute post-reduction state.
878 yyn = yyr1_[yyn];
879 yystate = yypgoto_[yyn - yyntokens_] + yystack_[yylen].state;
880 if (0 <= yystate && yystate <= yylast_
881 && yycheck_[yystate] == yystack_[yylen].state)
882 yystate = yytable_[yystate];
883 else
884 yystate = yydefgoto_[yyn - yyntokens_];
885 yylhs.state = yystate;
886 YY_SYMBOL_PRINT ("-> $$ =", yylhs);
887 ]b4_variant_if([[
888 // Destroy the rhs symbols.
889 for (int i = 0; i < yylen; ++i)
890 // Destroy a variant which value may have been swapped with
891 // yylhs.value (for instance if the action was "std::swap($$,
892 // $1)"). The value of yylhs.value (hence possibly one of these
893 // rhs symbols) depends on the default contruction for this
894 // type. In the case of pointers for instance, no
895 // initialization is done, so the value is junk. Therefore do
896 // not try to report the value of symbols about to be destroyed
897 // in the debug trace, it's possibly junk. Hence yymsg = 0.
898 // Besides, that keeps exactly the same traces as with the other
899 // Bison skeletons.
900 yy_destroy_ (0, yystack_[i]);]])[
901
902 yypop_ (yylen);
903 yylen = 0;
904 YY_STACK_PRINT ();
905
906 /* Shift the result of the reduction. */
907 yypush_ (0, yylhs);
908 goto yynewstate;
909
910 /*--------------------------------------.
911 | yyerrlab -- here on detecting error. |
912 `--------------------------------------*/
913 yyerrlab:
914 /* If not already recovering from an error, report this error. */
915 if (!yyerrstatus_)
916 {
917 ++yynerrs_;
918 error (]b4_args(b4_locations_if([yyla.location]),
919 [yysyntax_error_ (yystate, yyla.type)])[);
920 }
921
922 ]b4_locations_if([[
923 yyerror_range[0].location = yyla.location;]])[
924 if (yyerrstatus_ == 3)
925 {
926 /* If just tried and failed to reuse lookahead token after an
927 error, discard it. */
928
929 /* Return failure if at end of input. */
930 if (yyla.type == yyeof_)
931 YYABORT;
932 else
933 {
934 yy_destroy_ ("Error: discarding", yyla);
935 yyempty = true;
936 }
937 }
938
939 /* Else will try to reuse lookahead token after shifting the error
940 token. */
941 goto yyerrlab1;
942
943
944 /*---------------------------------------------------.
945 | yyerrorlab -- error raised explicitly by YYERROR. |
946 `---------------------------------------------------*/
947 yyerrorlab:
948
949 /* Pacify compilers like GCC when the user code never invokes
950 YYERROR and the label yyerrorlab therefore never appears in user
951 code. */
952 if (false)
953 goto yyerrorlab;
954
955 ]b4_locations_if([[
956 yyerror_range[0].location = yystack_[yylen - 1].location;]])[
957 /* Do not reclaim the symbols of the rule which action triggered
958 this YYERROR. */
959 yypop_ (yylen);
960 yylen = 0;
961 yystate = yystack_[0].state;
962 goto yyerrlab1;
963
964 /*-------------------------------------------------------------.
965 | yyerrlab1 -- common code for both syntax error and YYERROR. |
966 `-------------------------------------------------------------*/
967 yyerrlab1:
968 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
969 {
970 stack_symbol_type error_token;
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 ]b4_locations_if([[
989 yyerror_range[0].location = yystack_[0].location;]])[
990 yy_destroy_ ("Error: popping", yystack_[0]);
991 yypop_ ();
992 yystate = yystack_[0].state;
993 YY_STACK_PRINT ();
994 }
995 ]b4_locations_if([[
996 yyerror_range[1].location = yyla.location;
997 YYLLOC_DEFAULT (error_token.location, (yyerror_range - 1), 2);]])[
998
999 /* Shift the error token. */
1000 error_token.state = yystate = yyn;
1001 yypush_ ("Shifting", error_token);
1002 }
1003 goto yynewstate;
1004
1005 /* Accept. */
1006 yyacceptlab:
1007 yyresult = 0;
1008 goto yyreturn;
1009
1010 /* Abort. */
1011 yyabortlab:
1012 yyresult = 1;
1013 goto yyreturn;
1014
1015 yyreturn:
1016 if (!yyempty)
1017 yy_destroy_ ("Cleanup: discarding lookahead", yyla);
1018
1019 /* Do not reclaim the symbols of the rule which action triggered
1020 this YYABORT or YYACCEPT. */
1021 yypop_ (yylen);
1022 while (yystack_.size () != 1)
1023 {
1024 yy_destroy_ ("Cleanup: popping", yystack_[0]);
1025 yypop_ ();
1026 }
1027
1028 return yyresult;
1029 }
1030
1031 // Generate an error message.
1032 std::string
1033 ]b4_parser_class_name[::yysyntax_error_ (]dnl
1034 b4_error_verbose_if([int yystate, int yytoken],
1035 [int, int])[)
1036 {
1037 std::string yyres;]b4_error_verbose_if([[
1038 int yyn = yypact_[yystate];
1039 if (yypact_ninf_ < yyn && yyn <= yylast_)
1040 {
1041 /* Start YYX at -YYN if negative to avoid negative indexes in
1042 YYCHECK. */
1043 int yyxbegin = yyn < 0 ? -yyn : 0;
1044
1045 /* Stay within bounds of both yycheck and yytname. */
1046 int yychecklim = yylast_ - yyn + 1;
1047 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
1048
1049 // Number of reported tokens (one for the "unexpected", one per
1050 // "expected").
1051 size_t yycount = 0;
1052 // Its maximum.
1053 enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1054 // Arguments of yyformat.
1055 char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1056 yyarg[yycount++] = yytname_[yytoken];
1057 for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
1058 if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_)
1059 {
1060 if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1061 {
1062 yycount = 1;
1063 break;
1064 }
1065 else
1066 yyarg[yycount++] = yytname_[yyx];
1067 }
1068
1069 char const* yyformat = 0;
1070 switch (yycount)
1071 {
1072 #define YYCASE_(N, S) \
1073 case N: \
1074 yyformat = S; \
1075 break
1076 YYCASE_(1, YY_("syntax error, unexpected %s"));
1077 YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1078 YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1079 YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1080 YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1081 #undef YYCASE_
1082 }
1083 // Argument number.
1084 size_t yyi = 0;
1085 for (char const* yyp = yyformat; *yyp; ++yyp)
1086 if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
1087 {
1088 yyres += yytnamerr_ (yyarg[yyi++]);
1089 ++yyp;
1090 }
1091 else
1092 yyres += *yyp;
1093 }
1094 else
1095 ]])dnl
1096 [ yyres = YY_("syntax error");
1097 return yyres;
1098 }
1099
1100
1101 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
1102
1103 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
1104
1105 ]b4_parser_tables_define[
1106
1107 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
1108 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1109 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
1110 const char*
1111 const ]b4_parser_class_name[::yytname_[] =
1112 {
1113 ]b4_tname[
1114 };
1115 #endif
1116
1117 #if YYDEBUG
1118 ]b4_integral_parser_table_define([rline], [b4_rline])[
1119
1120 // Print the state stack on the debug stream.
1121 void
1122 ]b4_parser_class_name[::yystack_print_ ()
1123 {
1124 *yycdebug_ << "Stack now";
1125 for (stack_type::const_iterator
1126 i = yystack_.begin (),
1127 i_end = yystack_.end ();
1128 i != i_end; ++i)
1129 *yycdebug_ << ' ' << i->state;
1130 *yycdebug_ << std::endl;
1131 }
1132
1133 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1134 void
1135 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
1136 {
1137 unsigned int yylno = yyrline_[yyrule];
1138 int yynrhs = yyr2_[yyrule];
1139 /* Print the symbols being reduced, and their result. */
1140 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
1141 << " (line " << yylno << "):" << std::endl;
1142 /* The symbols being reduced. */
1143 for (int yyi = 0; yyi < yynrhs; yyi++)
1144 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1145 ]b4_rhs_data(yynrhs, yyi + 1)[);
1146 }
1147 #endif // YYDEBUG
1148
1149 ]b4_lex_symbol_if([], [b4_yytranslate_definition])[
1150 ]b4_namespace_close[
1151 ]b4_epilogue[]dnl
1152 m4_divert_pop(0)
1153 m4_popdef([b4_copyright_years])dnl