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