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