]> git.saurik.com Git - bison.git/blob - data/lalr1.cc
* doc/bison.texinfo (Introduction): Mention GLR and C++ as on the web
[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 #ifndef 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 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 YYUSE (yystate);
833 #if YYERROR_VERBOSE
834 int yyn = yypact_[yystate];
835 if (yypact_ninf_ < yyn && yyn < yylast_)
836 {
837 /* Start YYX at -YYN if negative to avoid negative indexes in
838 YYCHECK. */
839 int yyxbegin = yyn < 0 ? -yyn : 0;
840
841 /* Stay within bounds of both yycheck and yytname. */
842 int yychecklim = yylast_ - yyn;
843 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
844 int count = 0;
845 for (int x = yyxbegin; x < yyxend; ++x)
846 if (yycheck_[x + yyn] == x && x != yyterror_)
847 ++count;
848
849 // FIXME: This method of building the message is not compatible
850 // with internationalization. It should work like yacc.c does it.
851 // That is, first build a string that looks like this:
852 // "syntax error, unexpected %s or %s or %s"
853 // Then, invoke YY_ on this string.
854 // Finally, use the string as a format to output
855 // yytname_[tok], etc.
856 // Until this gets fixed, this message appears in English only.
857 res = "syntax error, unexpected ";
858 res += yytnamerr_ (yytname_[tok]);
859 if (count < 5)
860 {
861 count = 0;
862 for (int x = yyxbegin; x < yyxend; ++x)
863 if (yycheck_[x + yyn] == x && x != yyterror_)
864 {
865 res += (!count++) ? ", expecting " : " or ";
866 res += yytnamerr_ (yytname_[x]);
867 }
868 }
869 }
870 else
871 #endif
872 res = YY_("syntax error");
873 return res;
874 }
875
876
877 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
878 STATE-NUM. */
879 const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
880 const ]b4_int_type_for([b4_pact])[
881 ]b4_parser_class_name[::yypact_[] =
882 {
883 ]b4_pact[
884 };
885
886 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
887 doesn't specify something else to do. Zero means the default is an
888 error. */
889 const ]b4_int_type_for([b4_defact])[
890 ]b4_parser_class_name[::yydefact_[] =
891 {
892 ]b4_defact[
893 };
894
895 /* YYPGOTO[NTERM-NUM]. */
896 const ]b4_int_type_for([b4_pgoto])[
897 ]b4_parser_class_name[::yypgoto_[] =
898 {
899 ]b4_pgoto[
900 };
901
902 /* YYDEFGOTO[NTERM-NUM]. */
903 const ]b4_int_type_for([b4_defgoto])[
904 ]b4_parser_class_name[::yydefgoto_[] =
905 {
906 ]b4_defgoto[
907 };
908
909 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
910 positive, shift that token. If negative, reduce the rule which
911 number is the opposite. If zero, do what YYDEFACT says. */
912 const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
913 const ]b4_int_type_for([b4_table])[
914 ]b4_parser_class_name[::yytable_[] =
915 {
916 ]b4_table[
917 };
918
919 /* YYCHECK. */
920 const ]b4_int_type_for([b4_check])[
921 ]b4_parser_class_name[::yycheck_[] =
922 {
923 ]b4_check[
924 };
925
926 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
927 symbol of state STATE-NUM. */
928 const ]b4_int_type_for([b4_stos])[
929 ]b4_parser_class_name[::yystos_[] =
930 {
931 ]b4_stos[
932 };
933
934 #if YYDEBUG
935 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
936 to YYLEX-NUM. */
937 const ]b4_int_type_for([b4_toknum])[
938 ]b4_parser_class_name[::yytoken_number_[] =
939 {
940 ]b4_toknum[
941 };
942 #endif
943
944 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
945 const ]b4_int_type_for([b4_r1])[
946 ]b4_parser_class_name[::yyr1_[] =
947 {
948 ]b4_r1[
949 };
950
951 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
952 const ]b4_int_type_for([b4_r2])[
953 ]b4_parser_class_name[::yyr2_[] =
954 {
955 ]b4_r2[
956 };
957
958 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
959 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
960 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
961 const char*
962 const ]b4_parser_class_name[::yytname_[] =
963 {
964 ]b4_tname[
965 };
966 #endif
967
968 #if YYDEBUG
969 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
970 const ]b4_parser_class_name[::rhs_number_type
971 ]b4_parser_class_name[::yyrhs_[] =
972 {
973 ]b4_rhs[
974 };
975
976 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
977 YYRHS. */
978 const ]b4_int_type_for([b4_prhs])[
979 ]b4_parser_class_name[::yyprhs_[] =
980 {
981 ]b4_prhs[
982 };
983
984 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
985 const ]b4_int_type_for([b4_rline])[
986 ]b4_parser_class_name[::yyrline_[] =
987 {
988 ]b4_rline[
989 };
990
991 // Print the state stack on the debug stream.
992 void
993 ]b4_parser_class_name[::yystack_print_ ()
994 {
995 *yycdebug_ << "Stack now";
996 for (state_stack_type::const_iterator i = yystate_stack_.begin ();
997 i != yystate_stack_.end (); ++i)
998 *yycdebug_ << ' ' << *i;
999 *yycdebug_ << std::endl;
1000 }
1001
1002 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1003 void
1004 ]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
1005 {
1006 unsigned int yylno = yyrline_[yyrule];
1007 int yynrhs = yyr2_[yyrule];
1008 /* Print the symbols being reduced, and their result. */
1009 *yycdebug_ << "Reducing stack by rule " << yyrule - 1
1010 << " (line " << yylno << "), ";
1011 /* The symbols being reduced. */
1012 for (int yyi = 0; yyi < yynrhs; yyi++)
1013 YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
1014 yyrhs_[yyprhs_[yyrule] + yyi],
1015 &]b4_rhs_value(yynrhs, yyi + 1)[,
1016 &]b4_rhs_location(yynrhs, yyi + 1)[);
1017 }
1018 #endif // YYDEBUG
1019
1020 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
1021 ]b4_parser_class_name[::token_number_type
1022 ]b4_parser_class_name[::yytranslate_ (int token)
1023 {
1024 static
1025 const token_number_type
1026 translate_table[] =
1027 {
1028 ]b4_translate[
1029 };
1030 if ((unsigned int) token <= yyuser_token_number_max_)
1031 return translate_table[token];
1032 else
1033 return yyundef_token_;
1034 }
1035
1036 const int ]b4_parser_class_name[::yyeof_ = 0;
1037 const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
1038 const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
1039 const int ]b4_parser_class_name[::yyempty_ = -2;
1040 const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
1041 const int ]b4_parser_class_name[::yyterror_ = 1;
1042 const int ]b4_parser_class_name[::yyerrcode_ = 256;
1043 const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
1044
1045 const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
1046 const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
1047
1048 } // namespace yy
1049
1050 ]b4_epilogue
1051 dnl
1052 @output b4_dir_prefix[]stack.hh
1053 b4_copyright([stack handling for Bison C++ parsers],
1054 [2002, 2003, 2004, 2005, 2006])[
1055
1056 #ifndef BISON_STACK_HH
1057 # define BISON_STACK_HH
1058
1059 #include <deque>
1060
1061 namespace yy
1062 {
1063 template <class T, class S = std::deque<T> >
1064 class stack
1065 {
1066 public:
1067
1068 // Hide our reversed order.
1069 typedef typename S::reverse_iterator iterator;
1070 typedef typename S::const_reverse_iterator const_iterator;
1071
1072 stack () : seq_ ()
1073 {
1074 }
1075
1076 stack (unsigned int n) : seq_ (n)
1077 {
1078 }
1079
1080 inline
1081 T&
1082 operator [] (unsigned int i)
1083 {
1084 return seq_[i];
1085 }
1086
1087 inline
1088 const T&
1089 operator [] (unsigned int i) const
1090 {
1091 return seq_[i];
1092 }
1093
1094 inline
1095 void
1096 push (const T& t)
1097 {
1098 seq_.push_front (t);
1099 }
1100
1101 inline
1102 void
1103 pop (unsigned int n = 1)
1104 {
1105 for (; n; --n)
1106 seq_.pop_front ();
1107 }
1108
1109 inline
1110 unsigned int
1111 height () const
1112 {
1113 return seq_.size ();
1114 }
1115
1116 inline const_iterator begin () const { return seq_.rbegin (); }
1117 inline const_iterator end () const { return seq_.rend (); }
1118
1119 private:
1120
1121 S seq_;
1122 };
1123
1124 /// Present a slice of the top of a stack.
1125 template <class T, class S = stack<T> >
1126 class slice
1127 {
1128 public:
1129
1130 slice (const S& stack,
1131 unsigned int range) : stack_ (stack),
1132 range_ (range)
1133 {
1134 }
1135
1136 inline
1137 const T&
1138 operator [] (unsigned int i) const
1139 {
1140 return stack_[range_ - i];
1141 }
1142
1143 private:
1144
1145 const S& stack_;
1146 unsigned int range_;
1147 };
1148 }
1149
1150 #endif // not BISON_STACK_HH]
1151 m4_divert(-1)