3 # C++ skeleton for Bison
5 # Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
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.
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.
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
22 ## ---------------- ##
24 ## ---------------- ##
26 # Default parser class name.
27 m4_define_default([b4_parser_class_name
], [parser
])
31 ## ----------------- ##
32 ## Semantic Values. ##
33 ## ----------------- ##
36 # b4_lhs_value([TYPE])
37 # --------------------
38 # Expansion of $<TYPE>$.
39 m4_define([b4_lhs_value
],
40 [(yyval
[]m4_ifval([$
1], [.$
1]))])
43 # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
44 # --------------------------------------
45 # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
47 m4_define([b4_rhs_value
],
48 [(yysemantic_stack_@
{m4_eval([$
1 - $
2])@
}m4_ifval([$
3], [.$
3]))])
50 m4_define_default([b4_location_type
], [location
])
51 m4_define_default([b4_filename_type
], [std::string
])
56 m4_define([b4_lhs_location
],
60 # b4_rhs_location(RULE-LENGTH, NUM)
61 # ---------------------------------
62 # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
64 m4_define([b4_rhs_location
],
65 [(yylocation_stack_@
{m4_eval([$
1 - $
2])@
})])
70 # Extra formal arguments of the constructor.
71 # Change the parameter names from "foo" into "foo_yyarg", so that
72 # there is no collision bw the user chosen attribute name, and the
73 # argument name in the constructor.
74 m4_define([b4_parse_param_decl
],
75 [m4_ifset([b4_parse_param
],
76 [m4_map_sep([b4_parse_param_decl_1
], [, ], [b4_parse_param
])])])
78 m4_define([b4_parse_param_decl_1
],
85 # Extra initialisations of the constructor.
86 m4_define([b4_parse_param_cons
],
87 [m4_ifset([b4_parse_param
],
89 b4_cc_constructor_calls(b4_parse_param
)])])
90 m4_define([b4_cc_constructor_calls
],
91 [m4_map_sep([b4_cc_constructor_call
], [,
93 m4_define([b4_cc_constructor_call
],
98 # Extra instance variables.
99 m4_define([b4_parse_param_vars
],
100 [m4_ifset([b4_parse_param
],
102 /* User arguments. */
103 b4_cc_var_decls(b4_parse_param
)])])
104 m4_define([b4_cc_var_decls
],
105 [m4_map_sep([b4_cc_var_decl
], [
107 m4_define([b4_cc_var_decl
],
112 # We do want M4 expansion after # for CPP macros.
115 m4_if(b4_defines_flag
, 0, [],
116 [@output @output_header_name@
117 b4_copyright([C
++ Skeleton parser
for LALR(1) parsing with Bison
],
118 [2002, 2003, 2004, 2005])[
119 /* FIXME: This is wrong, we want computed header guards.
120 I don't know why the macros are missing now. :( */
121 #ifndef PARSER_HEADER_H
122 # define PARSER_HEADER_H
127 /* Using locations. */
128 #define YYLSP_NEEDED ]b4_locations_flag[
136 ]b4_token_defines(b4_tokens
)[
138 /* Copy the first part of user declarations. */
141 ]/* Line __line__ of lalr1.cc. */
142 b4_syncline([@oline@
], [@ofile@
])[
145 #include "location.hh"
147 /* Enabling traces. */
149 # define YYDEBUG ]b4_debug[
152 /* Enabling verbose error message. */
153 #ifndef YYERROR_VERBOSE
154 # define YYERROR_VERBOSE ]b4_error_verbose[
157 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
158 ]m4_ifdef([b4_stype
],
159 [b4_syncline([b4_stype_line
], [b4_filename
])
160 union YYSTYPE b4_stype
;
161 /* Line __line__ of lalr1.cc. */
162 b4_syncline([@oline@
], [@ofile@
])],
163 [typedef int YYSTYPE
;])[
164 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
165 # define YYSTYPE_IS_DECLARED 1
166 # define YYSTYPE_IS_TRIVIAL 1
169 /* Copy the second part of user declarations. */
172 ]/* Line __line__ of lalr1.cc. */
173 b4_syncline([@oline@
], [@ofile@
])[
174 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
175 If N is 0, then set CURRENT to the empty location which ends
176 the previous symbol: RHS[0] (always defined). */
178 #ifndef YYLLOC_DEFAULT
179 # define YYLLOC_DEFAULT(Current, Rhs, N) \
183 (Current).begin = (Rhs)[1].begin; \
184 (Current).end = (Rhs)[N].end; \
188 (Current).begin = (Current).end = (Rhs)[0].end; \
195 class ]b4_parser_class_name
[;
197 template <typename P
>
203 struct traits
<]b4_parser_class_name
[>
205 typedef ]b4_int_type_for([b4_translate
])[ token_number_type
;
206 typedef ]b4_int_type_for([b4_rhs
])[ rhs_number_type
;
207 typedef int state_type
;
208 typedef YYSTYPE semantic_type
;
209 typedef ]b4_location_type
[ location_type
;
216 class ]b4_parser_class_name
[
218 /// Symbol semantic values.
219 typedef traits
<]b4_parser_class_name
[>::semantic_type semantic_type
;
220 /// Symbol locations.
221 typedef traits
<]b4_parser_class_name
[>::location_type location_type
;
224 /// Build a parser object.
225 ]b4_parser_class_name
[ (]b4_parse_param_decl
[) :
227 yycdebug_ (&std::cerr
)]b4_parse_param_cons
[
231 virtual ~]b4_parser_class_name
[ ()
236 /// \returns 0 iff parsing succeeded.
237 virtual int parse ();
239 /// The current debugging stream.
240 std::ostream
& debug_stream () const;
241 /// Set the current debugging stream.
242 void set_debug_stream (std::ostream
&);
244 /// Type for debugging levels.
245 typedef int debug_level_type
;
246 /// The current debugging level.
247 debug_level_type
debug_level () const;
248 /// Set the current debugging level.
249 void set_debug_level (debug_level_type l
);
253 /// Call the scanner.
254 virtual void yylex_ ();
256 /// Report a syntax error.
257 /// \param loc where the syntax error is found.
258 /// \param msg a description of the syntax error.
259 virtual void error (const location_type
& loc
, const std::string
& msg
);
261 /// Generate an error message, and invoke error.
262 virtual void yyreport_syntax_error_ ();
265 /// \brief Report a symbol on the debug stream.
266 /// \param yytype The token type.
267 /// \param yyvaluep Its semantic value.
268 /// \param yylocationp Its location.
269 virtual void yysymprint_ (int yytype
,
270 const semantic_type
* yyvaluep
,
271 const location_type
* yylocationp
);
272 #endif /* ! YYDEBUG */
276 typedef traits
<]b4_parser_class_name
[>::state_type state_type
;
277 /// State stack type.
278 typedef stack
<state_type
> state_stack_type
;
279 /// Semantic value stack type.
280 typedef stack
<semantic_type
> semantic_stack_type
;
281 /// location stack type.
282 typedef stack
<location_type
> location_stack_type
;
285 state_stack_type yystate_stack_
;
286 /// The semantic value stack.
287 semantic_stack_type yysemantic_stack_
;
288 /// The location stack.
289 location_stack_type yylocation_stack_
;
291 /// Internal symbol numbers.
292 typedef traits
<]b4_parser_class_name
[>::token_number_type token_number_type
;
294 /// For a state, the index in \a yytable_ of its portion.
295 static const ]b4_int_type_for([b4_pact
])[ yypact_
[];
296 static const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
)[ yypact_ninf_
;
298 /// For a state, default rule to reduce.
299 /// Unless\a yytable_ specifies something else to do.
300 /// Zero means the default is an error.
301 static const ]b4_int_type_for([b4_defact
])[ yydefact_
[];
303 static const ]b4_int_type_for([b4_pgoto
])[ yypgoto_
[];
304 static const ]b4_int_type_for([b4_defgoto
])[ yydefgoto_
[];
306 /// What to do in a state.
307 /// \a yytable_[yypact_[s]]: what to do in state \a s.
308 /// - if positive, shift that token.
309 /// - if negative, reduce the rule which number is the opposite.
310 /// - if zero, do what YYDEFACT says.
311 static const ]b4_int_type_for([b4_table
])[ yytable_
[];
312 static const ]b4_int_type(b4_table_ninf
, b4_table_ninf
)[ yytable_ninf_
;
314 static const ]b4_int_type_for([b4_check
])[ yycheck_
[];
316 /// For a state, its accessing symbol.
317 static const ]b4_int_type_for([b4_stos
])[ yystos_
[];
319 /// For a rule, its LHS.
320 static const ]b4_int_type_for([b4_r1
])[ yyr1_
[];
321 /// For a rule, its RHS length.
322 static const ]b4_int_type_for([b4_r2
])[ yyr2_
[];
324 #if YYDEBUG || YYERROR_VERBOSE
325 /// For a symbol, its name in clear.
326 static const char* const yytname_
[];
330 /// Convert the symbol name \a n to a form suitable for a diagnostic.
331 virtual std::string
yytnamerr_ (const char *n
);
335 /// A type to store symbol numbers and -1.
336 typedef traits
<]b4_parser_class_name
[>::rhs_number_type rhs_number_type
;
337 /// A `-1'-separated list of the rules' RHS.
338 static const rhs_number_type yyrhs_
[];
339 /// For each rule, the index of the first RHS symbol in \a yyrhs_.
340 static const ]b4_int_type_for([b4_prhs
])[ yyprhs_
[];
341 /// For each rule, its source line number.
342 static const ]b4_int_type_for([b4_rline
])[ yyrline_
[];
343 /// For each scanner token number, its symbol number.
344 static const ]b4_int_type_for([b4_toknum
])[ yytoken_number_
[];
345 /// Report on the debug stream that the rule \a r is going to be reduced.
346 virtual void yyreduce_print_ (int r
);
347 /// Print the state stack on the debug stream.
348 virtual void yystack_print_ ();
351 /// Convert a scanner token number to a symbol number.
352 inline token_number_type
yytranslate_ (int token
);
354 /// \brief Reclaim the memory associated to a symbol.
355 /// \param yymsg Why this token is reclaimed.
356 /// \param yytype The symbol type.
357 /// \param yyvaluep Its semantic value.
358 /// \param yylocationp Its location.
359 inline void yydestruct_ (const char* yymsg
,
361 semantic_type
* yyvaluep
,
362 location_type
* yylocationp
);
364 /// Pop \a n symbols the three stacks.
365 inline void yypop_ (unsigned int n
= 1);
368 static const int yyeof_
;
369 /* LAST_ -- Last index in TABLE_. */
370 static const int yylast_
;
371 static const int yynnts_
;
372 static const int yyempty_
;
373 static const int yyfinal_
;
374 static const int yyterror_
;
375 static const int yyerrcode_
;
376 static const int yyntokens_
;
377 static const unsigned int yyuser_token_number_max_
;
378 static const token_number_type yyundef_token_
;
385 /* Error handling. */
391 std::ostream
* yycdebug_
;
393 /* Look-ahead and look-ahead in internal form. */
397 /// Semantic value of the look-ahead.
398 semantic_type yylval
;
399 /// Location of the look-ahead.
400 location_type yylloc
;
401 /// The locations where the error started and ended.
402 location yyerror_range_
[2];
408 ]b4_parse_param_vars
[
412 #endif /* ! defined PARSER_HEADER_H */]
414 @output @output_parser_name@
415 b4_copyright([C
++ Skeleton parser
for LALR(1) parsing with Bison
],
416 [2002, 2003, 2004, 2005])
417 m4_if(b4_prefix
[], [yy
], [],
419 // Take the name prefix into account.
420 #define yylex b4_prefix[]lex])
421 m4_if(b4_defines_flag
, 0, [],
423 #include @output_header_name@])[
428 # include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
429 # define YY_(msgid) dgettext ("bison-runtime", msgid)
433 # define YY_(msgid) msgid
437 /* A pseudo ostream that takes yydebug_ into account. */
439 for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false) \
442 /* Enable debugging if requested. */
445 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
449 *yycdebug_ << (Title) << ' '; \
450 yysymprint_ ((Type), (Value), (Location)); \
451 *yycdebug_ << std::endl; \
455 # define YY_REDUCE_PRINT(Rule) \
458 yyreduce_print_ (Rule); \
461 # define YY_STACK_PRINT() \
469 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
470 # define YY_REDUCE_PRINT(Rule)
471 # define YY_STACK_PRINT()
473 #endif /* !YYDEBUG */
475 #define YYACCEPT goto yyacceptlab
476 #define YYABORT goto yyabortlab
477 #define YYERROR goto yyerrorlab
481 /* Return YYSTR after stripping away unnecessary quotes and
482 backslashes, so that it's suitable for yyerror. The heuristic is
483 that double-quoting is unnecessary unless the string contains an
484 apostrophe, a comma, or backslash (other than backslash-backslash).
485 YYSTR is taken from yytname. */
487 yy::]b4_parser_class_name
[::yytnamerr_ (const char *yystr
)
491 std::string yyr
= "";
492 char const *yyp
= yystr
;
499 goto do_not_strip_quotes
;
503 goto do_not_strip_quotes
;
512 do_not_strip_quotes
: ;
521 /*--------------------------------.
522 | Print this symbol on YYOUTPUT. |
523 `--------------------------------*/
526 yy::]b4_parser_class_name
[::yysymprint_ (int yytype
,
527 const semantic_type
* yyvaluep
, const location_type
* yylocationp
)
529 /* Pacify ``unused variable'' warnings. */
532 /* Backward compatibility, but should be removed eventually. */
533 std::ostream
& cdebug_
= *yycdebug_
;
536 *yycdebug_
<< (yytype
< yyntokens_
? "token" : "nterm")
537 << ' ' << yytname_
[yytype
] << " ("
538 << *yylocationp
<< ": ";
541 ]m4_map([b4_symbol_actions
], m4_defn([b4_symbol_printers
]))dnl
547 #endif /* ! YYDEBUG */
550 yy::]b4_parser_class_name
[::yydestruct_ (const char* yymsg
,
551 int yytype
, semantic_type
* yyvaluep
, location_type
* yylocationp
)
553 /* Pacify ``unused variable'' warnings. */
558 YY_SYMBOL_PRINT (yymsg
, yytype
, yyvaluep
, yylocationp
);
562 ]m4_map([b4_symbol_actions
], m4_defn([b4_symbol_destructors
]))[
569 yy::]b4_parser_class_name
[::yypop_ (unsigned int n
)
571 yystate_stack_
.pop (n
);
572 yysemantic_stack_
.pop (n
);
573 yylocation_stack_
.pop (n
);
577 yy::]b4_parser_class_name
[::debug_stream () const
583 yy::]b4_parser_class_name
[::set_debug_stream (std::ostream
& o
)
589 yy::]b4_parser_class_name
[::debug_level_type
590 yy::]b4_parser_class_name
[::debug_level () const
596 yy::]b4_parser_class_name
[::set_debug_level (debug_level_type l
)
603 yy::]b4_parser_class_name
[::parse ()
607 YYCDEBUG
<< "Starting parse" << std::endl
;
616 ]m4_ifdef([b4_initial_action
], [
617 m4_pushdef([b4_at_dollar
], [yylloc
])dnl
618 m4_pushdef([b4_dollar_dollar
], [yylval
])dnl
619 /* User initialization code. */
621 m4_popdef([b4_dollar_dollar
])dnl
622 m4_popdef([b4_at_dollar
])dnl
623 /* Line __line__ of yacc.c. */
624 b4_syncline([@oline@
], [@ofile@
])])dnl
626 [ /* Initialize the stacks. The initial state will be pushed in
627 yynewstate, since the latter expects the semantical and the
628 location values to have been already stored, initialize these
629 stacks with a primary value. */
630 yystate_stack_
= state_stack_type (0);
631 yysemantic_stack_
= semantic_stack_type (0);
632 yylocation_stack_
= location_stack_type (0);
633 yysemantic_stack_
.push (yylval
);
634 yylocation_stack_
.push (yylloc
);
638 yystate_stack_
.push (yystate_
);
639 YYCDEBUG
<< "Entering state " << yystate_
<< std::endl
;
645 /* Try to take a decision without look-ahead. */
646 yyn_
= yypact_
[yystate_
];
647 if (yyn_
== yypact_ninf_
)
650 /* Read a look-ahead token. */
651 if (yylooka_
== yyempty_
)
654 /* Convert token to internal form. */
655 if (yylooka_
<= yyeof_
)
657 yylooka_
= yyilooka_
= yyeof_
;
658 YYCDEBUG
<< "Now at end of input." << std::endl
;
662 yyilooka_
= yytranslate_ (yylooka_
);
663 YY_SYMBOL_PRINT ("Next token is", yyilooka_
, &yylval
, &yylloc
);
666 /* If the proper action on seeing token ILOOKA_ is to reduce or to
667 detect an error, take that action. */
669 if (yyn_
< 0 || yylast_
< yyn_
|| yycheck_
[yyn_
] != yyilooka_
)
672 /* Reduce or error. */
673 yyn_
= yytable_
[yyn_
];
676 if (yyn_
== yytable_ninf_
)
688 if (yyn_
== yyfinal_
)
691 /* Shift the look-ahead token. */
692 YY_SYMBOL_PRINT ("Shifting", yyilooka_
, &yylval
, &yylloc
);
694 /* Discard the token being shifted unless it is eof. */
695 if (yylooka_
!= yyeof_
)
698 yysemantic_stack_
.push (yylval
);
699 yylocation_stack_
.push (yylloc
);
701 /* Count tokens shifted since error; after three, turn off error
709 /*-----------------------------------------------------------.
710 | yydefault -- do the default action for the current state. |
711 `-----------------------------------------------------------*/
713 yyn_
= yydefact_
[yystate_
];
718 /*-----------------------------.
719 | yyreduce -- Do a reduction. |
720 `-----------------------------*/
722 yylen_
= yyr2_
[yyn_
];
723 /* If LEN_ is nonzero, implement the default value of the action:
724 `$$ = $1'. Otherwise, use the top of the stack.
726 Otherwise, the following line sets YYVAL to garbage.
727 This behavior is undocumented and Bison
728 users should not rely upon it. */
730 yyval
= yysemantic_stack_
[yylen_
- 1];
732 yyval
= yysemantic_stack_
[0];
735 slice
<location_type
, location_stack_type
> slice (yylocation_stack_
, yylen_
);
736 YYLLOC_DEFAULT (yyloc
, slice
, yylen_
);
738 YY_REDUCE_PRINT (yyn_
);
745 ]/* Line __line__ of lalr1.cc. */
746 b4_syncline([@oline@
], [@ofile@
])[
752 yysemantic_stack_
.push (yyval
);
753 yylocation_stack_
.push (yyloc
);
755 /* Shift the result of the reduction. */
757 yystate_
= yypgoto_
[yyn_
- yyntokens_
] + yystate_stack_
[0];
758 if (0 <= yystate_
&& yystate_
<= yylast_
759 && yycheck_
[yystate_
] == yystate_stack_
[0])
760 yystate_
= yytable_
[yystate_
];
762 yystate_
= yydefgoto_
[yyn_
- yyntokens_
];
765 /*------------------------------------.
766 | yyerrlab -- here on detecting error |
767 `------------------------------------*/
769 /* If not already recovering from an error, report this error. */
770 yyreport_syntax_error_ ();
772 yyerror_range_
[0] = yylloc
;
773 if (yyerrstatus_
== 3)
775 /* If just tried and failed to reuse look-ahead token after an
776 error, discard it. */
778 if (yylooka_
<= yyeof_
)
780 /* Return failure if at end of input. */
781 if (yylooka_
== yyeof_
)
786 yydestruct_ ("Error: discarding", yyilooka_
, &yylval
, &yylloc
);
791 /* Else will try to reuse look-ahead token after shifting the error
796 /*---------------------------------------------------.
797 | yyerrorlab -- error raised explicitly by YYERROR. |
798 `---------------------------------------------------*/
801 /* Pacify compilers like GCC when the user code never invokes
802 YYERROR and the label yyerrorlab therefore never appears in user
807 yyerror_range_
[0] = yylocation_stack_
[yylen_
- 1];
809 yystate_
= yystate_stack_
[0];
812 /*-------------------------------------------------------------.
813 | yyerrlab1 -- common code for both syntax error and YYERROR. |
814 `-------------------------------------------------------------*/
816 yyerrstatus_
= 3; /* Each real token shifted decrements this. */
820 yyn_
= yypact_
[yystate_
];
821 if (yyn_
!= yypact_ninf_
)
824 if (0 <= yyn_
&& yyn_
<= yylast_
&& yycheck_
[yyn_
] == yyterror_
)
826 yyn_
= yytable_
[yyn_
];
832 /* Pop the current state because it cannot handle the error token. */
833 if (yystate_stack_
.height () == 1)
836 yyerror_range_
[0] = yylocation_stack_
[0];
837 yydestruct_ ("Error: popping",
839 &yysemantic_stack_
[0], &yylocation_stack_
[0]);
841 yystate_
= yystate_stack_
[0];
845 if (yyn_
== yyfinal_
)
848 yyerror_range_
[1] = yylloc
;
849 // Using YYLLOC is tempting, but would change the location of
850 // the look-ahead. YYLOC is available though.
851 YYLLOC_DEFAULT (yyloc
, yyerror_range_
- 1, 2);
852 yysemantic_stack_
.push (yylval
);
853 yylocation_stack_
.push (yyloc
);
855 /* Shift the error token. */
856 YY_SYMBOL_PRINT ("Shifting", yystos_
[yyn_
],
857 &yysemantic_stack_
[0], &yylocation_stack_
[0]);
873 if (yylooka_
!= yyeof_
&& yylooka_
!= yyempty_
)
874 yydestruct_ ("Error: discarding lookahead", yyilooka_
, &yylval
, &yylloc
);
876 while (yystate_stack_
.height () != 1)
878 yydestruct_ ("Error: popping",
879 yystos_
[yystate_stack_
[0]],
880 &yysemantic_stack_
[0],
881 &yylocation_stack_
[0]);
889 yy::]b4_parser_class_name
[::yylex_ ()
891 YYCDEBUG
<< "Reading a token: ";
892 yylooka_
= ]b4_c_function_call([yylex
], [int],
893 [[YYSTYPE
*], [&yylval
]][]dnl
894 b4_location_if([, [[location
*], [&yylloc
]]])dnl
895 m4_ifdef([b4_lex_param
], [, ]b4_lex_param
))[;
898 // Generate an error message, and invoke error.
900 yy::]b4_parser_class_name
[::yyreport_syntax_error_ ()
902 /* If not already recovering from an error, report this error. */
908 yyn_
= yypact_
[yystate_
];
909 if (yypact_ninf_
< yyn_
&& yyn_
< yylast_
)
911 /* Start YYX at -YYN if negative to avoid negative indexes in
913 int yyxbegin
= yyn_
< 0 ? -yyn_
: 0;
915 /* Stay within bounds of both yycheck and yytname. */
916 int yychecklim
= yylast_
- yyn_
;
917 int yyxend
= yychecklim
< yyntokens_
? yychecklim
: yyntokens_
;
919 for (int x
= yyxbegin
; x
< yyxend
; ++x
)
920 if (yycheck_
[x
+ yyn_
] == x
&& x
!= yyterror_
)
923 // FIXME: This method of building the message is not compatible
924 // with internationalization. It should work like yacc.c does it.
925 // That is, first build a string that looks like this:
926 // "syntax error, unexpected %s or %s or %s"
927 // Then, invoke YY_ on this string.
928 // Finally, use the string as a format to output
929 // yytname_[yyilooka_], etc.
930 // Until this gets fixed, this message appears in English only.
931 message
= "syntax error, unexpected ";
932 message
+= yytnamerr_ (yytname_
[yyilooka_
]);
936 for (int x
= yyxbegin
; x
< yyxend
; ++x
)
937 if (yycheck_
[x
+ yyn_
] == x
&& x
!= yyterror_
)
939 message
+= (!count
++) ? ", expecting " : " or ";
940 message
+= yytnamerr_ (yytname_
[x
]);
946 message
= YY_("syntax error");
947 error (yylloc
, message
);
952 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
954 const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
) yy::b4_parser_class_name::yypact_ninf_
= b4_pact_ninf
[;
955 const ]b4_int_type_for([b4_pact
])[
956 yy::]b4_parser_class_name
[::yypact_
[] =
961 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
962 doesn't specify something else to do. Zero means the default is an
964 const ]b4_int_type_for([b4_defact
])[
965 yy::]b4_parser_class_name
[::yydefact_
[] =
970 /* YYPGOTO[NTERM-NUM]. */
971 const ]b4_int_type_for([b4_pgoto
])[
972 yy::]b4_parser_class_name
[::yypgoto_
[] =
977 /* YYDEFGOTO[NTERM-NUM]. */
978 const ]b4_int_type_for([b4_defgoto
])[
979 yy::]b4_parser_class_name
[::yydefgoto_
[] =
984 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
985 positive, shift that token. If negative, reduce the rule which
986 number is the opposite. If zero, do what YYDEFACT says. */
987 const ]b4_int_type(b4_table_ninf
, b4_table_ninf
) yy::b4_parser_class_name::yytable_ninf_
= b4_table_ninf
[;
988 const ]b4_int_type_for([b4_table
])[
989 yy::]b4_parser_class_name
[::yytable_
[] =
995 const ]b4_int_type_for([b4_check
])[
996 yy::]b4_parser_class_name
[::yycheck_
[] =
1001 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
1002 symbol of state STATE-NUM. */
1003 const ]b4_int_type_for([b4_stos
])[
1004 yy::]b4_parser_class_name
[::yystos_
[] =
1010 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
1012 const ]b4_int_type_for([b4_toknum
])[
1013 yy::]b4_parser_class_name
[::yytoken_number_
[] =
1019 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
1020 const ]b4_int_type_for([b4_r1
])[
1021 yy::]b4_parser_class_name
[::yyr1_
[] =
1026 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
1027 const ]b4_int_type_for([b4_r2
])[
1028 yy::]b4_parser_class_name
[::yyr2_
[] =
1033 #if YYDEBUG || YYERROR_VERBOSE
1034 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1035 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
1037 const yy::]b4_parser_class_name
[::yytname_
[] =
1044 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
1045 const yy::]b4_parser_class_name
[::rhs_number_type
1046 yy::]b4_parser_class_name
[::yyrhs_
[] =
1051 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
1053 const ]b4_int_type_for([b4_prhs
])[
1054 yy::]b4_parser_class_name
[::yyprhs_
[] =
1059 /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
1060 const ]b4_int_type_for([b4_rline
])[
1061 yy::]b4_parser_class_name
[::yyrline_
[] =
1066 // Print the state stack on the debug stream.
1068 yy::]b4_parser_class_name
[::yystack_print_ ()
1070 *yycdebug_
<< "Stack now";
1071 for (state_stack_type::const_iterator i
= yystate_stack_
.begin ();
1072 i
!= yystate_stack_
.end (); ++i
)
1073 *yycdebug_
<< ' ' << *i
;
1074 *yycdebug_
<< std::endl
;
1077 // Report on the debug stream that the rule \a yyrule is going to be reduced.
1079 yy::]b4_parser_class_name
[::yyreduce_print_ (int yyrule
)
1081 unsigned int yylno
= yyrline_
[yyrule
];
1082 /* Print the symbols being reduced, and their result. */
1083 *yycdebug_
<< "Reducing stack by rule " << yyn_
- 1
1084 << " (line " << yylno
<< "), ";
1085 for (]b4_int_type_for([b4_prhs
])[ i
= yyprhs_
[yyn_
];
1086 0 <= yyrhs_
[i
]; ++i
)
1087 *yycdebug_
<< yytname_
[yyrhs_
[i
]] << ' ';
1088 *yycdebug_
<< "-> " << yytname_
[yyr1_
[yyn_
]] << std::endl
;
1092 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
1093 yy::]b4_parser_class_name
[::token_number_type
1094 yy::]b4_parser_class_name
[::yytranslate_ (int token
)
1097 const token_number_type
1102 if ((unsigned int) token
<= yyuser_token_number_max_
)
1103 return translate_table
[token
];
1105 return yyundef_token_
;
1108 const int yy::]b4_parser_class_name
[::yyeof_
= 0;
1109 const int yy::]b4_parser_class_name
[::yylast_
= ]b4_last
[;
1110 const int yy::]b4_parser_class_name
[::yynnts_
= ]b4_nterms_number
[;
1111 const int yy::]b4_parser_class_name
[::yyempty_
= -2;
1112 const int yy::]b4_parser_class_name
[::yyfinal_
= ]b4_final_state_number
[;
1113 const int yy::]b4_parser_class_name
[::yyterror_
= 1;
1114 const int yy::]b4_parser_class_name
[::yyerrcode_
= 256;
1115 const int yy::]b4_parser_class_name
[::yyntokens_
= ]b4_tokens_number
[;
1117 const unsigned int yy::]b4_parser_class_name
[::yyuser_token_number_max_
= ]b4_user_token_number_max
[;
1118 const yy::]b4_parser_class_name
[::token_number_type
yy::]b4_parser_class_name
[::yyundef_token_
= ]b4_undef_token_number
[;
1123 b4_copyright([stack handling
for Bison C
++ parsers
], [2002, 2003, 2004, 2005])[
1125 #ifndef BISON_STACK_HH
1126 # define BISON_STACK_HH
1132 template <class T
, class S
= std::deque
<T
> >
1137 // Hide our reversed order.
1138 typedef typename
S::reverse_iterator iterator
;
1139 typedef typename
S::const_reverse_iterator const_iterator
;
1145 stack (unsigned int n
) : seq_ (n
)
1151 operator [] (unsigned int i
)
1158 operator [] (unsigned int i
) const
1167 seq_
.push_front (t
);
1172 pop (unsigned int n
= 1)
1182 return seq_
.size ();
1185 inline const_iterator
begin () const { return seq_
.rbegin (); }
1186 inline const_iterator
end () const { return seq_
.rend (); }
1193 /// Present a slice of the top of a stack.
1194 template <class T
, class S
= stack
<T
> >
1199 slice (const S
& stack
,
1200 unsigned int range
) : stack_ (stack
),
1207 operator [] (unsigned int i
) const
1209 return stack_
[range_
- i
];
1215 unsigned int range_
;
1219 #endif // not BISON_STACK_HH]
1222 b4_copyright([Position
class for Bison C
++ parsers
], [2002, 2003, 2004, 2005])[
1225 ** \file position.hh
1226 ** Define the position class.
1229 #ifndef BISON_POSITION_HH
1230 # define BISON_POSITION_HH
1232 # include <iostream>
1237 /// Abstract a position.
1241 /// Initial column number.
1242 static const unsigned int initial_column
= 0;
1243 /// Initial line number.
1244 static const unsigned int initial_line
= 1;
1246 /** \name Ctor & dtor.
1249 /// Construct a position.
1252 line (initial_line
),
1253 column (initial_column
)
1259 /** \name Line and Column related manipulators
1262 /// (line related) Advance to the COUNT next lines.
1263 inline void lines (int count
= 1)
1265 column
= initial_column
;
1269 /// (column related) Advance to the COUNT next columns.
1270 inline void columns (int count
= 1)
1272 int leftmost
= initial_column
;
1273 int current
= column
;
1274 if (leftmost
<= current
+ count
)
1277 column
= initial_column
;
1282 /// File name to which this position refers.
1283 ]b4_filename_type
[* filename
;
1284 /// Current line number.
1286 /// Current column number.
1287 unsigned int column
;
1290 /// Add and assign a position.
1291 inline const position
&
1292 operator+= (position
& res
, const int width
)
1294 res
.columns (width
);
1298 /// Add two position objects.
1299 inline const position
1300 operator+ (const position
& begin
, const int width
)
1302 position res
= begin
;
1303 return res
+= width
;
1306 /// Add and assign a position.
1307 inline const position
&
1308 operator-= (position
& res
, const int width
)
1310 return res
+= -width
;
1313 /// Add two position objects.
1314 inline const position
1315 operator- (const position
& begin
, const int width
)
1317 return begin
+ -width
;
1320 /** \brief Intercept output stream redirection.
1321 ** \param ostr the destination output stream
1322 ** \param pos a reference to the position to redirect
1324 inline std::ostream
&
1325 operator<< (std::ostream
& ostr
, const position
& pos
)
1328 ostr
<< *pos
.filename
<< ':';
1329 return ostr
<< pos
.line
<< '.' << pos
.column
;
1333 #endif // not BISON_POSITION_HH]
1335 b4_copyright([Location
class for Bison C
++ parsers
], [2002, 2003, 2004, 2005])[
1338 ** \file location.hh
1339 ** Define the location class.
1342 #ifndef BISON_LOCATION_HH
1343 # define BISON_LOCATION_HH
1345 # include <iostream>
1347 # include "position.hh"
1352 /// Abstract a location.
1355 /** \name Ctor & dtor.
1358 /// Construct a location.
1367 /** \name Line and Column related manipulators
1370 /// Reset initial location to final location.
1376 /// Extend the current location to the COUNT next columns.
1377 inline void columns (unsigned int count
= 1)
1382 /// Extend the current location to the COUNT next lines.
1383 inline void lines (unsigned int count
= 1)
1391 /// Beginning of the located region.
1393 /// End of the located region.
1397 /// Join two location objects to create a location.
1398 inline const location
operator+ (const location
& begin
, const location
& end
)
1400 location res
= begin
;
1405 /// Add two location objects.
1406 inline const location
operator+ (const location
& begin
, unsigned int width
)
1408 location res
= begin
;
1409 res
.columns (width
);
1413 /// Add and assign a location.
1414 inline location
& operator+= (location
& res
, unsigned int width
)
1416 res
.columns (width
);
1420 /** \brief Intercept output stream redirection.
1421 ** \param ostr the destination output stream
1422 ** \param loc a reference to the location to redirect
1424 ** Avoid duplicate information.
1426 inline std::ostream
& operator<< (std::ostream
& ostr
, const location
& loc
)
1428 position last
= loc
.end
- 1;
1431 && (!loc
.begin
.filename
1432 || *loc
.begin
.filename
!= *last
.filename
))
1433 ostr
<< '-' << last
;
1434 else if (loc
.begin
.line
!= last
.line
)
1435 ostr
<< '-' << last
.line
<< '.' << last
.column
;
1436 else if (loc
.begin
.column
!= last
.column
)
1437 ostr
<< '-' << last
.column
;
1443 #endif // not BISON_LOCATION_HH]