2 # C++ skeleton for Bison
3 # Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 ## ---------------- ##
22 ## ---------------- ##
24 # Default Parser class name.
25 m4_define_default([b4_parser_class_name
], [Parser
])
29 ## ----------------- ##
30 ## Semantic Values. ##
31 ## ----------------- ##
34 # b4_lhs_value([TYPE])
35 # --------------------
36 # Expansion of $<TYPE>$.
37 m4_define([b4_lhs_value
],
38 [yyval
[]m4_ifval([$
1], [.$
1])])
41 # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
42 # --------------------------------------
43 # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
45 m4_define([b4_rhs_value
],
46 [semantic_stack_@
{m4_eval([$
1 - $
2])@
}m4_ifval([$
3], [.$
3])])
48 m4_define_default([b4_location_type
], [Location
])
53 m4_define([b4_lhs_location
],
57 # b4_rhs_location(RULE-LENGTH, NUM)
58 # ---------------------------------
59 # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
61 m4_define([b4_rhs_location
],
62 [location_stack_@
{m4_eval([$
1 - $
2])@
}])
65 m4_define([b4_inherit
],
77 m4_define([b4_constructor
],
86 # Extra formal arguments of the constructor.
87 # Change the parameter names from "foo" into "foo_yyarg", so that
88 # there is no collision bw the user chosen attribute name, and the
89 # argument name in the constructor.
90 m4_define([b4_parse_param_decl
],
91 [m4_ifset([b4_parse_param
],
92 [, m4_map_sep([b4_parse_param_decl_1
], [, ], [b4_parse_param
])])])
94 m4_define([b4_parse_param_decl_1
],
100 # -------------------
101 # Extra initialisations of the constructor.
102 m4_define([b4_parse_param_cons
],
103 [m4_ifset([b4_parse_param
],
105 b4_cc_constructor_calls(b4_parse_param
)])])
106 m4_define([b4_cc_constructor_calls
],
107 [m4_map_sep([b4_cc_constructor_call
], [,
109 m4_define([b4_cc_constructor_call
],
112 # b4_parse_param_vars
113 # -------------------
114 # Extra instance variables.
115 m4_define([b4_parse_param_vars
],
116 [m4_ifset([b4_parse_param
],
118 /* User arguments. */
119 b4_cc_var_decls(b4_parse_param
)])])
120 m4_define([b4_cc_var_decls
],
121 [m4_map_sep([b4_cc_var_decl
], [
123 m4_define([b4_cc_var_decl
],
128 # We do want M4 expansion after # for CPP macros.
131 m4_if(b4_defines_flag
, 0, [],
132 [@output @output_header_name@
133 b4_copyright([C
++ Skeleton parser
for LALR(1) parsing with Bison
],
135 /* FIXME: This is wrong, we want computed header guards.
136 I don't know why the macros are missing now. :( */
137 #ifndef PARSER_HEADER_H
138 # define PARSER_HEADER_H
141 #include "location.hh"
146 /* Using locations. */
147 #define YYLSP_NEEDED ]b4_locations_flag[
149 ]b4_token_defines(b4_tokens
)[
151 /* Copy the first part of user declarations. */
154 ]/* Line __line__ of lalr1.cc. */
155 b4_syncline([@oline@
], [@ofile@
])[
157 /* Enabling traces. */
159 # define YYDEBUG ]b4_debug[
162 /* Enabling verbose error message. */
163 #ifndef YYERROR_VERBOSE
164 # define YYERROR_VERBOSE ]b4_error_verbose[
167 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
168 ]m4_ifdef([b4_stype
],
169 [b4_syncline([b4_stype_line
], [b4_filename
])
170 union YYSTYPE b4_stype
;
171 /* Line __line__ of lalr1.cc. */
172 b4_syncline([@oline@
], [@ofile@
])],
173 [typedef int YYSTYPE
;])[
174 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
175 # define YYSTYPE_IS_DECLARED 1
176 # define YYSTYPE_IS_TRIVIAL 1
179 /* Copy the second part of user declarations. */
182 ]/* Line __line__ of lalr1.cc. */
183 b4_syncline([@oline@
], [@ofile@
])[
184 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
185 If N is 0, then set CURRENT to the empty location which ends
186 the previous symbol: RHS[0] (always defined). */
188 #ifndef YYLLOC_DEFAULT
189 # define YYLLOC_DEFAULT(Current, Rhs, N) \
193 (Current).begin = (Rhs)[1].begin; \
194 (Current).end = (Rhs)[N].end; \
198 (Current).begin = (Current).end = (Rhs)[0].end; \
205 class ]b4_parser_class_name
[;
207 template <typename P
>
213 struct Traits
<]b4_parser_class_name
[>
215 typedef ]b4_int_type_for([b4_translate
])[ TokenNumberType
;
216 typedef ]b4_int_type_for([b4_rhs
])[ RhsNumberType
;
217 typedef int StateType
;
218 typedef YYSTYPE SemanticType
;
219 typedef ]b4_location_type
[ LocationType
;
225 class ]b4_parser_class_name b4_inherit
[
229 typedef Traits
<]b4_parser_class_name
[>::TokenNumberType TokenNumberType
;
230 typedef Traits
<]b4_parser_class_name
[>::RhsNumberType RhsNumberType
;
231 typedef Traits
<]b4_parser_class_name
[>::StateType StateType
;
232 typedef Traits
<]b4_parser_class_name
[>::SemanticType SemanticType
;
233 typedef Traits
<]b4_parser_class_name
[>::LocationType LocationType
;
235 typedef Stack
<StateType
> StateStack
;
236 typedef Stack
<SemanticType
> SemanticStack
;
237 typedef Stack
<LocationType
> LocationStack
;
239 ]b4_parser_class_name
[ (bool debug
][]b4_param
[]b4_parse_param_decl
[) :
240 ]b4_constructor
[][debug_ (debug
),
241 yycdebug_ (&std::cerr
)]b4_parse_param_cons
[
245 ]b4_parser_class_name
[ (bool debug
,
246 LocationType
][]b4_param
[]b4_parse_param_decl
[) :
247 ]b4_constructor
[][debug_ (debug
),
248 yycdebug_ (&std::cerr
)]b4_parse_param_cons
[
250 *yycdebug_
<< __FILE__
<< ':' << __LINE__
251 << ": this constructor is provided by backward compatibility"
252 << ", but will be removed in the near future."
256 virtual ~]b4_parser_class_name
[ ()
260 virtual int parse ();
262 /// Return the current debugging stream.
263 std::ostream
& debug_stream () const;
264 /// Set the current debugging stream.
265 void set_debug_stream (std::ostream
&);
269 virtual void lex_ ();
270 virtual void error_ ();
271 virtual void report_syntax_error_ ();
273 virtual void symprint_ (int yytype
,
274 const SemanticType
* yyvaluep
,
275 const LocationType
* yylocationp
);
276 #endif /* ! YYDEBUG */
280 StateStack state_stack_
;
281 SemanticStack semantic_stack_
;
282 LocationStack location_stack_
;
285 static const ]b4_int_type_for([b4_pact
])[ pact_
[];
286 static const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
)[ pact_ninf_
;
287 static const ]b4_int_type_for([b4_defact
])[ defact_
[];
288 static const ]b4_int_type_for([b4_pgoto
])[ pgoto_
[];
289 static const ]b4_int_type_for([b4_defgoto
])[ defgoto_
[];
290 static const ]b4_int_type_for([b4_table
])[ table_
[];
291 static const ]b4_int_type(b4_table_ninf
, b4_table_ninf
)[ table_ninf_
;
292 static const ]b4_int_type_for([b4_check
])[ check_
[];
293 static const ]b4_int_type_for([b4_stos
])[ stos_
[];
294 static const ]b4_int_type_for([b4_r1
])[ r1_
[];
295 static const ]b4_int_type_for([b4_r2
])[ r2_
[];
297 #if YYDEBUG || YYERROR_VERBOSE
298 static const char* const name_
[];
301 /* More tables, for debugging. */
303 static const RhsNumberType rhs_
[];
304 static const ]b4_int_type_for([b4_prhs
])[ prhs_
[];
305 static const ]b4_int_type_for([b4_rline
])[ rline_
[];
306 static const ]b4_int_type_for([b4_toknum
])[ token_number_
[];
307 virtual void reduce_print_ (int yyrule
);
308 virtual void stack_print_ ();
311 /* Even more tables. */
312 inline TokenNumberType
translate_ (int token
);
313 inline void destruct_ (const char* yymsg
,
315 SemanticType
* yyvaluep
, LocationType
* yylocationp
);
317 /// Pop \a n symbols the three stacks.
318 inline void pop (unsigned int n
= 1);
321 static const int eof_
;
322 /* LAST_ -- Last index in TABLE_. */
323 static const int last_
;
324 static const int nnts_
;
325 static const int empty_
;
326 static const int final_
;
327 static const int terror_
;
328 static const int errcode_
;
329 static const int ntokens_
;
330 static const unsigned int user_token_number_max_
;
331 static const TokenNumberType undef_token_
;
338 /* Error handling. */
344 std::ostream
* yycdebug_
;
346 /* Look-ahead and look-ahead in internal form. */
353 /// Semantic value of the look-ahead.
355 /// Location of the look-ahead.
356 LocationType location
;
357 /// The locations where the error started and ended.
358 Location error_range_
[2];
364 ]b4_parse_param_vars
[
368 #endif /* ! defined PARSER_HEADER_H */]
370 @output @output_parser_name@
371 b4_copyright([C
++ Skeleton parser
for LALR(1) parsing with Bison
],
374 m4_if(b4_defines_flag
, 0, [], [#include @output_header_name@])[
376 /* A pseudo ostream that takes debug_ into account. */
378 for (bool yydebugcond_ = debug_; yydebugcond_; yydebugcond_ = false) \
381 /* Enable debugging if requested. */
384 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
388 *yycdebug_ << (Title) << ' '; \
389 symprint_ ((Type), (Value), (Location)); \
390 *yycdebug_ << std::endl; \
394 # define YY_REDUCE_PRINT(Rule) \
397 reduce_print_ (Rule); \
400 # define YY_STACK_PRINT() \
408 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
409 # define YY_REDUCE_PRINT(Rule)
410 # define YY_STACK_PRINT()
412 #endif /* !YYDEBUG */
414 #define YYACCEPT goto yyacceptlab
415 #define YYABORT goto yyabortlab
416 #define YYERROR goto yyerrorlab
419 /*--------------------------------.
420 | Print this symbol on YYOUTPUT. |
421 `--------------------------------*/
424 yy::]b4_parser_class_name
[::symprint_ (int yytype
,
425 const SemanticType
* yyvaluep
, const LocationType
* yylocationp
)
427 /* Pacify ``unused variable'' warnings. */
430 /* Backward compatibility, but should be removed eventually. */
431 std::ostream
& cdebug_
= *yycdebug_
;
434 *yycdebug_
<< (yytype
< ntokens_
? "token" : "nterm")
435 << ' ' << name_
[yytype
] << " ("
436 << *yylocationp
<< ": ";
439 ]m4_map([b4_symbol_actions
], m4_defn([b4_symbol_printers
]))dnl
445 #endif /* ! YYDEBUG */
448 yy::]b4_parser_class_name
[::destruct_ (const char* yymsg
,
449 int yytype
, SemanticType
* yyvaluep
, LocationType
* yylocationp
)
451 /* Pacify ``unused variable'' warnings. */
455 YY_SYMBOL_PRINT (yymsg
, yytype
, yyvaluep
, yylocationp
);
459 ]m4_map([b4_symbol_actions
], m4_defn([b4_symbol_destructors
]))[
466 yy::]b4_parser_class_name
[::pop (unsigned int n
)
468 state_stack_
.pop (n
);
469 semantic_stack_
.pop (n
);
470 location_stack_
.pop (n
);
474 yy::]b4_parser_class_name
[::debug_stream () const
480 yy::]b4_parser_class_name
[::set_debug_stream (std::ostream
& o
)
487 yy::]b4_parser_class_name
[::parse ()
489 YYCDEBUG
<< "Starting parse" << std::endl
;
498 ]m4_ifdef([b4_initial_action
], [
499 m4_pushdef([b4_at_dollar
], [location
])dnl
500 m4_pushdef([b4_dollar_dollar
], [value
])dnl
501 /* User initialization code. */
503 m4_popdef([b4_dollar_dollar
])dnl
504 m4_popdef([b4_at_dollar
])dnl
505 /* Line __line__ of yacc.c. */
506 b4_syncline([@oline@
], [@ofile@
])])dnl
508 [ /* Initialize the stacks. The initial state will be pushed in
509 yynewstate, since the latter expects the semantical and the
510 location values to have been already stored, initialize these
511 stacks with a primary value. */
512 state_stack_
= StateStack (0);
513 semantic_stack_
= SemanticStack (0);
514 location_stack_
= LocationStack (0);
515 semantic_stack_
.push (value
);
516 location_stack_
.push (location
);
520 state_stack_
.push (state_
);
521 YYCDEBUG
<< "Entering state " << state_
<< std::endl
;
527 /* Try to take a decision without look-ahead. */
529 if (n_
== pact_ninf_
)
532 /* Read a look-ahead token. */
533 if (looka_
== empty_
)
535 YYCDEBUG
<< "Reading a token: ";
539 /* Convert token to internal form. */
542 looka_
= ilooka_
= eof_
;
543 YYCDEBUG
<< "Now at end of input." << std::endl
;
547 ilooka_
= translate_ (looka_
);
548 YY_SYMBOL_PRINT ("Next token is", ilooka_
, &value
, &location
);
551 /* If the proper action on seeing token ILOOKA_ is to reduce or to
552 detect an error, take that action. */
554 if (n_
< 0 || last_
< n_
|| check_
[n_
] != ilooka_
)
557 /* Reduce or error. */
561 if (n_
== table_ninf_
)
576 /* Shift the look-ahead token. */
577 YY_SYMBOL_PRINT ("Shifting", ilooka_
, &value
, &location
);
579 /* Discard the token being shifted unless it is eof. */
583 semantic_stack_
.push (value
);
584 location_stack_
.push (location
);
586 /* Count tokens shifted since error; after three, turn off error
594 /*-----------------------------------------------------------.
595 | yydefault -- do the default action for the current state. |
596 `-----------------------------------------------------------*/
598 n_
= defact_
[state_
];
603 /*-----------------------------.
604 | yyreduce -- Do a reduction. |
605 `-----------------------------*/
608 /* If LEN_ is nonzero, implement the default value of the action:
609 `$$ = $1'. Otherwise, use the top of the stack.
611 Otherwise, the following line sets YYVAL to garbage.
612 This behavior is undocumented and Bison
613 users should not rely upon it. */
615 yyval
= semantic_stack_
[len_
- 1];
617 yyval
= semantic_stack_
[0];
620 Slice
<LocationType
, LocationStack
> slice (location_stack_
, len_
);
621 YYLLOC_DEFAULT (yyloc
, slice
, len_
);
623 YY_REDUCE_PRINT (n_
);
629 ]/* Line __line__ of lalr1.cc. */
630 b4_syncline([@oline@
], [@ofile@
])[
636 semantic_stack_
.push (yyval
);
637 location_stack_
.push (yyloc
);
639 /* Shift the result of the reduction. */
641 state_
= pgoto_
[n_
- ntokens_
] + state_stack_
[0];
642 if (0 <= state_
&& state_
<= last_
&& check_
[state_
] == state_stack_
[0])
643 state_
= table_
[state_
];
645 state_
= defgoto_
[n_
- ntokens_
];
648 /*------------------------------------.
649 | yyerrlab -- here on detecting error |
650 `------------------------------------*/
652 /* If not already recovering from an error, report this error. */
653 report_syntax_error_ ();
655 error_range_
[0] = location
;
658 /* If just tried and failed to reuse look-ahead token after an
659 error, discard it. */
661 /* Return failure if at end of input. */
664 /* If at end of input, pop the error token,
665 then the rest of the stack, then return failure. */
669 error_range_
[0] = location_stack_
[0];
671 if (state_stack_
.height () == 1)
673 destruct_ ("Error: popping",
674 stos_
[state_stack_
[0]],
676 &location_stack_
[0]);
681 destruct_ ("Error: discarding", ilooka_
, &value
, &location
);
686 /* Else will try to reuse look-ahead token after shifting the error
691 /*---------------------------------------------------.
692 | yyerrorlab -- error raised explicitly by YYERROR. |
693 `---------------------------------------------------*/
697 /* Pacify GCC when the user code never invokes YYERROR and the label
698 yyerrorlab therefore never appears in user code. */
703 error_range_
[0] = location_stack_
[len_
- 1];
705 state_
= state_stack_
[0];
708 /*-------------------------------------------------------------.
709 | yyerrlab1 -- common code for both syntax error and YYERROR. |
710 `-------------------------------------------------------------*/
712 errstatus_
= 3; /* Each real token shifted decrements this. */
717 if (n_
!= pact_ninf_
)
720 if (0 <= n_
&& n_
<= last_
&& check_
[n_
] == terror_
)
728 /* Pop the current state because it cannot handle the error token. */
729 if (state_stack_
.height () == 1)
732 error_range_
[0] = location_stack_
[0];
733 destruct_ ("Error: popping",
734 stos_
[state_
], &semantic_stack_
[0], &location_stack_
[0]);
736 state_
= state_stack_
[0];
743 error_range_
[1] = location
;
744 // Using LOCATION is tempting, but would change the location of
745 // the look-ahead. YYLOC is available though.
746 YYLLOC_DEFAULT (yyloc
, error_range_
- 1, 2);
747 semantic_stack_
.push (value
);
748 location_stack_
.push (yyloc
);
750 /* Shift the error token. */
751 YY_SYMBOL_PRINT ("Shifting", stos_
[n_
],
752 &semantic_stack_
[0], &location_stack_
[0]);
763 /* Free the lookahead. */
764 destruct_ ("Error: discarding lookahead", ilooka_
, &value
, &location
);
770 yy::]b4_parser_class_name
[::lex_ ()
773 looka_
= yylex (&value
, &location
);
775 looka_
= yylex (&value
);
779 /** Generate an error message, and invoke yyerror. */
781 yy::]b4_parser_class_name
[::report_syntax_error_ ()
783 /* If not already recovering from an error, report this error. */
790 if (pact_ninf_
< n_
&& n_
< last_
)
792 message
= "syntax error, unexpected ";
793 message
+= name_
[ilooka_
];
796 for (int x
= (n_
< 0 ? -n_
: 0); x
< ntokens_
+ nnts_
; ++x
)
797 if (check_
[x
+ n_
] == x
&& x
!= terror_
)
802 for (int x
= (n_
< 0 ? -n_
: 0); x
< ntokens_
+ nnts_
; ++x
)
803 if (check_
[x
+ n_
] == x
&& x
!= terror_
)
805 message
+= (!count
++) ? ", expecting " : " or ";
813 message
= "syntax error";
819 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
821 const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
) yy::b4_parser_class_name::pact_ninf_
= b4_pact_ninf
[;
822 const ]b4_int_type_for([b4_pact
])[
823 yy::]b4_parser_class_name
[::pact_
[] =
828 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
829 doesn't specify something else to do. Zero means the default is an
831 const ]b4_int_type_for([b4_defact
])[
832 yy::]b4_parser_class_name
[::defact_
[] =
837 /* YYPGOTO[NTERM-NUM]. */
838 const ]b4_int_type_for([b4_pgoto
])[
839 yy::]b4_parser_class_name
[::pgoto_
[] =
844 /* YYDEFGOTO[NTERM-NUM]. */
845 const ]b4_int_type_for([b4_defgoto
])[
846 yy::]b4_parser_class_name
[::defgoto_
[] =
851 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
852 positive, shift that token. If negative, reduce the rule which
853 number is the opposite. If zero, do what YYDEFACT says. */
854 const ]b4_int_type(b4_table_ninf
, b4_table_ninf
) yy::b4_parser_class_name::table_ninf_
= b4_table_ninf
[;
855 const ]b4_int_type_for([b4_table
])[
856 yy::]b4_parser_class_name
[::table_
[] =
862 const ]b4_int_type_for([b4_check
])[
863 yy::]b4_parser_class_name
[::check_
[] =
868 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
869 symbol of state STATE-NUM. */
870 const ]b4_int_type_for([b4_stos
])[
871 yy::]b4_parser_class_name
[::stos_
[] =
877 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal token number corresponding
879 const ]b4_int_type_for([b4_toknum
])[
880 yy::]b4_parser_class_name
[::token_number_
[] =
886 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
887 const ]b4_int_type_for([b4_r1
])[
888 yy::]b4_parser_class_name
[::r1_
[] =
893 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
894 const ]b4_int_type_for([b4_r2
])[
895 yy::]b4_parser_class_name
[::r2_
[] =
900 #if YYDEBUG || YYERROR_VERBOSE
901 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
902 First, the terminals, then, starting at NTOKENS_, nonterminals. */
904 const yy::]b4_parser_class_name
[::name_
[] =
911 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
912 const yy::]b4_parser_class_name
[::RhsNumberType
913 yy::]b4_parser_class_name
[::rhs_
[] =
918 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
920 const ]b4_int_type_for([b4_prhs
])[
921 yy::]b4_parser_class_name
[::prhs_
[] =
926 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
927 const ]b4_int_type_for([b4_rline
])[
928 yy::]b4_parser_class_name
[::rline_
[] =
933 /** Print the state stack from its BOTTOM up to its TOP (included). */
936 yy::]b4_parser_class_name
[::stack_print_ ()
938 *yycdebug_
<< "Stack now";
939 for (StateStack::const_iterator i
= state_stack_
.begin ();
940 i
!= state_stack_
.end (); ++i
)
941 *yycdebug_
<< ' ' << *i
;
942 *yycdebug_
<< std::endl
;
945 /** Report that the YYRULE is going to be reduced. */
948 yy::]b4_parser_class_name
[::reduce_print_ (int yyrule
)
950 unsigned int yylno
= rline_
[yyrule
];
951 /* Print the symbols being reduced, and their result. */
952 *yycdebug_
<< "Reducing stack by rule " << n_
- 1
953 << " (line " << yylno
<< "), ";
954 for (]b4_int_type_for([b4_prhs
])[ i
= prhs_
[n_
];
956 *yycdebug_
<< name_
[rhs_
[i
]] << ' ';
957 *yycdebug_
<< "-> " << name_
[r1_
[n_
]] << std::endl
;
961 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
962 yy::]b4_parser_class_name
[::TokenNumberType
963 yy::]b4_parser_class_name
[::translate_ (int token
)
966 const TokenNumberType
971 if ((unsigned int) token
<= user_token_number_max_
)
972 return translate_table
[token
];
977 const int yy::]b4_parser_class_name
[::eof_
= 0;
978 const int yy::]b4_parser_class_name
[::last_
= ]b4_last
[;
979 const int yy::]b4_parser_class_name
[::nnts_
= ]b4_nterms_number
[;
980 const int yy::]b4_parser_class_name
[::empty_
= -2;
981 const int yy::]b4_parser_class_name
[::final_
= ]b4_final_state_number
[;
982 const int yy::]b4_parser_class_name
[::terror_
= 1;
983 const int yy::]b4_parser_class_name
[::errcode_
= 256;
984 const int yy::]b4_parser_class_name
[::ntokens_
= ]b4_tokens_number
[;
986 const unsigned int yy::]b4_parser_class_name
[::user_token_number_max_
= ]b4_user_token_number_max
[;
987 const yy::]b4_parser_class_name
[::TokenNumberType
yy::]b4_parser_class_name
[::undef_token_
= ]b4_undef_token_number
[;
992 b4_copyright([Stack handling
for Bison C
++ parsers
], [2002, 2003, 2004])[
994 #ifndef BISON_STACK_HH
995 # define BISON_STACK_HH
1001 template <class T
, class S
= std::deque
<T
> >
1006 // Hide our reversed order.
1007 typedef typename
S::reverse_iterator iterator
;
1008 typedef typename
S::const_reverse_iterator const_iterator
;
1014 Stack (unsigned int n
) : seq_ (n
)
1020 operator [] (unsigned int i
)
1027 operator [] (unsigned int i
) const
1036 seq_
.push_front (t
);
1041 pop (unsigned int n
= 1)
1051 return seq_
.size ();
1054 inline const_iterator
begin () const { return seq_
.rbegin (); }
1055 inline const_iterator
end () const { return seq_
.rend (); }
1062 template <class T
, class S
= Stack
<T
> >
1067 Slice (const S
& stack
,
1068 unsigned int range
) : stack_ (stack
),
1075 operator [] (unsigned int i
) const
1077 return stack_
[range_
- i
];
1083 unsigned int range_
;
1087 #endif // not BISON_STACK_HH]
1090 b4_copyright([Position
class for Bison C
++ parsers
], [2002, 2003, 2004])[
1093 ** \file position.hh
1094 ** Define the Location class.
1097 #ifndef BISON_POSITION_HH
1098 # define BISON_POSITION_HH
1100 # include <iostream>
1105 /** \brief Abstract a Position. */
1109 /** \brief Initial column number. */
1110 static const unsigned int initial_column
= 0;
1111 /** \brief Initial line number. */
1112 static const unsigned int initial_line
= 1;
1114 /** \name Ctor & dtor.
1117 /** \brief Construct a Position. */
1120 line (initial_line
),
1121 column (initial_column
)
1127 /** \name Line and Column related manipulators
1130 /** \brief (line related) Advance to the COUNT next lines. */
1131 inline void lines (int count
= 1)
1133 column
= initial_column
;
1137 /** \brief (column related) Advance to the COUNT next columns. */
1138 inline void columns (int count
= 1)
1140 int leftmost
= initial_column
;
1141 int current
= column
;
1142 if (leftmost
<= current
+ count
)
1145 column
= initial_column
;
1150 /** \brief File name to which this position refers. */
1151 std::string filename
;
1152 /** \brief Current line number. */
1154 /** \brief Current column number. */
1155 unsigned int column
;
1158 /** \brief Add and assign a Position. */
1159 inline const Position
&
1160 operator+= (Position
& res
, const int width
)
1162 res
.columns (width
);
1166 /** \brief Add two Position objects. */
1167 inline const Position
1168 operator+ (const Position
& begin
, const int width
)
1170 Position res
= begin
;
1171 return res
+= width
;
1174 /** \brief Add and assign a Position. */
1175 inline const Position
&
1176 operator-= (Position
& res
, const int width
)
1178 return res
+= -width
;
1181 /** \brief Add two Position objects. */
1182 inline const Position
1183 operator- (const Position
& begin
, const int width
)
1185 return begin
+ -width
;
1188 /** \brief Intercept output stream redirection.
1189 ** \param ostr the destination output stream
1190 ** \param pos a reference to the Position to redirect
1192 inline std::ostream
&
1193 operator<< (std::ostream
& ostr
, const Position
& pos
)
1195 if (!pos
.filename
.empty ())
1196 ostr
<< pos
.filename
<< ':';
1197 return ostr
<< pos
.line
<< '.' << pos
.column
;
1201 #endif // not BISON_POSITION_HH]
1203 b4_copyright([Location
class for Bison C
++ parsers
], [2002, 2003, 2004])[
1206 ** \file location.hh
1207 ** Define the Location class.
1210 #ifndef BISON_LOCATION_HH
1211 # define BISON_LOCATION_HH
1213 # include <iostream>
1215 # include "position.hh"
1220 /** \brief Abstract a Location. */
1223 /** \name Ctor & dtor.
1226 /** \brief Construct a Location. */
1235 /** \name Line and Column related manipulators
1238 /** \brief Reset initial location to final location. */
1239 inline void step (void)
1244 /** \brief Extend the current location to the COUNT next columns. */
1245 inline void columns (unsigned int count
= 1)
1250 /** \brief Extend the current location to the COUNT next lines. */
1251 inline void lines (unsigned int count
= 1)
1259 /** \brief Beginning of the located region. */
1261 /** \brief End of the located region. */
1265 /** \brief Join two Location objects to create a Location. */
1266 inline const Location
operator+ (const Location
& begin
, const Location
& end
)
1268 Location res
= begin
;
1273 /** \brief Add two Location objects */
1274 inline const Location
operator+ (const Location
& begin
, unsigned int width
)
1276 Location res
= begin
;
1277 res
.columns (width
);
1281 /** \brief Add and assign a Location */
1282 inline Location
& operator+= (Location
& res
, unsigned int width
)
1284 res
.columns (width
);
1288 /** \brief Intercept output stream redirection.
1289 ** \param ostr the destination output stream
1290 ** \param loc a reference to the Location to redirect
1292 ** Avoid duplicate information.
1294 inline std::ostream
& operator<< (std::ostream
& ostr
, const Location
& loc
)
1296 Position last
= loc
.end
- 1;
1298 if (loc
.begin
.filename
!= last
.filename
)
1299 ostr
<< '-' << last
;
1300 else if (loc
.begin
.line
!= last
.line
)
1301 ostr
<< '-' << last
.line
<< '.' << last
.column
;
1302 else if (loc
.begin
.column
!= last
.column
)
1303 ostr
<< '-' << last
.column
;
1309 #endif // not BISON_LOCATION_HH]