]> git.saurik.com Git - bison.git/blame - data/lalr1.cc
(yy::]b4_parser_class_name[::parse): Port
[bison.git] / data / lalr1.cc
CommitLineData
a75c057f 1m4_divert(-1)
b4721715 2
60491a94 3# C++ skeleton for Bison
b4721715
PE
4
5# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
60491a94
AD
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
0fb669f9
PE
19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20# 02110-1301 USA
60491a94 21
66d30cd4
AD
22## ---------------- ##
23## Default values. ##
24## ---------------- ##
25
99880de5
AD
26# Default parser class name.
27m4_define_default([b4_parser_class_name], [parser])
66d30cd4
AD
28
29
30
31## ----------------- ##
32## Semantic Values. ##
33## ----------------- ##
34
35
82b6cb3f
AD
36# b4_lhs_value([TYPE])
37# --------------------
38# Expansion of $<TYPE>$.
39m4_define([b4_lhs_value],
bc82c5a5 40[(yyval[]m4_ifval([$1], [.$1]))])
82b6cb3f
AD
41
42
43# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
44# --------------------------------------
45# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
46# symbols on RHS.
47m4_define([b4_rhs_value],
bc82c5a5 48[(yysemantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3]))])
82b6cb3f 49
99880de5 50m4_define_default([b4_location_type], [location])
9a0d8bec 51m4_define_default([b4_filename_type], [std::string])
82b6cb3f
AD
52
53# b4_lhs_location()
54# -----------------
55# Expansion of @$.
56m4_define([b4_lhs_location],
bc82c5a5 57[(yyloc)])
82b6cb3f
AD
58
59
60# b4_rhs_location(RULE-LENGTH, NUM)
61# ---------------------------------
62# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
63# on RHS.
64m4_define([b4_rhs_location],
bc82c5a5 65[(yylocation_stack_@{m4_eval([$1 - $2])@})])
82b6cb3f
AD
66
67
caf37a36
ADL
68# b4_parse_param_decl
69# -------------------
6dde1c82
AD
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.
caf37a36 74m4_define([b4_parse_param_decl],
6dde1c82 75[m4_ifset([b4_parse_param],
a3cb6248 76 [m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])])
6dde1c82
AD
77
78m4_define([b4_parse_param_decl_1],
79[$1_yyarg])
80
81
caf37a36
ADL
82
83# b4_parse_param_cons
84# -------------------
6dde1c82 85# Extra initialisations of the constructor.
caf37a36
ADL
86m4_define([b4_parse_param_cons],
87 [m4_ifset([b4_parse_param],
88 [,
89 b4_cc_constructor_calls(b4_parse_param)])])
90m4_define([b4_cc_constructor_calls],
91 [m4_map_sep([b4_cc_constructor_call], [,
92 ], [$@])])
93m4_define([b4_cc_constructor_call],
6dde1c82 94 [$2 ($2_yyarg)])
caf37a36
ADL
95
96# b4_parse_param_vars
97# -------------------
6dde1c82 98# Extra instance variables.
caf37a36
ADL
99m4_define([b4_parse_param_vars],
100 [m4_ifset([b4_parse_param],
101 [
102 /* User arguments. */
103b4_cc_var_decls(b4_parse_param)])])
104m4_define([b4_cc_var_decls],
105 [m4_map_sep([b4_cc_var_decl], [
106], [$@])])
107m4_define([b4_cc_var_decl],
108 [ $1;])
109
a5eb1ed2 110
a5eb1ed2 111
b526ee61
AD
112# We do want M4 expansion after # for CPP macros.
113m4_changecom()
98254360 114m4_divert(0)dnl
b61c6978
PE
115m4_if(b4_defines_flag, 0, [],
116[@output @output_header_name@
fb8135fa 117b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
010f91c3 118 [2002, 2003, 2004, 2005])[
c5e3e510
AD
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
2b548aa6 123
8d69a1a3 124#include <string>
717be197 125#include <iostream>
50997c6e 126
4162fa07 127/* Using locations. */
c5e3e510 128#define YYLSP_NEEDED ]b4_locations_flag[
4162fa07 129
d390b02b
AD
130namespace yy
131{
132 class position;
133 class location;
134}
135
c5e3e510 136]b4_token_defines(b4_tokens)[
17acead5 137
0dd1580a 138/* Copy the first part of user declarations. */
c5e3e510 139]b4_pre_prologue[
4162fa07 140
996b1c7e 141]/* Line __line__ of lalr1.cc. */
c5e3e510 142b4_syncline([@oline@], [@ofile@])[
e96c9728 143
9a0d8bec
AD
144#include "stack.hh"
145#include "location.hh"
146
69e2658b
RA
147/* Enabling traces. */
148#ifndef YYDEBUG
c5e3e510 149# define YYDEBUG ]b4_debug[
69e2658b
RA
150#endif
151
152/* Enabling verbose error message. */
153#ifndef YYERROR_VERBOSE
c5e3e510 154# define YYERROR_VERBOSE ]b4_error_verbose[
69e2658b
RA
155#endif
156
be3d9d42 157#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
c5e3e510 158]m4_ifdef([b4_stype],
437c2d80 159[b4_syncline([b4_stype_line], [b4_filename])
be3d9d42 160union YYSTYPE b4_stype;
996b1c7e 161/* Line __line__ of lalr1.cc. */
6ad762a8 162b4_syncline([@oline@], [@ofile@])],
be3d9d42
AD
163[typedef int YYSTYPE;])[
164# define yystype YYSTYPE /* obsolescent; will be withdrawn */
165# define YYSTYPE_IS_DECLARED 1
166# define YYSTYPE_IS_TRIVIAL 1
98254360
RA
167#endif
168
0dd1580a 169/* Copy the second part of user declarations. */
c5e3e510 170]b4_post_prologue[
0dd1580a 171
996b1c7e 172]/* Line __line__ of lalr1.cc. */
c5e3e510 173b4_syncline([@oline@], [@ofile@])[
b4a20338
AD
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). */
3fc16193 177
374f5a14 178#ifndef YYLLOC_DEFAULT
b4a20338
AD
179# define YYLLOC_DEFAULT(Current, Rhs, N) \
180do { \
181 if (N) \
182 { \
183 (Current).begin = (Rhs)[1].begin; \
184 (Current).end = (Rhs)[N].end; \
185 } \
186 else \
187 { \
188 (Current).begin = (Current).end = (Rhs)[0].end; \
189 } \
3fc16193 190} while (0)
374f5a14
RA
191#endif
192
2b548aa6
RA
193namespace yy
194{
c5e3e510 195 class ]b4_parser_class_name[;
3f3eed27 196
f85a5e6f 197 template <typename P>
99880de5 198 struct traits
2b548aa6
RA
199 {
200 };
201
f85a5e6f 202 template <>
99880de5 203 struct traits<]b4_parser_class_name[>
2b548aa6 204 {
99880de5
AD
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;
2b548aa6
RA
210 };
211}
212
2b548aa6
RA
213namespace yy
214{
efeed023 215 /// A Bison parser.
07fed891 216 class ]b4_parser_class_name[
2b548aa6 217 {
617a8f12 218 /// Symbol semantic values.
e019c247 219 typedef traits<]b4_parser_class_name[>::semantic_type semantic_type;
617a8f12 220 /// Symbol locations.
e019c247 221 typedef traits<]b4_parser_class_name[>::location_type location_type;
2b548aa6 222
e019c247 223 public:
efeed023 224 /// Build a parser object.
a3cb6248
AD
225 ]b4_parser_class_name[ (]b4_parse_param_decl[) :
226 yydebug_ (false),
9a1e9989 227 yycdebug_ (&std::cerr)]b4_parse_param_cons[
50997c6e 228 {
50997c6e
RA
229 }
230
c5e3e510 231 virtual ~]b4_parser_class_name[ ()
2b548aa6 232 {
2b548aa6
RA
233 }
234
f69a4142
AD
235 /// Parse.
236 /// \returns 0 iff parsing succeeded.
e019c247 237 virtual int parse ();
2b548aa6 238
f69a4142 239 /// The current debugging stream.
9a1e9989
AD
240 std::ostream& debug_stream () const;
241 /// Set the current debugging stream.
242 void set_debug_stream (std::ostream &);
243
a3cb6248
AD
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);
250
2b548aa6 251 private:
3f3eed27 252
f69a4142 253 /// Call the scanner.
2e1f5829 254 virtual void yylex_ ();
efeed023
AD
255
256 /// Report a syntax error.
257 /// \param loc where the syntax error is found.
258 /// \param msg a description of the syntax error.
99880de5 259 virtual void error (const location_type& loc, const std::string& msg);
efeed023
AD
260
261 /// Generate an error message, and invoke error.
f69a4142 262 virtual void yyreport_syntax_error_ ();
efeed023 263
a5eb1ed2 264#if YYDEBUG
f69a4142
AD
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,
99880de5
AD
270 const semantic_type* yyvaluep,
271 const location_type* yylocationp);
a5eb1ed2
AD
272#endif /* ! YYDEBUG */
273
4bb2bc3f 274
e019c247
AD
275 /// State numbers.
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;
283
f69a4142 284 /// The state stack.
e019c247 285 state_stack_type yystate_stack_;
f69a4142 286 /// The semantic value stack.
e019c247 287 semantic_stack_type yysemantic_stack_;
f69a4142 288 /// The location stack.
e019c247 289 location_stack_type yylocation_stack_;
2b548aa6 290
e019c247
AD
291 /// Internal symbol numbers.
292 typedef traits<]b4_parser_class_name[>::token_number_type token_number_type;
2b548aa6 293 /* Tables. */
efeed023 294 /// For a state, the index in \a yytable_ of its portion.
617a8f12
AD
295 static const ]b4_int_type_for([b4_pact])[ yypact_[];
296 static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
efeed023
AD
297
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.
617a8f12 301 static const ]b4_int_type_for([b4_defact])[ yydefact_[];
efeed023 302
617a8f12
AD
303 static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
304 static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
efeed023
AD
305
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.
617a8f12
AD
311 static const ]b4_int_type_for([b4_table])[ yytable_[];
312 static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
efeed023 313
617a8f12 314 static const ]b4_int_type_for([b4_check])[ yycheck_[];
efeed023
AD
315
316 /// For a state, its accessing symbol.
617a8f12 317 static const ]b4_int_type_for([b4_stos])[ yystos_[];
efeed023
AD
318
319 /// For a rule, its LHS.
617a8f12 320 static const ]b4_int_type_for([b4_r1])[ yyr1_[];
efeed023 321 /// For a rule, its RHS length.
617a8f12 322 static const ]b4_int_type_for([b4_r2])[ yyr2_[];
69e2658b
RA
323
324#if YYDEBUG || YYERROR_VERBOSE
efeed023 325 /// For a symbol, its name in clear.
617a8f12 326 static const char* const yyname_[];
69e2658b 327#endif
2b548aa6 328
69e2658b 329#if YYDEBUG
e019c247
AD
330 /// A type to store symbol numbers and -1.
331 typedef traits<]b4_parser_class_name[>::rhs_number_type rhs_number_type;
617a8f12 332 /// A `-1'-separated list of the rules' RHS.
99880de5 333 static const rhs_number_type yyrhs_[];
617a8f12
AD
334 /// For each rule, the index of the first RHS symbol in \a yyrhs_.
335 static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];
336 /// For each rule, its source line number.
337 static const ]b4_int_type_for([b4_rline])[ yyrline_[];
338 /// For each scanner token number, its symbol number.
339 static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
efeed023
AD
340 /// Report on the debug stream that the rule \a r is going to be reduced.
341 virtual void yyreduce_print_ (int r);
342 /// Print the state stack on the debug stream.
f69a4142 343 virtual void yystack_print_ ();
69e2658b 344#endif
2b548aa6 345
f69a4142 346 /// Convert a scanner token number to a symbol number.
99880de5 347 inline token_number_type yytranslate_ (int token);
f69a4142
AD
348
349 /// \brief Reclaim the memory associated to a symbol.
350 /// \param yymsg Why this token is reclaimed.
351 /// \param yytype The symbol type.
352 /// \param yyvaluep Its semantic value.
353 /// \param yylocationp Its location.
354 inline void yydestruct_ (const char* yymsg,
355 int yytype,
99880de5
AD
356 semantic_type* yyvaluep,
357 location_type* yylocationp);
2b548aa6 358
52d5733f 359 /// Pop \a n symbols the three stacks.
f69a4142 360 inline void yypop_ (unsigned int n = 1);
52d5733f 361
762a801e 362 /* Constants. */
617a8f12 363 static const int yyeof_;
39912f52 364 /* LAST_ -- Last index in TABLE_. */
617a8f12
AD
365 static const int yylast_;
366 static const int yynnts_;
367 static const int yyempty_;
368 static const int yyfinal_;
369 static const int yyterror_;
370 static const int yyerrcode_;
371 static const int yyntokens_;
372 static const unsigned int yyuser_token_number_max_;
99880de5 373 static const token_number_type yyundef_token_;
2b548aa6
RA
374
375 /* State. */
617a8f12
AD
376 int yyn_;
377 int yylen_;
378 int yystate_;
4bb2bc3f 379
a08460b0 380 /* Error handling. */
617a8f12
AD
381 int yynerrs_;
382 int yyerrstatus_;
a08460b0 383
717be197 384 /* Debugging. */
a3cb6248 385 int yydebug_;
9a1e9989 386 std::ostream* yycdebug_;
717be197 387
8dd162d3 388 /* Look-ahead and look-ahead in internal form. */
617a8f12
AD
389 int yylooka_;
390 int yyilooka_;
4bb2bc3f 391
451364ed 392 /// Semantic value of the look-ahead.
99880de5 393 semantic_type yylval;
451364ed 394 /// Location of the look-ahead.
99880de5 395 location_type yylloc;
3fc16193 396 /// The locations where the error started and ended.
99880de5 397 location yyerror_range_[2];
8d69a1a3 398
451364ed 399 /// $$.
99880de5 400 semantic_type yyval;
451364ed 401 /// @@$.
99880de5 402 location_type yyloc;
caf37a36 403]b4_parse_param_vars[
2b548aa6
RA
404 };
405}
406
c5e3e510 407#endif /* ! defined PARSER_HEADER_H */]
b61c6978 408])dnl
6ad762a8 409@output @output_parser_name@
fb8135fa 410b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
010f91c3 411 [2002, 2003, 2004, 2005])
c5b95ccf
AD
412m4_if(b4_prefix[], [yy], [],
413[
414// Take the name prefix into account.
415#define yylex b4_prefix[]lex])
416m4_if(b4_defines_flag, 0, [],
417[
418#include @output_header_name@])[
50997c6e 419
a3cb6248 420/* A pseudo ostream that takes yydebug_ into account. */
9a1e9989 421# define YYCDEBUG \
a3cb6248 422 for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false) \
9a1e9989
AD
423 (*yycdebug_)
424
2b548aa6 425/* Enable debugging if requested. */
50997c6e 426#if YYDEBUG
284acc8b 427
284acc8b
AD
428# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
429do { \
a3cb6248 430 if (yydebug_) \
284acc8b 431 { \
9a1e9989 432 *yycdebug_ << (Title) << ' '; \
f69a4142 433 yysymprint_ ((Type), (Value), (Location)); \
9a1e9989 434 *yycdebug_ << std::endl; \
284acc8b
AD
435 } \
436} while (0)
437
5348bfbe
AD
438# define YY_REDUCE_PRINT(Rule) \
439do { \
a3cb6248 440 if (yydebug_) \
f69a4142 441 yyreduce_print_ (Rule); \
5348bfbe 442} while (0)
284acc8b 443
25f66e1a
AD
444# define YY_STACK_PRINT() \
445do { \
a3cb6248 446 if (yydebug_) \
f69a4142 447 yystack_print_ (); \
25f66e1a 448} while (0)
284acc8b 449
2b548aa6 450#else /* !YYDEBUG */
284acc8b 451
284acc8b 452# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
5348bfbe 453# define YY_REDUCE_PRINT(Rule)
25f66e1a 454# define YY_STACK_PRINT()
284acc8b 455
2b548aa6
RA
456#endif /* !YYDEBUG */
457
60a777aa
AD
458#define YYACCEPT goto yyacceptlab
459#define YYABORT goto yyabortlab
47301314 460#define YYERROR goto yyerrorlab
60a777aa 461
a5eb1ed2 462#if YYDEBUG
a0e68930
AD
463/*--------------------------------.
464| Print this symbol on YYOUTPUT. |
465`--------------------------------*/
466
467void
f69a4142 468yy::]b4_parser_class_name[::yysymprint_ (int yytype,
99880de5 469 const semantic_type* yyvaluep, const location_type* yylocationp)
a0e68930
AD
470{
471 /* Pacify ``unused variable'' warnings. */
472 (void) yyvaluep;
473 (void) yylocationp;
9a1e9989
AD
474 /* Backward compatibility, but should be removed eventually. */
475 std::ostream& cdebug_ = *yycdebug_;
c1f8f16a 476 (void) cdebug_;
a0e68930 477
617a8f12
AD
478 *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
479 << ' ' << yyname_[yytype] << " ("
9a1e9989 480 << *yylocationp << ": ";
a0e68930
AD
481 switch (yytype)
482 {
483]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
484[ default:
485 break;
486 }
9a1e9989 487 *yycdebug_ << ')';
a0e68930 488}
a5eb1ed2 489#endif /* ! YYDEBUG */
a0e68930
AD
490
491void
f69a4142 492yy::]b4_parser_class_name[::yydestruct_ (const char* yymsg,
99880de5 493 int yytype, semantic_type* yyvaluep, location_type* yylocationp)
a0e68930
AD
494{
495 /* Pacify ``unused variable'' warnings. */
895789c6 496 (void) yymsg;
a0e68930
AD
497 (void) yyvaluep;
498 (void) yylocationp;
499
a0e68930
AD
500 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
501
502 switch (yytype)
503 {
504]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
505 default:
506 break;
507 }
508}
60a777aa 509
52d5733f 510void
f69a4142 511yy::]b4_parser_class_name[::yypop_ (unsigned int n)
52d5733f 512{
617a8f12
AD
513 yystate_stack_.pop (n);
514 yysemantic_stack_.pop (n);
515 yylocation_stack_.pop (n);
52d5733f
AD
516}
517
9a1e9989
AD
518std::ostream&
519yy::]b4_parser_class_name[::debug_stream () const
520{
521 return *yycdebug_;
522}
523
524void
525yy::]b4_parser_class_name[::set_debug_stream (std::ostream& o)
526{
527 yycdebug_ = &o;
528}
529
530
a3cb6248
AD
531yy::]b4_parser_class_name[::debug_level_type
532yy::]b4_parser_class_name[::debug_level () const
533{
534 return yydebug_;
535}
536
537void
538yy::]b4_parser_class_name[::set_debug_level (debug_level_type l)
539{
540 yydebug_ = l;
541}
542
543
e019c247 544int
c5e3e510 545yy::]b4_parser_class_name[::parse ()
2b548aa6 546{
ad745863
PE
547 int yyresult_;
548
451364ed
AD
549 YYCDEBUG << "Starting parse" << std::endl;
550
617a8f12
AD
551 yynerrs_ = 0;
552 yyerrstatus_ = 0;
4bb2bc3f 553
451364ed 554 /* Start. */
617a8f12
AD
555 yystate_ = 0;
556 yylooka_ = yyempty_;
451364ed
AD
557
558]m4_ifdef([b4_initial_action], [
99880de5
AD
559m4_pushdef([b4_at_dollar], [yylloc])dnl
560m4_pushdef([b4_dollar_dollar], [yylval])dnl
451364ed
AD
561 /* User initialization code. */
562 b4_initial_action
563m4_popdef([b4_dollar_dollar])dnl
564m4_popdef([b4_at_dollar])dnl
565/* Line __line__ of yacc.c. */
566b4_syncline([@oline@], [@ofile@])])dnl
567
568[ /* Initialize the stacks. The initial state will be pushed in
3ae831b4
AD
569 yynewstate, since the latter expects the semantical and the
570 location values to have been already stored, initialize these
571 stacks with a primary value. */
e019c247
AD
572 yystate_stack_ = state_stack_type (0);
573 yysemantic_stack_ = semantic_stack_type (0);
574 yylocation_stack_ = location_stack_type (0);
99880de5
AD
575 yysemantic_stack_.push (yylval);
576 yylocation_stack_.push (yylloc);
2b548aa6
RA
577
578 /* New state. */
52d5733f 579yynewstate:
617a8f12
AD
580 yystate_stack_.push (yystate_);
581 YYCDEBUG << "Entering state " << yystate_ << std::endl;
50997c6e 582 goto yybackup;
2b548aa6
RA
583
584 /* Backup. */
52d5733f 585yybackup:
2b548aa6 586
8dd162d3 587 /* Try to take a decision without look-ahead. */
617a8f12
AD
588 yyn_ = yypact_[yystate_];
589 if (yyn_ == yypact_ninf_)
2b548aa6
RA
590 goto yydefault;
591
8dd162d3 592 /* Read a look-ahead token. */
617a8f12 593 if (yylooka_ == yyempty_)
2e1f5829 594 yylex_ ();
2b548aa6
RA
595
596 /* Convert token to internal form. */
617a8f12 597 if (yylooka_ <= yyeof_)
2b548aa6 598 {
617a8f12 599 yylooka_ = yyilooka_ = yyeof_;
717be197 600 YYCDEBUG << "Now at end of input." << std::endl;
2b548aa6
RA
601 }
602 else
603 {
617a8f12 604 yyilooka_ = yytranslate_ (yylooka_);
99880de5 605 YY_SYMBOL_PRINT ("Next token is", yyilooka_, &yylval, &yylloc);
2b548aa6
RA
606 }
607
a5eb1ed2 608 /* If the proper action on seeing token ILOOKA_ is to reduce or to
47301314 609 detect an error, take that action. */
617a8f12
AD
610 yyn_ += yyilooka_;
611 if (yyn_ < 0 || yylast_ < yyn_ || yycheck_[yyn_] != yyilooka_)
2b548aa6
RA
612 goto yydefault;
613
614 /* Reduce or error. */
617a8f12
AD
615 yyn_ = yytable_[yyn_];
616 if (yyn_ < 0)
2b548aa6 617 {
617a8f12 618 if (yyn_ == yytable_ninf_)
2b548aa6
RA
619 goto yyerrlab;
620 else
621 {
617a8f12 622 yyn_ = -yyn_;
2b548aa6
RA
623 goto yyreduce;
624 }
625 }
617a8f12 626 else if (yyn_ == 0)
2b548aa6 627 goto yyerrlab;
a75c057f 628
2b548aa6 629 /* Accept? */
617a8f12 630 if (yyn_ == yyfinal_)
2b548aa6
RA
631 goto yyacceptlab;
632
8dd162d3 633 /* Shift the look-ahead token. */
99880de5 634 YY_SYMBOL_PRINT ("Shifting", yyilooka_, &yylval, &yylloc);
2b548aa6
RA
635
636 /* Discard the token being shifted unless it is eof. */
617a8f12
AD
637 if (yylooka_ != yyeof_)
638 yylooka_ = yyempty_;
2b548aa6 639
99880de5
AD
640 yysemantic_stack_.push (yylval);
641 yylocation_stack_.push (yylloc);
8d69a1a3
RA
642
643 /* Count tokens shifted since error; after three, turn off error
644 status. */
617a8f12
AD
645 if (yyerrstatus_)
646 --yyerrstatus_;
8d69a1a3 647
617a8f12 648 yystate_ = yyn_;
2b548aa6
RA
649 goto yynewstate;
650
47301314
AD
651/*-----------------------------------------------------------.
652| yydefault -- do the default action for the current state. |
653`-----------------------------------------------------------*/
52d5733f 654yydefault:
617a8f12
AD
655 yyn_ = yydefact_[yystate_];
656 if (yyn_ == 0)
2b548aa6 657 goto yyerrlab;
50997c6e 658 goto yyreduce;
2b548aa6 659
47301314
AD
660/*-----------------------------.
661| yyreduce -- Do a reduction. |
662`-----------------------------*/
52d5733f 663yyreduce:
617a8f12 664 yylen_ = yyr2_[yyn_];
47301314
AD
665 /* If LEN_ is nonzero, implement the default value of the action:
666 `$$ = $1'. Otherwise, use the top of the stack.
667
668 Otherwise, the following line sets YYVAL to garbage.
669 This behavior is undocumented and Bison
670 users should not rely upon it. */
617a8f12
AD
671 if (yylen_)
672 yyval = yysemantic_stack_[yylen_ - 1];
50997c6e 673 else
617a8f12 674 yyval = yysemantic_stack_[0];
2b548aa6 675
b4a20338 676 {
e019c247 677 slice<location_type, location_stack_type> slice (yylocation_stack_, yylen_);
617a8f12 678 YYLLOC_DEFAULT (yyloc, slice, yylen_);
b4a20338 679 }
617a8f12
AD
680 YY_REDUCE_PRINT (yyn_);
681 switch (yyn_)
45119f04 682 {
c5e3e510 683 ]b4_actions[
95f22ad2 684 default: break;
45119f04 685 }
a75c057f 686
996b1c7e 687]/* Line __line__ of lalr1.cc. */
c5e3e510 688b4_syncline([@oline@], [@ofile@])[
06446ccf 689
617a8f12 690 yypop_ (yylen_);
2b548aa6 691
25f66e1a 692 YY_STACK_PRINT ();
a75c057f 693
617a8f12
AD
694 yysemantic_stack_.push (yyval);
695 yylocation_stack_.push (yyloc);
2b548aa6
RA
696
697 /* Shift the result of the reduction. */
617a8f12
AD
698 yyn_ = yyr1_[yyn_];
699 yystate_ = yypgoto_[yyn_ - yyntokens_] + yystate_stack_[0];
700 if (0 <= yystate_ && yystate_ <= yylast_
701 && yycheck_[yystate_] == yystate_stack_[0])
702 yystate_ = yytable_[yystate_];
2b548aa6 703 else
617a8f12 704 yystate_ = yydefgoto_[yyn_ - yyntokens_];
2b548aa6
RA
705 goto yynewstate;
706
47301314
AD
707/*------------------------------------.
708| yyerrlab -- here on detecting error |
709`------------------------------------*/
284acc8b 710yyerrlab:
4bb2bc3f 711 /* If not already recovering from an error, report this error. */
f69a4142 712 yyreport_syntax_error_ ();
a75c057f 713
99880de5 714 yyerror_range_[0] = yylloc;
617a8f12 715 if (yyerrstatus_ == 3)
762a801e 716 {
8dd162d3 717 /* If just tried and failed to reuse look-ahead token after an
762a801e
RA
718 error, discard it. */
719
720 /* Return failure if at end of input. */
617a8f12 721 if (yylooka_ <= yyeof_)
47301314
AD
722 {
723 /* If at end of input, pop the error token,
724 then the rest of the stack, then return failure. */
617a8f12 725 if (yylooka_ == yyeof_)
47301314
AD
726 for (;;)
727 {
617a8f12 728 yyerror_range_[0] = yylocation_stack_[0];
f69a4142 729 yypop_ ();
617a8f12 730 if (yystate_stack_.height () == 1)
47301314 731 YYABORT;
f69a4142 732 yydestruct_ ("Error: popping",
617a8f12
AD
733 yystos_[yystate_stack_[0]],
734 &yysemantic_stack_[0],
735 &yylocation_stack_[0]);
47301314
AD
736 }
737 }
738 else
739 {
99880de5 740 yydestruct_ ("Error: discarding", yyilooka_, &yylval, &yylloc);
617a8f12 741 yylooka_ = yyempty_;
47301314 742 }
762a801e
RA
743 }
744
8dd162d3 745 /* Else will try to reuse look-ahead token after shifting the error
762a801e 746 token. */
47301314
AD
747 goto yyerrlab1;
748
749
750/*---------------------------------------------------.
751| yyerrorlab -- error raised explicitly by YYERROR. |
752`---------------------------------------------------*/
753yyerrorlab:
754
b4721715
PE
755 /* Pacify compilers like GCC when the user code never invokes
756 YYERROR and the label yyerrorlab therefore never appears in user
757 code. */
758 if (false)
62b6aef9 759 goto yyerrorlab;
62b6aef9 760
617a8f12
AD
761 yyerror_range_[0] = yylocation_stack_[yylen_ - 1];
762 yypop_ (yylen_);
763 yystate_ = yystate_stack_[0];
47301314 764 goto yyerrlab1;
762a801e 765
47301314
AD
766/*-------------------------------------------------------------.
767| yyerrlab1 -- common code for both syntax error and YYERROR. |
768`-------------------------------------------------------------*/
769yyerrlab1:
617a8f12 770 yyerrstatus_ = 3; /* Each real token shifted decrements this. */
762a801e 771
769b430f
AD
772 for (;;)
773 {
617a8f12
AD
774 yyn_ = yypact_[yystate_];
775 if (yyn_ != yypact_ninf_)
769b430f 776 {
617a8f12
AD
777 yyn_ += yyterror_;
778 if (0 <= yyn_ && yyn_ <= yylast_ && yycheck_[yyn_] == yyterror_)
769b430f 779 {
617a8f12
AD
780 yyn_ = yytable_[yyn_];
781 if (0 < yyn_)
769b430f
AD
782 break;
783 }
784 }
785
786 /* Pop the current state because it cannot handle the error token. */
617a8f12 787 if (yystate_stack_.height () == 1)
47301314 788 YYABORT;
762a801e 789
617a8f12 790 yyerror_range_[0] = yylocation_stack_[0];
f69a4142 791 yydestruct_ ("Error: popping",
617a8f12
AD
792 yystos_[yystate_],
793 &yysemantic_stack_[0], &yylocation_stack_[0]);
f69a4142 794 yypop_ ();
617a8f12 795 yystate_ = yystate_stack_[0];
25f66e1a 796 YY_STACK_PRINT ();
762a801e 797 }
762a801e 798
617a8f12 799 if (yyn_ == yyfinal_)
762a801e
RA
800 goto yyacceptlab;
801
99880de5
AD
802 yyerror_range_[1] = yylloc;
803 // Using YYLLOC is tempting, but would change the location of
3fc16193 804 // the look-ahead. YYLOC is available though.
617a8f12 805 YYLLOC_DEFAULT (yyloc, yyerror_range_ - 1, 2);
99880de5 806 yysemantic_stack_.push (yylval);
617a8f12 807 yylocation_stack_.push (yyloc);
762a801e 808
1576d44d 809 /* Shift the error token. */
617a8f12
AD
810 YY_SYMBOL_PRINT ("Shifting", yystos_[yyn_],
811 &yysemantic_stack_[0], &yylocation_stack_[0]);
1576d44d 812
617a8f12 813 yystate_ = yyn_;
762a801e
RA
814 goto yynewstate;
815
2b548aa6 816 /* Accept. */
284acc8b 817yyacceptlab:
ad745863
PE
818 yyresult_ = 0;
819 goto yyreturn;
762a801e
RA
820
821 /* Abort. */
284acc8b 822yyabortlab:
ad745863
PE
823 yyresult_ = 1;
824 goto yyreturn;
825
826yyreturn:
827 if (yylooka_ != yyeof_ && yylooka_ != yyempty_)
828 yydestruct_ ("Error: discarding lookahead", yyilooka_, &yylval, &yylloc);
829 return yyresult_;
2b548aa6
RA
830}
831
69e2658b 832void
2e1f5829 833yy::]b4_parser_class_name[::yylex_ ()
69e2658b 834{
2e1f5829 835 YYCDEBUG << "Reading a token: ";
69e2658b 836#if YYLSP_NEEDED
99880de5 837 yylooka_ = yylex (&yylval, &yylloc);
69e2658b 838#else
99880de5 839 yylooka_ = yylex (&yylval);
69e2658b
RA
840#endif
841}
842
f69a4142 843// Generate an error message, and invoke error.
a08460b0 844void
f69a4142 845yy::]b4_parser_class_name[::yyreport_syntax_error_ ()
a08460b0
AD
846{
847 /* If not already recovering from an error, report this error. */
617a8f12 848 if (!yyerrstatus_)
a08460b0 849 {
617a8f12 850 ++yynerrs_;
efeed023 851 std::string message;
a08460b0 852#if YYERROR_VERBOSE
617a8f12
AD
853 yyn_ = yypact_[yystate_];
854 if (yypact_ninf_ < yyn_ && yyn_ < yylast_)
a08460b0 855 {
fd19f271
AD
856 /* Start YYX at -YYN if negative to avoid negative indexes in
857 YYCHECK. */
858 int yyxbegin = yyn_ < 0 ? -yyn_ : 0;
859
860 /* Stay within bounds of both yycheck and yytname. */
861 int yychecklim = yylast_ - yyn_;
862 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
863 int count = 0;
864 for (int x = yyxbegin; x < yyxend; ++x)
865 if (yycheck_[x + yyn_] == x && x != yyterror_)
866 ++count;
867
a08460b0 868 message = "syntax error, unexpected ";
617a8f12 869 message += yyname_[yyilooka_];
fd19f271
AD
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 message += (!count++) ? ", expecting " : " or ";
877 message += yyname_[x];
878 }
879 }
a08460b0
AD
880 }
881 else
882#endif
883 message = "syntax error";
99880de5 884 error (yylloc, message);
a08460b0
AD
885 }
886}
887
5348bfbe 888
c5e3e510 889/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
2b548aa6 890 STATE-NUM. */
617a8f12 891const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) yy::b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
c5e3e510 892const ]b4_int_type_for([b4_pact])[
617a8f12 893yy::]b4_parser_class_name[::yypact_[] =
2b548aa6 894{
c5e3e510 895 ]b4_pact[
2b548aa6
RA
896};
897
c5e3e510 898/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
2b548aa6
RA
899 doesn't specify something else to do. Zero means the default is an
900 error. */
c5e3e510 901const ]b4_int_type_for([b4_defact])[
617a8f12 902yy::]b4_parser_class_name[::yydefact_[] =
2b548aa6 903{
c5e3e510 904 ]b4_defact[
2b548aa6
RA
905};
906
c5e3e510
AD
907/* YYPGOTO[NTERM-NUM]. */
908const ]b4_int_type_for([b4_pgoto])[
617a8f12 909yy::]b4_parser_class_name[::yypgoto_[] =
2b548aa6 910{
c5e3e510 911 ]b4_pgoto[
2b548aa6
RA
912};
913
c5e3e510
AD
914/* YYDEFGOTO[NTERM-NUM]. */
915const ]b4_int_type_for([b4_defgoto])[
617a8f12 916yy::]b4_parser_class_name[::yydefgoto_[] =
2b548aa6 917{
c5e3e510 918 ]b4_defgoto[
2b548aa6
RA
919};
920
c5e3e510 921/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
2b548aa6
RA
922 positive, shift that token. If negative, reduce the rule which
923 number is the opposite. If zero, do what YYDEFACT says. */
617a8f12 924const ]b4_int_type(b4_table_ninf, b4_table_ninf) yy::b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
c5e3e510 925const ]b4_int_type_for([b4_table])[
617a8f12 926yy::]b4_parser_class_name[::yytable_[] =
2b548aa6 927{
c5e3e510 928 ]b4_table[
2b548aa6
RA
929};
930
931/* YYCHECK. */
c5e3e510 932const ]b4_int_type_for([b4_check])[
617a8f12 933yy::]b4_parser_class_name[::yycheck_[] =
2b548aa6 934{
c5e3e510 935 ]b4_check[
2b548aa6
RA
936};
937
c5e3e510 938/* STOS_[STATE-NUM] -- The (internal number of the) accessing
769b430f 939 symbol of state STATE-NUM. */
c5e3e510 940const ]b4_int_type_for([b4_stos])[
617a8f12 941yy::]b4_parser_class_name[::yystos_[] =
769b430f 942{
c5e3e510 943 ]b4_stos[
769b430f
AD
944};
945
45d5982f 946#if YYDEBUG
617a8f12 947/* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
769b430f 948 to YYLEX-NUM. */
c5e3e510 949const ]b4_int_type_for([b4_toknum])[
617a8f12 950yy::]b4_parser_class_name[::yytoken_number_[] =
769b430f 951{
c5e3e510 952 ]b4_toknum[
769b430f
AD
953};
954#endif
955
c5e3e510
AD
956/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
957const ]b4_int_type_for([b4_r1])[
617a8f12 958yy::]b4_parser_class_name[::yyr1_[] =
2b548aa6 959{
c5e3e510 960 ]b4_r1[
2b548aa6
RA
961};
962
c5e3e510
AD
963/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
964const ]b4_int_type_for([b4_r2])[
617a8f12 965yy::]b4_parser_class_name[::yyr2_[] =
2b548aa6 966{
c5e3e510 967 ]b4_r2[
2b548aa6
RA
968};
969
69e2658b 970#if YYDEBUG || YYERROR_VERBOSE
c5e3e510 971/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
617a8f12 972 First, the terminals, then, starting at \a yyntokens_, nonterminals. */
2b548aa6 973const char*
617a8f12 974const yy::]b4_parser_class_name[::yyname_[] =
2b548aa6 975{
c5e3e510 976 ]b4_tname[
2b548aa6 977};
69e2658b 978#endif
2b548aa6 979
69e2658b 980#if YYDEBUG
2b548aa6 981/* YYRHS -- A `-1'-separated list of the rules' RHS. */
99880de5 982const yy::]b4_parser_class_name[::rhs_number_type
617a8f12 983yy::]b4_parser_class_name[::yyrhs_[] =
2b548aa6 984{
c5e3e510 985 ]b4_rhs[
2b548aa6
RA
986};
987
c5e3e510 988/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
2b548aa6 989 YYRHS. */
c5e3e510 990const ]b4_int_type_for([b4_prhs])[
617a8f12 991yy::]b4_parser_class_name[::yyprhs_[] =
2b548aa6 992{
c5e3e510 993 ]b4_prhs[
2b548aa6
RA
994};
995
617a8f12 996/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
c5e3e510 997const ]b4_int_type_for([b4_rline])[
617a8f12 998yy::]b4_parser_class_name[::yyrline_[] =
69e2658b 999{
c5e3e510 1000 ]b4_rline[
69e2658b 1001};
5348bfbe 1002
617a8f12 1003// Print the state stack on the debug stream.
25f66e1a 1004void
f69a4142 1005yy::]b4_parser_class_name[::yystack_print_ ()
25f66e1a 1006{
9a1e9989 1007 *yycdebug_ << "Stack now";
e019c247 1008 for (state_stack_type::const_iterator i = yystate_stack_.begin ();
617a8f12 1009 i != yystate_stack_.end (); ++i)
9a1e9989
AD
1010 *yycdebug_ << ' ' << *i;
1011 *yycdebug_ << std::endl;
25f66e1a
AD
1012}
1013
617a8f12 1014// Report on the debug stream that the rule \a yyrule is going to be reduced.
5348bfbe 1015void
f69a4142 1016yy::]b4_parser_class_name[::yyreduce_print_ (int yyrule)
5348bfbe 1017{
617a8f12 1018 unsigned int yylno = yyrline_[yyrule];
5348bfbe 1019 /* Print the symbols being reduced, and their result. */
617a8f12 1020 *yycdebug_ << "Reducing stack by rule " << yyn_ - 1
9a1e9989 1021 << " (line " << yylno << "), ";
617a8f12
AD
1022 for (]b4_int_type_for([b4_prhs])[ i = yyprhs_[yyn_];
1023 0 <= yyrhs_[i]; ++i)
1024 *yycdebug_ << yyname_[yyrhs_[i]] << ' ';
1025 *yycdebug_ << "-> " << yyname_[yyr1_[yyn_]] << std::endl;
5348bfbe
AD
1026}
1027#endif // YYDEBUG
69e2658b 1028
2b548aa6 1029/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
99880de5 1030yy::]b4_parser_class_name[::token_number_type
f69a4142 1031yy::]b4_parser_class_name[::yytranslate_ (int token)
2b548aa6 1032{
a75c057f 1033 static
99880de5 1034 const token_number_type
1d4055aa 1035 translate_table[] =
2b548aa6 1036 {
c5e3e510 1037 ]b4_translate[
2b548aa6 1038 };
617a8f12 1039 if ((unsigned int) token <= yyuser_token_number_max_)
1d4055aa 1040 return translate_table[token];
007a50a4 1041 else
617a8f12 1042 return yyundef_token_;
2b548aa6
RA
1043}
1044
617a8f12
AD
1045const int yy::]b4_parser_class_name[::yyeof_ = 0;
1046const int yy::]b4_parser_class_name[::yylast_ = ]b4_last[;
1047const int yy::]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
1048const int yy::]b4_parser_class_name[::yyempty_ = -2;
1049const int yy::]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
1050const int yy::]b4_parser_class_name[::yyterror_ = 1;
1051const int yy::]b4_parser_class_name[::yyerrcode_ = 256;
1052const int yy::]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
1053
1054const unsigned int yy::]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
99880de5 1055const yy::]b4_parser_class_name[::token_number_type yy::]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
2b548aa6 1056
c5e3e510 1057]b4_epilogue
21846f69 1058dnl
6ad762a8 1059@output stack.hh
010f91c3 1060b4_copyright([stack handling for Bison C++ parsers], [2002, 2003, 2004, 2005])[
98254360 1061
2b548aa6
RA
1062#ifndef BISON_STACK_HH
1063# define BISON_STACK_HH
1064
45119f04 1065#include <deque>
2b548aa6
RA
1066
1067namespace yy
1068{
f85a5e6f 1069 template <class T, class S = std::deque<T> >
99880de5 1070 class stack
2b548aa6
RA
1071 {
1072 public:
1073
ecfe33e7
AD
1074 // Hide our reversed order.
1075 typedef typename S::reverse_iterator iterator;
1076 typedef typename S::const_reverse_iterator const_iterator;
2b548aa6 1077
99880de5 1078 stack () : seq_ ()
2b548aa6
RA
1079 {
1080 }
1081
99880de5 1082 stack (unsigned int n) : seq_ (n)
2b548aa6
RA
1083 {
1084 }
1085
1086 inline
1087 T&
779e7ceb 1088 operator [] (unsigned int i)
2b548aa6 1089 {
1d4055aa 1090 return seq_[i];
2b548aa6
RA
1091 }
1092
1093 inline
1094 const T&
779e7ceb 1095 operator [] (unsigned int i) const
2b548aa6 1096 {
1d4055aa 1097 return seq_[i];
2b548aa6
RA
1098 }
1099
1100 inline
1101 void
1102 push (const T& t)
1103 {
45119f04 1104 seq_.push_front (t);
2b548aa6
RA
1105 }
1106
1107 inline
1108 void
779e7ceb 1109 pop (unsigned int n = 1)
2b548aa6
RA
1110 {
1111 for (; n; --n)
45119f04 1112 seq_.pop_front ();
2b548aa6
RA
1113 }
1114
762a801e 1115 inline
779e7ceb 1116 unsigned int
762a801e
RA
1117 height () const
1118 {
1119 return seq_.size ();
1120 }
1121
ecfe33e7
AD
1122 inline const_iterator begin () const { return seq_.rbegin (); }
1123 inline const_iterator end () const { return seq_.rend (); }
2b548aa6
RA
1124
1125 private:
1126
1127 S seq_;
1128 };
374f5a14 1129
e019c247 1130 /// Present a slice of the top of a stack.
99880de5
AD
1131 template <class T, class S = stack<T> >
1132 class slice
374f5a14
RA
1133 {
1134 public:
1135
99880de5 1136 slice (const S& stack,
779e7ceb
PE
1137 unsigned int range) : stack_ (stack),
1138 range_ (range)
374f5a14
RA
1139 {
1140 }
1141
1142 inline
1143 const T&
779e7ceb 1144 operator [] (unsigned int i) const
374f5a14 1145 {
1d4055aa 1146 return stack_[range_ - i];
374f5a14
RA
1147 }
1148
1149 private:
1150
1151 const S& stack_;
779e7ceb 1152 unsigned int range_;
374f5a14 1153 };
2b548aa6
RA
1154}
1155
c5e3e510 1156#endif // not BISON_STACK_HH]
21846f69 1157dnl
5d003116 1158@output position.hh
010f91c3 1159b4_copyright([Position class for Bison C++ parsers], [2002, 2003, 2004, 2005])[
98254360 1160
5d003116
AD
1161/**
1162 ** \file position.hh
99880de5 1163 ** Define the position class.
5d003116
AD
1164 */
1165
1166#ifndef BISON_POSITION_HH
1167# define BISON_POSITION_HH
2b548aa6 1168
7548fed2
AD
1169# include <iostream>
1170# include <string>
1171
2b548aa6
RA
1172namespace yy
1173{
99880de5
AD
1174 /// Abstract a position.
1175 class position
2b548aa6 1176 {
7548fed2 1177 public:
f69a4142 1178 /// Initial column number.
5d003116 1179 static const unsigned int initial_column = 0;
f69a4142 1180 /// Initial line number.
5d003116
AD
1181 static const unsigned int initial_line = 1;
1182
1183 /** \name Ctor & dtor.
1184 ** \{ */
1185 public:
99880de5
AD
1186 /// Construct a position.
1187 position () :
9a0d8bec 1188 filename (0),
5d003116
AD
1189 line (initial_line),
1190 column (initial_column)
1191 {
1192 }
1193 /** \} */
1194
7548fed2 1195
5d003116
AD
1196 /** \name Line and Column related manipulators
1197 ** \{ */
1198 public:
f69a4142 1199 /// (line related) Advance to the COUNT next lines.
2ffbee0e 1200 inline void lines (int count = 1)
5d003116
AD
1201 {
1202 column = initial_column;
2ffbee0e 1203 line += count;
5d003116
AD
1204 }
1205
f69a4142 1206 /// (column related) Advance to the COUNT next columns.
2ffbee0e 1207 inline void columns (int count = 1)
5d003116 1208 {
f939fc12
AD
1209 int leftmost = initial_column;
1210 int current = column;
2ffbee0e
PE
1211 if (leftmost <= current + count)
1212 column += count;
2cdc240e
AD
1213 else
1214 column = initial_column;
5d003116
AD
1215 }
1216 /** \} */
1217
1218 public:
f69a4142 1219 /// File name to which this position refers.
9a0d8bec 1220 ]b4_filename_type[* filename;
f69a4142 1221 /// Current line number.
5d003116 1222 unsigned int line;
f69a4142 1223 /// Current column number.
5d003116 1224 unsigned int column;
2b548aa6
RA
1225 };
1226
99880de5
AD
1227 /// Add and assign a position.
1228 inline const position&
1229 operator+= (position& res, const int width)
5d003116
AD
1230 {
1231 res.columns (width);
1232 return res;
1233 }
1234
99880de5
AD
1235 /// Add two position objects.
1236 inline const position
1237 operator+ (const position& begin, const int width)
5d003116 1238 {
99880de5 1239 position res = begin;
5d003116
AD
1240 return res += width;
1241 }
1242
99880de5
AD
1243 /// Add and assign a position.
1244 inline const position&
1245 operator-= (position& res, const int width)
5d003116
AD
1246 {
1247 return res += -width;
1248 }
1249
99880de5
AD
1250 /// Add two position objects.
1251 inline const position
1252 operator- (const position& begin, const int width)
5d003116
AD
1253 {
1254 return begin + -width;
1255 }
1256
1257 /** \brief Intercept output stream redirection.
1258 ** \param ostr the destination output stream
99880de5 1259 ** \param pos a reference to the position to redirect
5d003116 1260 */
7548fed2 1261 inline std::ostream&
99880de5 1262 operator<< (std::ostream& ostr, const position& pos)
7548fed2 1263 {
9a0d8bec
AD
1264 if (pos.filename)
1265 ostr << *pos.filename << ':';
5d003116 1266 return ostr << pos.line << '.' << pos.column;
7548fed2
AD
1267 }
1268
5d003116
AD
1269}
1270#endif // not BISON_POSITION_HH]
1271@output location.hh
010f91c3 1272b4_copyright([Location class for Bison C++ parsers], [2002, 2003, 2004, 2005])[
7548fed2 1273
5d003116
AD
1274/**
1275 ** \file location.hh
99880de5 1276 ** Define the location class.
5d003116 1277 */
7548fed2 1278
5d003116
AD
1279#ifndef BISON_LOCATION_HH
1280# define BISON_LOCATION_HH
1281
1282# include <iostream>
1283# include <string>
1284# include "position.hh"
1285
1286namespace yy
1287{
1288
99880de5
AD
1289 /// Abstract a location.
1290 class location
2b548aa6 1291 {
5d003116
AD
1292 /** \name Ctor & dtor.
1293 ** \{ */
7548fed2 1294 public:
99880de5 1295 /// Construct a location.
e019c247 1296 location () :
5d003116
AD
1297 begin (),
1298 end ()
1299 {
1300 }
1301 /** \} */
1302
1303
1304 /** \name Line and Column related manipulators
1305 ** \{ */
1306 public:
f69a4142 1307 /// Reset initial location to final location.
e019c247 1308 inline void step ()
5d003116
AD
1309 {
1310 begin = end;
1311 }
1312
f69a4142 1313 /// Extend the current location to the COUNT next columns.
2ffbee0e 1314 inline void columns (unsigned int count = 1)
5d003116 1315 {
2ffbee0e 1316 end += count;
5d003116
AD
1317 }
1318
f69a4142 1319 /// Extend the current location to the COUNT next lines.
2ffbee0e 1320 inline void lines (unsigned int count = 1)
5d003116 1321 {
2ffbee0e 1322 end.lines (count);
5d003116
AD
1323 }
1324 /** \} */
1325
1326
1327 public:
f69a4142 1328 /// Beginning of the located region.
99880de5 1329 position begin;
f69a4142 1330 /// End of the located region.
99880de5 1331 position end;
2b548aa6 1332 };
7548fed2 1333
99880de5
AD
1334 /// Join two location objects to create a location.
1335 inline const location operator+ (const location& begin, const location& end)
5d003116 1336 {
99880de5 1337 location res = begin;
5d003116
AD
1338 res.end = end.end;
1339 return res;
1340 }
1341
99880de5
AD
1342 /// Add two location objects.
1343 inline const location operator+ (const location& begin, unsigned int width)
5d003116 1344 {
99880de5 1345 location res = begin;
5d003116
AD
1346 res.columns (width);
1347 return res;
1348 }
7548fed2 1349
99880de5
AD
1350 /// Add and assign a location.
1351 inline location& operator+= (location& res, unsigned int width)
5d003116
AD
1352 {
1353 res.columns (width);
1354 return res;
1355 }
1356
1357 /** \brief Intercept output stream redirection.
1358 ** \param ostr the destination output stream
99880de5 1359 ** \param loc a reference to the location to redirect
5d003116 1360 **
2cdc240e 1361 ** Avoid duplicate information.
5d003116 1362 */
99880de5 1363 inline std::ostream& operator<< (std::ostream& ostr, const location& loc)
7548fed2 1364 {
99880de5 1365 position last = loc.end - 1;
2cdc240e 1366 ostr << loc.begin;
9a0d8bec
AD
1367 if (last.filename
1368 && (!loc.begin.filename
1369 || *loc.begin.filename != *last.filename))
2cdc240e
AD
1370 ostr << '-' << last;
1371 else if (loc.begin.line != last.line)
1372 ostr << '-' << last.line << '.' << last.column;
1373 else if (loc.begin.column != last.column)
1374 ostr << '-' << last.column;
7548fed2
AD
1375 return ostr;
1376 }
1377
2b548aa6
RA
1378}
1379
c5e3e510 1380#endif // not BISON_LOCATION_HH]