]> git.saurik.com Git - bison.git/blob - data/lalr1.cc
Also warn about non-used mid-rule values.
[bison.git] / data / lalr1.cc
1 m4_divert(-1)
2
3 # C++ skeleton for Bison
4
5 # Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 # 02110-1301 USA
21
22 m4_include(b4_pkgdatadir/[c++.m4])
23 # Backward compatibility.
24 m4_define([b4_location_constructors])
25 m4_include(b4_pkgdatadir/[location.cc])
26
27 # We do want M4 expansion after # for CPP macros.
28 m4_changecom()
29 m4_divert(0)dnl
30 m4_if(b4_defines_flag, 0, [],
31 [@output @output_header_name@
32 b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
33 [2002, 2003, 2004, 2005, 2006])
34 dnl FIXME: This is wrong, we want computed header guards.
35 [
36 /* C++ LALR(1) parser skeleton written by Akim Demaille. */
37
38 #ifndef PARSER_HEADER_H
39 # define PARSER_HEADER_H
40
41 #include <string>
42 #include <iostream>
43 #include "stack.hh"
44
45 namespace yy
46 {
47 class position;
48 class location;
49 }
50
51 /* First part of user declarations. */
52 ]b4_pre_prologue[
53
54 ]/* Line __line__ of lalr1.cc. */
55 b4_syncline([@oline@], [@ofile@])[
56
57 ]dnl Include location.hh here: it might depend on headers included above.
58 [#include "location.hh"
59
60 /* Enabling traces. */
61 #ifndef YYDEBUG
62 # define YYDEBUG ]b4_debug[
63 #endif
64
65 /* Enabling verbose error messages. */
66 #ifdef YYERROR_VERBOSE
67 # undef YYERROR_VERBOSE
68 # define YYERROR_VERBOSE 1
69 #else
70 # define YYERROR_VERBOSE ]b4_error_verbose[
71 #endif
72
73 /* Enabling the token table. */
74 #ifndef YYTOKEN_TABLE
75 # define YYTOKEN_TABLE ]b4_token_table[
76 #endif
77
78 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
79 If N is 0, then set CURRENT to the empty location which ends
80 the previous symbol: RHS[0] (always defined). */
81
82 #ifndef YYLLOC_DEFAULT
83 # define YYLLOC_DEFAULT(Current, Rhs, N) \
84 do { \
85 if (N) \
86 { \
87 (Current).begin = (Rhs)[1].begin; \
88 (Current).end = (Rhs)[N].end; \
89 } \
90 else \
91 { \
92 (Current).begin = (Current).end = (Rhs)[0].end; \
93 } \
94 } while (false)
95 #endif
96
97 namespace yy
98 {
99
100 /// A Bison parser.
101 class ]b4_parser_class_name[
102 {
103 public:
104 /// Symbol semantic values.
105 #if ! defined (YYSTYPE)
106 ]m4_ifdef([b4_stype],
107 [ union semantic_type
108 b4_stype
109 /* Line __line__ of lalr1.cc. */
110 b4_syncline([@oline@], [@ofile@])
111 ;],
112 [ typedef int semantic_type;])[
113 #else
114 typedef YYSTYPE semantic_type;
115 #endif
116 /// Symbol locations.
117 typedef ]b4_location_type[ location_type;
118 /// Tokens.
119 struct token
120 {
121 ]b4_token_enums(b4_tokens)[
122 };
123
124 /// Build a parser object.
125 ]b4_parser_class_name[ (]b4_parse_param_decl[);
126 virtual ~]b4_parser_class_name[ ();
127
128 /// Parse.
129 /// \returns 0 iff parsing succeeded.
130 virtual int parse ();
131
132 /// The current debugging stream.
133 std::ostream& debug_stream () const;
134 /// Set the current debugging stream.
135 void set_debug_stream (std::ostream &);
136
137 /// Type for debugging levels.
138 typedef int debug_level_type;
139 /// The current debugging level.
140 debug_level_type debug_level () const;
141 /// Set the current debugging level.
142 void set_debug_level (debug_level_type l);
143
144 private:
145 /// Report a syntax error.
146 /// \param loc where the syntax error is found.
147 /// \param msg a description of the syntax error.
148 virtual void error (const location_type& loc, const std::string& msg);
149
150 /// Generate an error message.
151 /// \param state the state where the error occurred.
152 /// \param tok the look-ahead token.
153 virtual std::string yysyntax_error_ (int yystate]dnl
154 b4_error_verbose_if([, int tok])[);
155
156 #if YYDEBUG
157 /// \brief Report a symbol value on the debug stream.
158 /// \param yytype The token type.
159 /// \param yyvaluep Its semantic value.
160 /// \param yylocationp Its location.
161 virtual void yy_symbol_value_print_ (int yytype,
162 const semantic_type* yyvaluep,
163 const location_type* yylocationp);
164 /// \brief Report a symbol on the debug stream.
165 /// \param yytype The token type.
166 /// \param yyvaluep Its semantic value.
167 /// \param yylocationp Its location.
168 virtual void yy_symbol_print_ (int yytype,
169 const semantic_type* yyvaluep,
170 const location_type* yylocationp);
171 #endif /* ! YYDEBUG */
172
173
174 /// State numbers.
175 typedef int state_type;
176 /// State stack type.
177 typedef stack<state_type> state_stack_type;
178 /// Semantic value stack type.
179 typedef stack<semantic_type> semantic_stack_type;
180 /// location stack type.
181 typedef stack<location_type> location_stack_type;
182
183 /// The state stack.
184 state_stack_type yystate_stack_;
185 /// The semantic value stack.
186 semantic_stack_type yysemantic_stack_;
187 /// The location stack.
188 location_stack_type yylocation_stack_;
189
190 /// Internal symbol numbers.
191 typedef ]b4_int_type_for([b4_translate])[ token_number_type;
192 /* Tables. */
193 /// For a state, the index in \a yytable_ of its portion.
194 static const ]b4_int_type_for([b4_pact])[ yypact_[];
195 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
196
197 /// For a state, default rule to reduce.
198 /// Unless\a yytable_ specifies something else to do.
199 /// Zero means the default is an error.
200 static const ]b4_int_type_for([b4_defact])[ yydefact_[];
201
202 static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
203 static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
204
205 /// What to do in a state.
206 /// \a yytable_[yypact_[s]]: what to do in state \a s.
207 /// - if positive, shift that token.
208 /// - if negative, reduce the rule which number is the opposite.
209 /// - if zero, do what YYDEFACT says.
210 static const ]b4_int_type_for([b4_table])[ yytable_[];
211 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
212
213 static const ]b4_int_type_for([b4_check])[ yycheck_[];
214
215 /// For a state, its accessing symbol.
216 static const ]b4_int_type_for([b4_stos])[ yystos_[];
217
218 /// For a rule, its LHS.
219 static const ]b4_int_type_for([b4_r1])[ yyr1_[];
220 /// For a rule, its RHS length.
221 static const ]b4_int_type_for([b4_r2])[ yyr2_[];
222
223 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
224 /// For a symbol, its name in clear.
225 static const char* const yytname_[];
226 #endif
227
228 #if YYERROR_VERBOSE
229 /// Convert the symbol name \a n to a form suitable for a diagnostic.
230 virtual std::string yytnamerr_ (const char *n);
231 #endif
232
233 #if YYDEBUG
234 /// A type to store symbol numbers and -1.
235 typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
236 /// A `-1'-separated list of the rules' RHS.
237 static const rhs_number_type yyrhs_[];
238 /// For each rule, the index of the first RHS symbol in \a yyrhs_.
239 static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];
240 /// For each rule, its source line number.
241 static const ]b4_int_type_for([b4_rline])[ yyrline_[];
242 /// For each scanner token number, its symbol number.
243 static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
244 /// Report on the debug stream that the rule \a r is going to be reduced.
245 virtual void yy_reduce_print_ (int r);
246 /// Print the state stack on the debug stream.
247 virtual void yystack_print_ ();
248 #endif
249
250 /// Convert a scanner token number to a symbol number.
251 inline token_number_type yytranslate_ (int token);
252
253 /// \brief Reclaim the memory associated to a symbol.
254 /// \param yymsg Why this token is reclaimed.
255 /// \param yytype The symbol type.
256 /// \param yyvaluep Its semantic value.
257 /// \param yylocationp Its location.
258 inline void yydestruct_ (const char* yymsg,
259 int yytype,
260 semantic_type* yyvaluep,
261 location_type* yylocationp);
262
263 /// Pop \a n symbols the three stacks.
264 inline void yypop_ (unsigned int n = 1);
265
266 /* Constants. */
267 static const int yyeof_;
268 /* LAST_ -- Last index in TABLE_. */
269 static const int yylast_;
270 static const int yynnts_;
271 static const int yyempty_;
272 static const int yyfinal_;
273 static const int yyterror_;
274 static const int yyerrcode_;
275 static const int yyntokens_;
276 static const unsigned int yyuser_token_number_max_;
277 static const token_number_type yyundef_token_;
278
279 /* Debugging. */
280 int yydebug_;
281 std::ostream* yycdebug_;
282
283 ]b4_parse_param_vars[
284 };
285 }
286
287 ]m4_ifset([b4_global_tokens_and_yystype],
288 [b4_token_defines(b4_tokens)
289
290 #ifndef YYSTYPE
291 /* Redirection for backward compatibility. */
292 # define YYSTYPE yy::b4_parser_class_name::semantic_type
293 #endif
294 ])[
295 #endif /* ! defined PARSER_HEADER_H */]
296 ])dnl
297 @output @output_parser_name@
298 b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
299 [2002, 2003, 2004, 2005, 2006])
300 m4_if(b4_prefix[], [yy], [],
301 [
302 // Take the name prefix into account.
303 #define yylex b4_prefix[]lex])
304 m4_if(b4_defines_flag, 0, [],
305 [
306 #include @output_header_name@])[
307
308 /* User implementation prologue. */
309 ]b4_post_prologue[
310
311 ]/* Line __line__ of lalr1.cc. */
312 b4_syncline([@oline@], [@ofile@])[
313
314 #ifndef YY_
315 # if YYENABLE_NLS
316 # if ENABLE_NLS
317 # include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
318 # define YY_(msgid) dgettext ("bison-runtime", msgid)
319 # endif
320 # endif
321 # ifndef YY_
322 # define YY_(msgid) msgid
323 # endif
324 #endif
325
326 /* Suppress unused-variable warnings by "using" E. */
327 #define YYUSE(e) ((void) (e))
328
329 /* A pseudo ostream that takes yydebug_ into account. */
330 # define YYCDEBUG \
331 for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false) \
332 (*yycdebug_)
333
334 /* Enable debugging if requested. */
335 #if YYDEBUG
336
337 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
338 do { \
339 if (yydebug_) \
340 { \
341 *yycdebug_ << Title << ' '; \
342 yy_symbol_print_ ((Type), (Value), (Location)); \
343 *yycdebug_ << std::endl; \
344 } \
345 } while (false)
346
347 # define YY_REDUCE_PRINT(Rule) \
348 do { \
349 if (yydebug_) \
350 yy_reduce_print_ (Rule); \
351 } while (false)
352
353 # define YY_STACK_PRINT() \
354 do { \
355 if (yydebug_) \
356 yystack_print_ (); \
357 } while (false)
358
359 #else /* !YYDEBUG */
360
361 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
362 # define YY_REDUCE_PRINT(Rule)
363 # define YY_STACK_PRINT()
364
365 #endif /* !YYDEBUG */
366
367 #define YYACCEPT goto yyacceptlab
368 #define YYABORT goto yyabortlab
369 #define YYERROR goto yyerrorlab
370
371 #if YYERROR_VERBOSE
372
373 /* Return YYSTR after stripping away unnecessary quotes and
374 backslashes, so that it's suitable for yyerror. The heuristic is
375 that double-quoting is unnecessary unless the string contains an
376 apostrophe, a comma, or backslash (other than backslash-backslash).
377 YYSTR is taken from yytname. */
378 std::string
379 yy::]b4_parser_class_name[::yytnamerr_ (const char *yystr)
380 {
381 if (*yystr == '"')
382 {
383 std::string yyr = "";
384 char const *yyp = yystr;
385
386 for (;;)
387 switch (*++yyp)
388 {
389 case '\'':
390 case ',':
391 goto do_not_strip_quotes;
392
393 case '\\':
394 if (*++yyp != '\\')
395 goto do_not_strip_quotes;
396 /* Fall through. */
397 default:
398 yyr += *yyp;
399 break;
400
401 case '"':
402 return yyr;
403 }
404 do_not_strip_quotes: ;
405 }
406
407 return yystr;
408 }
409
410 #endif
411
412 namespace yy
413 {
414 /// Build a parser object.
415 ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)
416 : yydebug_ (false),
417 yycdebug_ (&std::cerr)]b4_parse_param_cons[
418 {
419 }
420
421 ]b4_parser_class_name::~b4_parser_class_name[ ()
422 {
423 }
424
425 #if YYDEBUG
426 /*--------------------------------.
427 | Print this symbol on YYOUTPUT. |
428 `--------------------------------*/
429
430 inline void
431 ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
432 const semantic_type* yyvaluep, const location_type* yylocationp)
433 {
434 YYUSE (yylocationp);
435 YYUSE (yyvaluep);
436 switch (yytype)
437 {
438 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
439 [ default:
440 break;
441 }
442 }
443
444
445 void
446 ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
447 const semantic_type* yyvaluep, const location_type* yylocationp)
448 {
449 *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
450 << ' ' << yytname_[yytype] << " ("
451 << *yylocationp << ": ";
452 yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
453 *yycdebug_ << ')';
454 }
455 #endif /* ! YYDEBUG */
456
457 void
458 ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
459 int yytype, semantic_type* yyvaluep, location_type* yylocationp)
460 {
461 YYUSE (yylocationp);
462 YYUSE (yymsg);
463 YYUSE (yyvaluep);
464
465 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
466
467 switch (yytype)
468 {
469 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
470 default:
471 break;
472 }
473 }
474
475 void
476 ]b4_parser_class_name[::yypop_ (unsigned int n)
477 {
478 yystate_stack_.pop (n);
479 yysemantic_stack_.pop (n);
480 yylocation_stack_.pop (n);
481 }
482
483 std::ostream&
484 ]b4_parser_class_name[::debug_stream () const
485 {
486 return *yycdebug_;
487 }
488
489 void
490 ]b4_parser_class_name[::set_debug_stream (std::ostream& o)
491 {
492 yycdebug_ = &o;
493 }
494
495
496 ]b4_parser_class_name[::debug_level_type
497 ]b4_parser_class_name[::debug_level () const
498 {
499 return yydebug_;
500 }
501
502 void
503 ]b4_parser_class_name[::set_debug_level (debug_level_type l)
504 {
505 yydebug_ = l;
506 }
507
508
509 int
510 ]b4_parser_class_name[::parse ()
511 {
512 /// Look-ahead and look-ahead in internal form.
513 int yychar = yyempty_;
514 int yytoken = 0;
515
516 /* State. */
517 int yyn;
518 int yylen = 0;
519 int yystate = 0;
520
521 /* Error handling. */
522 int yynerrs_ = 0;
523 int yyerrstatus_ = 0;
524
525 /// Semantic value of the look-ahead.
526 semantic_type yylval;
527 /// Location of the look-ahead.
528 location_type yylloc;
529 /// The locations where the error started and ended.
530 location yyerror_range[2];
531
532 /// $$.
533 semantic_type yyval;
534 /// @@$.
535 location_type yyloc;
536
537 int yyresult;
538
539 YYCDEBUG << "Starting parse" << std::endl;
540
541 ]m4_ifdef([b4_initial_action], [
542 m4_pushdef([b4_at_dollar], [yylloc])dnl
543 m4_pushdef([b4_dollar_dollar], [yylval])dnl
544 /* User initialization code. */
545 b4_initial_action
546 m4_popdef([b4_dollar_dollar])dnl
547 m4_popdef([b4_at_dollar])dnl
548 /* Line __line__ of yacc.c. */
549 b4_syncline([@oline@], [@ofile@])])dnl
550
551 [ /* Initialize the stacks. The initial state will be pushed in
552 yynewstate, since the latter expects the semantical and the
553 location values to have been already stored, initialize these
554 stacks with a primary value. */
555 yystate_stack_ = state_stack_type (0);
556 yysemantic_stack_ = semantic_stack_type (0);
557 yylocation_stack_ = location_stack_type (0);
558 yysemantic_stack_.push (yylval);
559 yylocation_stack_.push (yylloc);
560
561 /* New state. */
562 yynewstate:
563 yystate_stack_.push (yystate);
564 YYCDEBUG << "Entering state " << yystate << std::endl;
565 goto yybackup;
566
567 /* Backup. */
568 yybackup:
569
570 /* Try to take a decision without look-ahead. */
571 yyn = yypact_[yystate];
572 if (yyn == yypact_ninf_)
573 goto yydefault;
574
575 /* Read a look-ahead token. */
576 if (yychar == yyempty_)
577 {
578 YYCDEBUG << "Reading a token: ";
579 yychar = ]b4_c_function_call([yylex], [int],
580 [[YYSTYPE*], [&yylval]][]dnl
581 b4_location_if([, [[location*], [&yylloc]]])dnl
582 m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
583 }
584
585
586 /* Convert token to internal form. */
587 if (yychar <= yyeof_)
588 {
589 yychar = yytoken = yyeof_;
590 YYCDEBUG << "Now at end of input." << std::endl;
591 }
592 else
593 {
594 yytoken = yytranslate_ (yychar);
595 YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
596 }
597
598 /* If the proper action on seeing token YYTOKEN is to reduce or to
599 detect an error, take that action. */
600 yyn += yytoken;
601 if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
602 goto yydefault;
603
604 /* Reduce or error. */
605 yyn = yytable_[yyn];
606 if (yyn <= 0)
607 {
608 if (yyn == 0 || yyn == yytable_ninf_)
609 goto yyerrlab;
610 yyn = -yyn;
611 goto yyreduce;
612 }
613
614 /* Accept? */
615 if (yyn == yyfinal_)
616 goto yyacceptlab;
617
618 /* Shift the look-ahead token. */
619 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
620
621 /* Discard the token being shifted unless it is eof. */
622 if (yychar != yyeof_)
623 yychar = yyempty_;
624
625 yysemantic_stack_.push (yylval);
626 yylocation_stack_.push (yylloc);
627
628 /* Count tokens shifted since error; after three, turn off error
629 status. */
630 if (yyerrstatus_)
631 --yyerrstatus_;
632
633 yystate = yyn;
634 goto yynewstate;
635
636 /*-----------------------------------------------------------.
637 | yydefault -- do the default action for the current state. |
638 `-----------------------------------------------------------*/
639 yydefault:
640 yyn = yydefact_[yystate];
641 if (yyn == 0)
642 goto yyerrlab;
643 goto yyreduce;
644
645 /*-----------------------------.
646 | yyreduce -- Do a reduction. |
647 `-----------------------------*/
648 yyreduce:
649 yylen = yyr2_[yyn];
650 /* If YYLEN is nonzero, implement the default value of the action:
651 `$$ = $1'. Otherwise, use the top of the stack.
652
653 Otherwise, the following line sets YYVAL to garbage.
654 This behavior is undocumented and Bison
655 users should not rely upon it. */
656 if (yylen)
657 yyval = yysemantic_stack_[yylen - 1];
658 else
659 yyval = yysemantic_stack_[0];
660
661 {
662 slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);
663 YYLLOC_DEFAULT (yyloc, slice, yylen);
664 }
665 YY_REDUCE_PRINT (yyn);
666 switch (yyn)
667 {
668 ]b4_actions
669 /* Line __line__ of lalr1.cc. */
670 b4_syncline([@oline@], [@ofile@])[
671 default: break;
672 }
673 YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
674
675 yypop_ (yylen);
676 yylen = 0;
677 YY_STACK_PRINT ();
678
679 yysemantic_stack_.push (yyval);
680 yylocation_stack_.push (yyloc);
681
682 /* Shift the result of the reduction. */
683 yyn = yyr1_[yyn];
684 yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];
685 if (0 <= yystate && yystate <= yylast_
686 && yycheck_[yystate] == yystate_stack_[0])
687 yystate = yytable_[yystate];
688 else
689 yystate = yydefgoto_[yyn - yyntokens_];
690 goto yynewstate;
691
692 /*------------------------------------.
693 | yyerrlab -- here on detecting error |
694 `------------------------------------*/
695 yyerrlab:
696 /* If not already recovering from an error, report this error. */
697 if (!yyerrstatus_)
698 {
699 ++yynerrs_;
700 error (yylloc, yysyntax_error_ (yystate]dnl
701 b4_error_verbose_if([, yytoken])[));
702 }
703
704 yyerror_range[0] = yylloc;
705 if (yyerrstatus_ == 3)
706 {
707 /* If just tried and failed to reuse look-ahead token after an
708 error, discard it. */
709
710 if (yychar <= yyeof_)
711 {
712 /* Return failure if at end of input. */
713 if (yychar == yyeof_)
714 YYABORT;
715 }
716 else
717 {
718 yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
719 yychar = yyempty_;
720 }
721 }
722
723 /* Else will try to reuse look-ahead token after shifting the error
724 token. */
725 goto yyerrlab1;
726
727
728 /*---------------------------------------------------.
729 | yyerrorlab -- error raised explicitly by YYERROR. |
730 `---------------------------------------------------*/
731 yyerrorlab:
732
733 /* Pacify compilers like GCC when the user code never invokes
734 YYERROR and the label yyerrorlab therefore never appears in user
735 code. */
736 if (false)
737 goto yyerrorlab;
738
739 yyerror_range[0] = yylocation_stack_[yylen - 1];
740 /* Do not reclaim the symbols of the rule which action triggered
741 this YYERROR. */
742 yypop_ (yylen);
743 yylen = 0;
744 yystate = yystate_stack_[0];
745 goto yyerrlab1;
746
747 /*-------------------------------------------------------------.
748 | yyerrlab1 -- common code for both syntax error and YYERROR. |
749 `-------------------------------------------------------------*/
750 yyerrlab1:
751 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
752
753 for (;;)
754 {
755 yyn = yypact_[yystate];
756 if (yyn != yypact_ninf_)
757 {
758 yyn += yyterror_;
759 if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
760 {
761 yyn = yytable_[yyn];
762 if (0 < yyn)
763 break;
764 }
765 }
766
767 /* Pop the current state because it cannot handle the error token. */
768 if (yystate_stack_.height () == 1)
769 YYABORT;
770
771 yyerror_range[0] = yylocation_stack_[0];
772 yydestruct_ ("Error: popping",
773 yystos_[yystate],
774 &yysemantic_stack_[0], &yylocation_stack_[0]);
775 yypop_ ();
776 yystate = yystate_stack_[0];
777 YY_STACK_PRINT ();
778 }
779
780 if (yyn == yyfinal_)
781 goto yyacceptlab;
782
783 yyerror_range[1] = yylloc;
784 // Using YYLLOC is tempting, but would change the location of
785 // the look-ahead. YYLOC is available though.
786 YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2);
787 yysemantic_stack_.push (yylval);
788 yylocation_stack_.push (yyloc);
789
790 /* Shift the error token. */
791 YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
792 &yysemantic_stack_[0], &yylocation_stack_[0]);
793
794 yystate = yyn;
795 goto yynewstate;
796
797 /* Accept. */
798 yyacceptlab:
799 yyresult = 0;
800 goto yyreturn;
801
802 /* Abort. */
803 yyabortlab:
804 yyresult = 1;
805 goto yyreturn;
806
807 yyreturn:
808 if (yychar != yyeof_ && yychar != yyempty_)
809 yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
810
811 /* Do not reclaim the symbols of the rule which action triggered
812 this YYABORT or YYACCEPT. */
813 yypop_ (yylen);
814 while (yystate_stack_.height () != 1)
815 {
816 yydestruct_ ("Cleanup: popping",
817 yystos_[yystate_stack_[0]],
818 &yysemantic_stack_[0],
819 &yylocation_stack_[0]);
820 yypop_ ();
821 }
822
823 return yyresult;
824 }
825
826 // Generate an error message.
827 std::string
828 ]b4_parser_class_name[::yysyntax_error_ (int yystate]dnl
829 b4_error_verbose_if([, int tok])[)
830 {
831 std::string res;
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;
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 << "), ";
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 token)
1022 {
1023 static
1024 const token_number_type
1025 translate_table[] =
1026 {
1027 ]b4_translate[
1028 };
1029 if ((unsigned int) token <= yyuser_token_number_max_)
1030 return translate_table[token];
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 } // namespace yy
1048
1049 ]b4_epilogue
1050 dnl
1051 @output b4_dir_prefix[]stack.hh
1052 b4_copyright([stack handling for Bison C++ parsers],
1053 [2002, 2003, 2004, 2005, 2006])[
1054
1055 #ifndef BISON_STACK_HH
1056 # define BISON_STACK_HH
1057
1058 #include <deque>
1059
1060 namespace yy
1061 {
1062 template <class T, class S = std::deque<T> >
1063 class stack
1064 {
1065 public:
1066
1067 // Hide our reversed order.
1068 typedef typename S::reverse_iterator iterator;
1069 typedef typename S::const_reverse_iterator const_iterator;
1070
1071 stack () : seq_ ()
1072 {
1073 }
1074
1075 stack (unsigned int n) : seq_ (n)
1076 {
1077 }
1078
1079 inline
1080 T&
1081 operator [] (unsigned int i)
1082 {
1083 return seq_[i];
1084 }
1085
1086 inline
1087 const T&
1088 operator [] (unsigned int i) const
1089 {
1090 return seq_[i];
1091 }
1092
1093 inline
1094 void
1095 push (const T& t)
1096 {
1097 seq_.push_front (t);
1098 }
1099
1100 inline
1101 void
1102 pop (unsigned int n = 1)
1103 {
1104 for (; n; --n)
1105 seq_.pop_front ();
1106 }
1107
1108 inline
1109 unsigned int
1110 height () const
1111 {
1112 return seq_.size ();
1113 }
1114
1115 inline const_iterator begin () const { return seq_.rbegin (); }
1116 inline const_iterator end () const { return seq_.rend (); }
1117
1118 private:
1119
1120 S seq_;
1121 };
1122
1123 /// Present a slice of the top of a stack.
1124 template <class T, class S = stack<T> >
1125 class slice
1126 {
1127 public:
1128
1129 slice (const S& stack,
1130 unsigned int range) : stack_ (stack),
1131 range_ (range)
1132 {
1133 }
1134
1135 inline
1136 const T&
1137 operator [] (unsigned int i) const
1138 {
1139 return stack_[range_ - i];
1140 }
1141
1142 private:
1143
1144 const S& stack_;
1145 unsigned int range_;
1146 };
1147 }
1148
1149 #endif // not BISON_STACK_HH]
1150 m4_divert(-1)