2 # C++ skeleton for Bison
3 # Copyright (C) 2002, 2003 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 # Constructor's extra arguments.
87 m4_define([b4_parse_param_decl],
88 [m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])])
92 # constructor's extra initialisations.
93 m4_define([b4_parse_param_cons
],
94 [m4_ifset([b4_parse_param
],
96 b4_cc_constructor_calls(b4_parse_param
)])])
97 m4_define([b4_cc_constructor_calls
],
98 [m4_map_sep([b4_cc_constructor_call
], [,
100 m4_define([b4_cc_constructor_call
],
103 # b4_parse_param_vars
104 # -------------------
105 # Extra instance variables.
106 m4_define([b4_parse_param_vars
],
107 [m4_ifset([b4_parse_param
],
109 /* User arguments. */
110 b4_cc_var_decls(b4_parse_param
)])])
111 m4_define([b4_cc_var_decls
],
112 [m4_map_sep([b4_cc_var_decl
], [
114 m4_define([b4_cc_var_decl
],
117 # We do want M4 expansion after # for CPP macros.
120 m4_if(b4_defines_flag
, 0, [],
121 [@output @output_header_name@
122 b4_copyright([C
++ Skeleton parser
for LALR(1) parsing with Bison
],
124 /* FIXME: This is wrong, we want computed header guards.
125 I don't know why the macros are missing now. :( */
126 #ifndef PARSER_HEADER_H
127 # define PARSER_HEADER_H
130 #include "location.hh"
135 /* Using locations. */
136 #define YYLSP_NEEDED ]b4_locations_flag[
138 ]b4_token_defines(b4_tokens
)[
140 /* Copy the first part of user declarations. */
143 ]/* Line __line__ of lalr1.cc. */
144 b4_syncline([@oline@
], [@ofile@
])[
146 /* Enabling traces. */
148 # define YYDEBUG ]b4_debug[
151 /* Enabling verbose error message. */
152 #ifndef YYERROR_VERBOSE
153 # define YYERROR_VERBOSE ]b4_error_verbose[
157 ]m4_ifdef([b4_stype
],
158 [b4_syncline([b4_stype_line
], [b4_filename
])
159 typedef union b4_stype yystype
;
160 /* Line __line__ of lalr1.cc. */
161 b4_syncline([@oline@
], [@ofile@
])],
162 [typedef int yystype
;])[
163 # define YYSTYPE yystype
166 /* Copy the second part of user declarations. */
169 ]/* Line __line__ of lalr1.cc. */
170 b4_syncline([@oline@
], [@ofile@
])[
171 #ifndef YYLLOC_DEFAULT
172 # define YYLLOC_DEFAULT(Current, Rhs, N) \
173 ((Current).end = Rhs[N].end)
178 class ]b4_parser_class_name
[;
180 template < typename P
>
186 struct Traits
< ]b4_parser_class_name
[ >
188 typedef ]b4_int_type_for([b4_translate
])[ TokenNumberType
;
189 typedef ]b4_int_type_for([b4_rhs
])[ RhsNumberType
;
190 typedef int StateType
;
191 typedef yystype SemanticType
;
192 typedef ]b4_location_type
[ LocationType
;
198 class ]b4_parser_class_name b4_inherit
[
202 typedef Traits
< ]b4_parser_class_name
[ >::TokenNumberType TokenNumberType
;
203 typedef Traits
< ]b4_parser_class_name
[ >::RhsNumberType RhsNumberType
;
204 typedef Traits
< ]b4_parser_class_name
[ >::StateType StateType
;
205 typedef Traits
< ]b4_parser_class_name
[ >::SemanticType SemanticType
;
206 typedef Traits
< ]b4_parser_class_name
[ >::LocationType LocationType
;
208 typedef Stack
< StateType
> StateStack
;
209 typedef Stack
< SemanticType
> SemanticStack
;
210 typedef Stack
< LocationType
> LocationStack
;
213 ]b4_parser_class_name
[ (bool debug
,
214 LocationType initlocation
][]b4_param
[]b4_parse_param_decl
[) :
215 ]b4_constructor
[][debug_ (debug
),
217 initlocation_ (initlocation
)]b4_parse_param_cons
[
219 ]b4_parser_class_name
[ (bool debug
][]b4_param
[]b4_parse_param_decl
[) :
220 ]b4_constructor
[][debug_ (debug
),
221 cdebug_ (std::cerr
)]b4_parse_param_cons
[
226 virtual ~]b4_parser_class_name
[ ()
230 virtual int parse ();
234 virtual void lex_ ();
235 virtual void error_ ();
236 virtual void print_ ();
239 StateStack state_stack_
;
240 SemanticStack semantic_stack_
;
241 LocationStack location_stack_
;
244 static const ]b4_int_type_for([b4_pact
])[ pact_
[];
245 static const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
)[ pact_ninf_
;
246 static const ]b4_int_type_for([b4_defact
])[ defact_
[];
247 static const ]b4_int_type_for([b4_pgoto
])[ pgoto_
[];
248 static const ]b4_int_type_for([b4_defgoto
])[ defgoto_
[];
249 static const ]b4_int_type_for([b4_table
])[ table_
[];
250 static const ]b4_int_type(b4_table_ninf
, b4_table_ninf
)[ table_ninf_
;
251 static const ]b4_int_type_for([b4_check
])[ check_
[];
252 static const ]b4_int_type_for([b4_r1
])[ r1_
[];
253 static const ]b4_int_type_for([b4_r2
])[ r2_
[];
255 #if YYDEBUG || YYERROR_VERBOSE
256 static const char* const name_
[];
259 /* More tables, for debugging. */
261 static const RhsNumberType rhs_
[];
262 static const ]b4_int_type_for([b4_prhs
])[ prhs_
[];
263 static const ]b4_int_type_for([b4_rline
])[ rline_
[];
264 static const ]b4_int_type_for([b4_stos
])[ stos_
[];
265 static const ]b4_int_type_for([b4_toknum
])[ token_number_
[];
266 virtual void reduce_print_ (int yyrule
);
267 virtual void stack_print_ ();
270 /* Even more tables. */
271 static inline TokenNumberType
translate_ (int token
);
274 static const int eof_
;
275 /* LAST_ -- Last index in TABLE_. */
276 static const int last_
;
277 static const int nnts_
;
278 static const int empty_
;
279 static const int final_
;
280 static const int terror_
;
281 static const int errcode_
;
282 static const int ntokens_
;
283 static const unsigned user_token_number_max_
;
284 static const TokenNumberType undef_token_
;
293 std::ostream
&cdebug_
;
295 /* Lookahead and lookahead in internal form. */
302 /* Semantic value and location of lookahead token. */
304 LocationType location
;
310 /* Initial location. */
311 LocationType initlocation_
;
312 ]b4_parse_param_vars
[
316 #endif /* ! defined PARSER_HEADER_H */]
318 @output @output_parser_name@
319 b4_copyright([C
++ Skeleton parser
for LALR(1) parsing with Bison
],
322 m4_if(b4_defines_flag
, 0, [], [#include @output_header_name@])[
324 /* Enable debugging if requested. */
326 # define YYCDEBUG if (debug_) cdebug_
327 # define YY_REDUCE_PRINT(Rule) \
330 reduce_print_ (Rule); \
332 # define YY_STACK_PRINT() \
338 # define YYCDEBUG if (0) cdebug_
339 # define YY_REDUCE_PRINT(Rule)
340 # define YY_STACK_PRINT()
341 #endif /* !YYDEBUG */
343 #define YYACCEPT goto yyacceptlab
344 #define YYABORT goto yyabortlab
345 #define YYERROR goto yyerrorlab
349 yy::]b4_parser_class_name
[::parse ()
354 /* Initialize the stacks. The initial state will be pushed in
355 yynewstate, since the latter expects the semantical and the
356 location values to have been already stored, initialize these
357 stacks with a primary value. */
358 state_stack_
= StateStack (0);
359 semantic_stack_
= SemanticStack (1);
360 location_stack_
= LocationStack (1);
366 location
= initlocation_
;
368 YYCDEBUG
<< "Starting parse" << std::endl
;
372 state_stack_
.push (state_
);
373 YYCDEBUG
<< "Entering state " << state_
<< std::endl
;
379 /* Try to take a decision without lookahead. */
381 if (n_
== pact_ninf_
)
384 /* Read a lookahead token. */
385 if (looka_
== empty_
)
387 YYCDEBUG
<< "Reading a token: ";
391 /* Convert token to internal form. */
396 YYCDEBUG
<< "Now at end of input." << std::endl
;
400 ilooka_
= translate_ (looka_
);
404 YYCDEBUG
<< "Next token is " << looka_
405 << " (" << name_
[ilooka_
];
407 YYCDEBUG
<< ')' << std::endl
;
412 /* If the proper action on seeing token YYTOKEN is to reduce or to
413 detect an error, take that action. */
415 if (n_
< 0 || last_
< n_
|| check_
[n_
] != ilooka_
)
418 /* Reduce or error. */
422 if (n_
== table_ninf_
)
437 /* Shift the lookahead token. */
439 YYCDEBUG
<< "Shifting token " << looka_
440 << " (" << name_
[ilooka_
] << "), ";
443 /* Discard the token being shifted unless it is eof. */
447 semantic_stack_
.push (value
);
448 location_stack_
.push (location
);
450 /* Count tokens shifted since error; after three, turn off error
458 /*-----------------------------------------------------------.
459 | yydefault -- do the default action for the current state. |
460 `-----------------------------------------------------------*/
462 n_
= defact_
[state_
];
467 /*-----------------------------.
468 | yyreduce -- Do a reduction. |
469 `-----------------------------*/
472 /* If LEN_ is nonzero, implement the default value of the action:
473 `$$ = $1'. Otherwise, use the top of the stack.
475 Otherwise, the following line sets YYVAL to garbage.
476 This behavior is undocumented and Bison
477 users should not rely upon it. */
480 yyval
= semantic_stack_
[len_
- 1];
481 yyloc
= location_stack_
[len_
- 1];
485 yyval
= semantic_stack_
[0];
486 yyloc
= location_stack_
[0];
491 Slice
< LocationType
, LocationStack
> slice (location_stack_
, len_
);
492 YYLLOC_DEFAULT (yyloc
, slice
, len_
);
494 YY_REDUCE_PRINT (n_
);
500 ]/* Line __line__ of lalr1.cc. */
501 b4_syncline([@oline@
], [@ofile@
])[
503 state_stack_
.pop (len_
);
504 semantic_stack_
.pop (len_
);
505 location_stack_
.pop (len_
);
509 semantic_stack_
.push (yyval
);
510 location_stack_
.push (yyloc
);
512 /* Shift the result of the reduction. */
514 state_
= pgoto_
[n_
- ntokens_
] + state_stack_
[0];
515 if (0 <= state_
&& state_
<= last_
&& check_
[state_
] == state_stack_
[0])
516 state_
= table_
[state_
];
518 state_
= defgoto_
[n_
- ntokens_
];
521 /*------------------------------------.
522 | yyerrlab -- here on detecting error |
523 `------------------------------------*/
525 /* If not already recovering from an error, report this error. */
532 if (pact_ninf_
< n_
&& n_
< last_
)
534 message
= "syntax error, unexpected ";
535 message
+= name_
[ilooka_
];
538 /* Start YYX at -YYN if negative to avoid negative indexes in
540 int xbegin
= n_
< 0 ? -n_
: 0;
541 /* Stay within bounds of both yycheck and yytname. */
542 int checklim
= last_
- n_
;
543 int xend
= checklim
< ntokens_
? checklim
: ntokens_
;
544 for (int x
= xbegin
; x
< xend
; ++x
)
545 if (check_
[x
+ n_
] == x
&& x
!= terror_
)
550 for (int x1
= xbegin
; x1
< xend
; ++x1
)
551 if (check_
[x1
+ n_
] == x1
&& x1
!= terror_
)
553 message
+= (!count
++) ? ", expecting " : " or ";
554 message
+= name_
[x1
];
561 message
= "syntax error";
567 /* If just tried and failed to reuse lookahead token after an
568 error, discard it. */
570 /* Return failure if at end of input. */
573 /* If at end of input, pop the error token,
574 then the rest of the stack, then return failure. */
579 semantic_stack_
.pop ();
580 location_stack_
.pop ();
581 if (state_stack_
.height () == 1)
583 // YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
584 // FIXME: yydestruct (yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[);
590 YYCDEBUG
<< "Discarding token " << looka_
591 << " (" << name_
[ilooka_
] << ")." << std::endl
;
592 // yydestruct (yytoken, &yylval]b4_location_if([, &yylloc])[);
598 /* Else will try to reuse lookahead token after shifting the error
603 /*---------------------------------------------------.
604 | yyerrorlab -- error raised explicitly by YYERROR. |
605 `---------------------------------------------------*/
608 state_stack_
.pop (len_
);
609 semantic_stack_
.pop (len_
);
610 location_stack_
.pop (len_
);
611 state_
= state_stack_
[0];
614 /*-------------------------------------------------------------.
615 | yyerrlab1 -- common code for both syntax error and YYERROR. |
616 `-------------------------------------------------------------*/
618 errstatus
= 3; /* Each real token shifted decrements this. */
623 if (n_
!= pact_ninf_
)
626 if (0 <= n_
&& n_
<= last_
&& check_
[n_
] == terror_
)
634 /* Pop the current state because it cannot handle the error token. */
635 if (state_stack_
.height () == 1)
641 if (stos_
[state_
] < ntokens_
)
643 YYCDEBUG
<< "Error: popping token "
644 << token_number_
[stos_
[state_
]]
645 << " (" << name_
[stos_
[state_
]];
647 YYPRINT (stderr
, token_number_
[stos_
[state_
]],
648 semantic_stack_
.top ());
650 YYCDEBUG
<< ')' << std::endl
;
654 YYCDEBUG
<< "Error: popping nonterminal ("
655 << name_
[stos_
[state_
]] << ')' << std::endl
;
661 semantic_stack_
.pop ();
662 location_stack_
.pop ();
663 state_
= state_stack_
[0];
670 YYCDEBUG
<< "Shifting error token, ";
672 semantic_stack_
.push (value
);
673 location_stack_
.push (location
);
688 yy::]b4_parser_class_name
[::lex_ ()
691 looka_
= yylex (&value
, &location
);
693 looka_
= yylex (&value
);
698 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
700 const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
) yy::b4_parser_class_name::pact_ninf_
= b4_pact_ninf
[;
701 const ]b4_int_type_for([b4_pact
])[
702 yy::]b4_parser_class_name
[::pact_
[] =
707 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
708 doesn't specify something else to do. Zero means the default is an
710 const ]b4_int_type_for([b4_defact
])[
711 yy::]b4_parser_class_name
[::defact_
[] =
716 /* YYPGOTO[NTERM-NUM]. */
717 const ]b4_int_type_for([b4_pgoto
])[
718 yy::]b4_parser_class_name
[::pgoto_
[] =
723 /* YYDEFGOTO[NTERM-NUM]. */
724 const ]b4_int_type_for([b4_defgoto
])[
725 yy::]b4_parser_class_name
[::defgoto_
[] =
730 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
731 positive, shift that token. If negative, reduce the rule which
732 number is the opposite. If zero, do what YYDEFACT says. */
733 const ]b4_int_type(b4_table_ninf
, b4_table_ninf
) yy::b4_parser_class_name::table_ninf_
= b4_table_ninf
[;
734 const ]b4_int_type_for([b4_table
])[
735 yy::]b4_parser_class_name
[::table_
[] =
741 const ]b4_int_type_for([b4_check
])[
742 yy::]b4_parser_class_name
[::check_
[] =
748 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
749 symbol of state STATE-NUM. */
750 const ]b4_int_type_for([b4_stos
])[
751 yy::]b4_parser_class_name
[::stos_
[] =
756 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal token number corresponding
758 const ]b4_int_type_for([b4_toknum
])[
759 yy::]b4_parser_class_name
[::token_number_
[] =
765 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
766 const ]b4_int_type_for([b4_r1
])[
767 yy::]b4_parser_class_name
[::r1_
[] =
772 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
773 const ]b4_int_type_for([b4_r2
])[
774 yy::]b4_parser_class_name
[::r2_
[] =
779 #if YYDEBUG || YYERROR_VERBOSE
780 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
781 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
783 const yy::]b4_parser_class_name
[::name_
[] =
790 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
791 const yy::]b4_parser_class_name
[::RhsNumberType
792 yy::]b4_parser_class_name
[::rhs_
[] =
797 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
799 const ]b4_int_type_for([b4_prhs
])[
800 yy::]b4_parser_class_name
[::prhs_
[] =
805 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
806 const ]b4_int_type_for([b4_rline
])[
807 yy::]b4_parser_class_name
[::rline_
[] =
812 /** Print the state stack from its BOTTOM up to its TOP (included). */
815 yy::]b4_parser_class_name
[::stack_print_ ()
817 cdebug_
<< "state stack now";
818 for (StateStack::ConstIterator i
= state_stack_
.begin ();
819 i
!= state_stack_
.end (); ++i
)
820 cdebug_
<< ' ' << *i
;
821 cdebug_
<< std::endl
;
824 /** Report that the YYRULE is going to be reduced. */
827 yy::]b4_parser_class_name
[::reduce_print_ (int yyrule
)
829 unsigned int yylno
= rline_
[yyrule
];
830 /* Print the symbols being reduced, and their result. */
831 cdebug_
<< "Reducing via rule " << n_
- 1 << " (line " << yylno
<< "), ";
832 for (]b4_int_type_for([b4_prhs
])[ i
= prhs_
[n_
];
834 cdebug_
<< name_
[rhs_
[i
]] << ' ';
835 cdebug_
<< "-> " << name_
[r1_
[n_
]] << std::endl
;
839 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
840 yy::]b4_parser_class_name
[::TokenNumberType
841 yy::]b4_parser_class_name
[::translate_ (int token
)
844 const TokenNumberType
849 if ((unsigned) token
<= user_token_number_max_
)
850 return translate_table
[token
];
855 const int yy::]b4_parser_class_name
[::eof_
= 0;
856 const int yy::]b4_parser_class_name
[::last_
= ]b4_last
[;
857 const int yy::]b4_parser_class_name
[::nnts_
= ]b4_nterms_number
[;
858 const int yy::]b4_parser_class_name
[::empty_
= -2;
859 const int yy::]b4_parser_class_name
[::final_
= ]b4_final_state_number
[;
860 const int yy::]b4_parser_class_name
[::terror_
= 1;
861 const int yy::]b4_parser_class_name
[::errcode_
= 256;
862 const int yy::]b4_parser_class_name
[::ntokens_
= ]b4_tokens_number
[;
864 const unsigned yy::]b4_parser_class_name
[::user_token_number_max_
= ]b4_user_token_number_max
[;
865 const yy::]b4_parser_class_name
[::TokenNumberType
yy::]b4_parser_class_name
[::undef_token_
= ]b4_undef_token_number
[;
870 b4_copyright([Stack handling
for Bison C
++ parsers
], [2002, 2003])[
872 #ifndef BISON_STACK_HH
873 # define BISON_STACK_HH
879 template < class T
, class S
= std::deque
< T
> >
884 typedef typename
S::iterator Iterator
;
885 typedef typename
S::const_iterator ConstIterator
;
891 Stack (unsigned n
) : seq_ (n
)
897 operator [] (unsigned i
)
904 operator [] (unsigned i
) const
931 inline ConstIterator
begin () const { return seq_
.begin (); }
932 inline ConstIterator
end () const { return seq_
.end (); }
939 template < class T
, class S
= Stack
< T
> >
944 Slice (const S
& stack
,
945 unsigned range
) : stack_ (stack
),
952 operator [] (unsigned i
) const
954 return stack_
[range_
- i
];
964 #endif // not BISON_STACK_HH]
967 b4_copyright([Position
class for Bison C
++ parsers
], [2002, 2003])[
971 ** Define the Location class.
974 #ifndef BISON_POSITION_HH
975 # define BISON_POSITION_HH
982 /** \brief Abstract a Position. */
986 /** \brief Initial column number. */
987 static const unsigned int initial_column
= 0;
988 /** \brief Initial line number. */
989 static const unsigned int initial_line
= 1;
991 /** \name Ctor & dtor.
994 /** \brief Construct a Position. */
998 column (initial_column
)
1004 /** \name Line and Column related manipulators
1007 /** \brief (line related) Advance to the COUNT next lines. */
1008 inline void lines (int count
= 1)
1010 column
= initial_column
;
1014 /** \brief (column related) Advance to the COUNT next columns. */
1015 inline void columns (int count
= 1)
1017 int leftmost
= initial_column
;
1018 int current
= column
;
1019 if (leftmost
<= current
+ count
)
1022 column
= initial_column
;
1027 /** \brief File name to which this position refers. */
1028 std::string filename
;
1029 /** \brief Current line number. */
1031 /** \brief Current column number. */
1032 unsigned int column
;
1035 /** \brief Add and assign a Position. */
1036 inline const Position
&
1037 operator+= (Position
& res
, const int width
)
1039 res
.columns (width
);
1043 /** \brief Add two Position objects. */
1044 inline const Position
1045 operator+ (const Position
& begin
, const int width
)
1047 Position res
= begin
;
1048 return res
+= width
;
1051 /** \brief Add and assign a Position. */
1052 inline const Position
&
1053 operator-= (Position
& res
, const int width
)
1055 return res
+= -width
;
1058 /** \brief Add two Position objects. */
1059 inline const Position
1060 operator- (const Position
& begin
, const int width
)
1062 return begin
+ -width
;
1065 /** \brief Intercept output stream redirection.
1066 ** \param ostr the destination output stream
1067 ** \param pos a reference to the Position to redirect
1069 inline std::ostream
&
1070 operator<< (std::ostream
& ostr
, const Position
& pos
)
1072 if (!pos
.filename
.empty ())
1073 ostr
<< pos
.filename
<< ':';
1074 return ostr
<< pos
.line
<< '.' << pos
.column
;
1078 #endif // not BISON_POSITION_HH]
1080 b4_copyright([Location
class for Bison C
++ parsers
], [2002, 2003])[
1083 ** \file location.hh
1084 ** Define the Location class.
1087 #ifndef BISON_LOCATION_HH
1088 # define BISON_LOCATION_HH
1090 # include <iostream>
1092 # include "position.hh"
1097 /** \brief Abstract a Location. */
1100 /** \name Ctor & dtor.
1103 /** \brief Construct a Location. */
1112 /** \name Line and Column related manipulators
1115 /** \brief Reset initial location to final location. */
1116 inline void step (void)
1121 /** \brief Extend the current location to the COUNT next columns. */
1122 inline void columns (unsigned int count
= 1)
1127 /** \brief Extend the current location to the COUNT next lines. */
1128 inline void lines (unsigned int count
= 1)
1136 /** \brief Beginning of the located region. */
1138 /** \brief End of the located region. */
1142 /** \brief Join two Location objects to create a Location. */
1143 inline const Location
operator+ (const Location
& begin
, const Location
& end
)
1145 Location res
= begin
;
1150 /** \brief Add two Location objects */
1151 inline const Location
operator+ (const Location
& begin
, unsigned width
)
1153 Location res
= begin
;
1154 res
.columns (width
);
1158 /** \brief Add and assign a Location */
1159 inline Location
&operator+= (Location
& res
, unsigned width
)
1161 res
.columns (width
);
1165 /** \brief Intercept output stream redirection.
1166 ** \param ostr the destination output stream
1167 ** \param loc a reference to the Location to redirect
1169 ** Avoid duplicate information.
1171 inline std::ostream
& operator<< (std::ostream
& ostr
, const Location
& loc
)
1173 Position last
= loc
.end
- 1;
1175 if (loc
.begin
.filename
!= last
.filename
)
1176 ostr
<< '-' << last
;
1177 else if (loc
.begin
.line
!= last
.line
)
1178 ostr
<< '-' << last
.line
<< '.' << last
.column
;
1179 else if (loc
.begin
.column
!= last
.column
)
1180 ostr
<< '-' << last
.column
;
1186 #endif // not BISON_LOCATION_HH]