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