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