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
);
269 /* Even more tables. */
270 static inline TokenNumberType
translate_ (int token
);
273 static const int eof_
;
274 /* LAST_ -- Last index in TABLE_. */
275 static const int last_
;
276 static const int nnts_
;
277 static const int empty_
;
278 static const int final_
;
279 static const int terror_
;
280 static const int errcode_
;
281 static const int ntokens_
;
282 static const unsigned user_token_number_max_
;
283 static const TokenNumberType undef_token_
;
292 std::ostream
&cdebug_
;
294 /* Lookahead and lookahead in internal form. */
301 /* Semantic value and location of lookahead token. */
303 LocationType location
;
309 /* Initial location. */
310 LocationType initlocation_
;
311 ]b4_parse_param_vars
[
315 #endif /* ! defined PARSER_HEADER_H */]
317 @output @output_parser_name@
318 b4_copyright([C
++ Skeleton parser
for LALR(1) parsing with Bison
],
321 m4_if(b4_defines_flag
, 0, [], [#include @output_header_name@])[
323 /* Enable debugging if requested. */
325 # define YYCDEBUG if (debug_) cdebug_
326 # define YY_REDUCE_PRINT(Rule) \
329 reduce_print_ (Rule); \
332 # define YYCDEBUG if (0) cdebug_
333 # define YY_REDUCE_PRINT(Rule)
334 #endif /* !YYDEBUG */
336 #define YYACCEPT goto yyacceptlab
337 #define YYABORT goto yyabortlab
338 #define YYERROR goto yyerrorlab
342 yy::]b4_parser_class_name
[::parse ()
347 /* Initialize the stacks. The initial state will be pushed in
348 yynewstate, since the latter expects the semantical and the
349 location values to have been already stored, initialize these
350 stacks with a primary value. */
351 state_stack_
= StateStack (0);
352 semantic_stack_
= SemanticStack (1);
353 location_stack_
= LocationStack (1);
359 location
= initlocation_
;
361 YYCDEBUG
<< "Starting parse" << std::endl
;
365 state_stack_
.push (state_
);
366 YYCDEBUG
<< "Entering state " << state_
<< std::endl
;
372 /* Try to take a decision without lookahead. */
374 if (n_
== pact_ninf_
)
377 /* Read a lookahead token. */
378 if (looka_
== empty_
)
380 YYCDEBUG
<< "Reading a token: ";
384 /* Convert token to internal form. */
389 YYCDEBUG
<< "Now at end of input." << std::endl
;
393 ilooka_
= translate_ (looka_
);
397 YYCDEBUG
<< "Next token is " << looka_
398 << " (" << name_
[ilooka_
];
400 YYCDEBUG
<< ')' << std::endl
;
405 /* If the proper action on seeing token YYTOKEN is to reduce or to
406 detect an error, take that action. */
408 if (n_
< 0 || last_
< n_
|| check_
[n_
] != ilooka_
)
411 /* Reduce or error. */
415 if (n_
== table_ninf_
)
430 /* Shift the lookahead token. */
432 YYCDEBUG
<< "Shifting token " << looka_
433 << " (" << name_
[ilooka_
] << "), ";
436 /* Discard the token being shifted unless it is eof. */
440 semantic_stack_
.push (value
);
441 location_stack_
.push (location
);
443 /* Count tokens shifted since error; after three, turn off error
451 /*-----------------------------------------------------------.
452 | yydefault -- do the default action for the current state. |
453 `-----------------------------------------------------------*/
455 n_
= defact_
[state_
];
460 /*-----------------------------.
461 | yyreduce -- Do a reduction. |
462 `-----------------------------*/
465 /* If LEN_ is nonzero, implement the default value of the action:
466 `$$ = $1'. Otherwise, use the top of the stack.
468 Otherwise, the following line sets YYVAL to garbage.
469 This behavior is undocumented and Bison
470 users should not rely upon it. */
473 yyval
= semantic_stack_
[len_
- 1];
474 yyloc
= location_stack_
[len_
- 1];
478 yyval
= semantic_stack_
[0];
479 yyloc
= location_stack_
[0];
484 Slice
< LocationType
, LocationStack
> slice (location_stack_
, len_
);
485 YYLLOC_DEFAULT (yyloc
, slice
, len_
);
487 YY_REDUCE_PRINT (n_
);
493 ]/* Line __line__ of lalr1.cc. */
494 b4_syncline([@oline@
], [@ofile@
])[
496 state_stack_
.pop (len_
);
497 semantic_stack_
.pop (len_
);
498 location_stack_
.pop (len_
);
503 YYCDEBUG
<< "state stack now";
504 for (StateStack::ConstIterator i
= state_stack_
.begin ();
505 i
!= state_stack_
.end (); ++i
)
506 YYCDEBUG
<< ' ' << *i
;
507 YYCDEBUG
<< std::endl
;
511 semantic_stack_
.push (yyval
);
512 location_stack_
.push (yyloc
);
514 /* Shift the result of the reduction. */
516 state_
= pgoto_
[n_
- ntokens_
] + state_stack_
[0];
517 if (0 <= state_
&& state_
<= last_
&& check_
[state_
] == state_stack_
[0])
518 state_
= table_
[state_
];
520 state_
= defgoto_
[n_
- ntokens_
];
523 /*------------------------------------.
524 | yyerrlab -- here on detecting error |
525 `------------------------------------*/
527 /* If not already recovering from an error, report this error. */
534 if (pact_ninf_
< n_
&& n_
< last_
)
536 message
= "syntax error, unexpected ";
537 message
+= name_
[ilooka_
];
540 /* Start YYX at -YYN if negative to avoid negative indexes in
542 int xbegin
= n_
< 0 ? -n_
: 0;
543 /* Stay within bounds of both yycheck and yytname. */
544 int checklim
= last_
- n_
;
545 int xend
= checklim
< ntokens_
? checklim
: ntokens_
;
546 for (int x
= xbegin
; x
< xend
; ++x
)
547 if (check_
[x
+ n_
] == x
&& x
!= terror_
)
552 for (int x1
= xbegin
; x1
< xend
; ++x1
)
553 if (check_
[x1
+ n_
] == x1
&& x1
!= terror_
)
555 message
+= (!count
++) ? ", expecting " : " or ";
556 message
+= name_
[x1
];
563 message
= "syntax error";
569 /* If just tried and failed to reuse lookahead token after an
570 error, discard it. */
572 /* Return failure if at end of input. */
575 /* If at end of input, pop the error token,
576 then the rest of the stack, then return failure. */
581 semantic_stack_
.pop ();
582 location_stack_
.pop ();
583 if (state_stack_
.height () == 1)
585 // YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
586 // FIXME: yydestruct (yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[);
592 YYCDEBUG
<< "Discarding token " << looka_
593 << " (" << name_
[ilooka_
] << ")." << std::endl
;
594 // yydestruct (yytoken, &yylval]b4_location_if([, &yylloc])[);
600 /* Else will try to reuse lookahead token after shifting the error
605 /*---------------------------------------------------.
606 | yyerrorlab -- error raised explicitly by YYERROR. |
607 `---------------------------------------------------*/
610 state_stack_
.pop (len_
);
611 semantic_stack_
.pop (len_
);
612 location_stack_
.pop (len_
);
613 state_
= state_stack_
[0];
616 /*-------------------------------------------------------------.
617 | yyerrlab1 -- common code for both syntax error and YYERROR. |
618 `-------------------------------------------------------------*/
620 errstatus
= 3; /* Each real token shifted decrements this. */
625 if (n_
!= pact_ninf_
)
628 if (0 <= n_
&& n_
<= last_
&& check_
[n_
] == terror_
)
636 /* Pop the current state because it cannot handle the error token. */
637 if (state_stack_
.height () == 1)
643 if (stos_
[state_
] < ntokens_
)
645 YYCDEBUG
<< "Error: popping token "
646 << token_number_
[stos_
[state_
]]
647 << " (" << name_
[stos_
[state_
]];
649 YYPRINT (stderr
, token_number_
[stos_
[state_
]],
650 semantic_stack_
.top ());
652 YYCDEBUG
<< ')' << std::endl
;
656 YYCDEBUG
<< "Error: popping nonterminal ("
657 << name_
[stos_
[state_
]] << ')' << std::endl
;
663 semantic_stack_
.pop ();
664 location_stack_
.pop ();
665 state_
= state_stack_
[0];
670 YYCDEBUG
<< "Error: state stack now";
671 for (StateStack::ConstIterator i
= state_stack_
.begin ();
672 i
!= state_stack_
.end (); ++i
)
673 YYCDEBUG
<< ' ' << *i
;
674 YYCDEBUG
<< std::endl
;
682 YYCDEBUG
<< "Shifting error token, ";
684 semantic_stack_
.push (value
);
685 location_stack_
.push (location
);
700 yy::]b4_parser_class_name
[::lex_ ()
703 looka_
= yylex (&value
, &location
);
705 looka_
= yylex (&value
);
710 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
712 const ]b4_int_type(b4_pact_ninf
, b4_pact_ninf
) yy::b4_parser_class_name::pact_ninf_
= b4_pact_ninf
[;
713 const ]b4_int_type_for([b4_pact
])[
714 yy::]b4_parser_class_name
[::pact_
[] =
719 /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
720 doesn't specify something else to do. Zero means the default is an
722 const ]b4_int_type_for([b4_defact
])[
723 yy::]b4_parser_class_name
[::defact_
[] =
728 /* YYPGOTO[NTERM-NUM]. */
729 const ]b4_int_type_for([b4_pgoto
])[
730 yy::]b4_parser_class_name
[::pgoto_
[] =
735 /* YYDEFGOTO[NTERM-NUM]. */
736 const ]b4_int_type_for([b4_defgoto
])[
737 yy::]b4_parser_class_name
[::defgoto_
[] =
742 /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
743 positive, shift that token. If negative, reduce the rule which
744 number is the opposite. If zero, do what YYDEFACT says. */
745 const ]b4_int_type(b4_table_ninf
, b4_table_ninf
) yy::b4_parser_class_name::table_ninf_
= b4_table_ninf
[;
746 const ]b4_int_type_for([b4_table
])[
747 yy::]b4_parser_class_name
[::table_
[] =
753 const ]b4_int_type_for([b4_check
])[
754 yy::]b4_parser_class_name
[::check_
[] =
760 /* STOS_[STATE-NUM] -- The (internal number of the) accessing
761 symbol of state STATE-NUM. */
762 const ]b4_int_type_for([b4_stos
])[
763 yy::]b4_parser_class_name
[::stos_
[] =
768 /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal token number corresponding
770 const ]b4_int_type_for([b4_toknum
])[
771 yy::]b4_parser_class_name
[::token_number_
[] =
777 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
778 const ]b4_int_type_for([b4_r1
])[
779 yy::]b4_parser_class_name
[::r1_
[] =
784 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
785 const ]b4_int_type_for([b4_r2
])[
786 yy::]b4_parser_class_name
[::r2_
[] =
791 #if YYDEBUG || YYERROR_VERBOSE
792 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
793 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
795 const yy::]b4_parser_class_name
[::name_
[] =
802 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
803 const yy::]b4_parser_class_name
[::RhsNumberType
804 yy::]b4_parser_class_name
[::rhs_
[] =
809 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
811 const ]b4_int_type_for([b4_prhs
])[
812 yy::]b4_parser_class_name
[::prhs_
[] =
817 /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
818 const ]b4_int_type_for([b4_rline
])[
819 yy::]b4_parser_class_name
[::rline_
[] =
824 /** Report that the YYRULE is going to be reduced. */
827 yy::]b4_parser_class_name
[::reduce_print_ (int yyrule
)
830 unsigned int yylno
= rline_
[yyrule
];
831 /* Print the symbols being reduced, and their result. */
832 cdebug_
<< "Reducing via rule " << n_
- 1 << " (line " << yylno
<< "), ";
833 for (]b4_int_type_for([b4_prhs
])[ i
= prhs_
[n_
];
835 cdebug_
<< name_
[rhs_
[i
]] << ' ';
836 cdebug_
<< "-> " << name_
[r1_
[n_
]] << std::endl
;
840 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
841 yy::]b4_parser_class_name
[::TokenNumberType
842 yy::]b4_parser_class_name
[::translate_ (int token
)
845 const TokenNumberType
850 if ((unsigned) token
<= user_token_number_max_
)
851 return translate_table
[token
];
856 const int yy::]b4_parser_class_name
[::eof_
= 0;
857 const int yy::]b4_parser_class_name
[::last_
= ]b4_last
[;
858 const int yy::]b4_parser_class_name
[::nnts_
= ]b4_nterms_number
[;
859 const int yy::]b4_parser_class_name
[::empty_
= -2;
860 const int yy::]b4_parser_class_name
[::final_
= ]b4_final_state_number
[;
861 const int yy::]b4_parser_class_name
[::terror_
= 1;
862 const int yy::]b4_parser_class_name
[::errcode_
= 256;
863 const int yy::]b4_parser_class_name
[::ntokens_
= ]b4_tokens_number
[;
865 const unsigned yy::]b4_parser_class_name
[::user_token_number_max_
= ]b4_user_token_number_max
[;
866 const yy::]b4_parser_class_name
[::TokenNumberType
yy::]b4_parser_class_name
[::undef_token_
= ]b4_undef_token_number
[;
871 b4_copyright([Stack handling
for Bison C
++ parsers
], [2002, 2003])[
873 #ifndef BISON_STACK_HH
874 # define BISON_STACK_HH
880 template < class T
, class S
= std::deque
< T
> >
885 typedef typename
S::iterator Iterator
;
886 typedef typename
S::const_iterator ConstIterator
;
892 Stack (unsigned n
) : seq_ (n
)
898 operator [] (unsigned i
)
905 operator [] (unsigned i
) const
932 inline ConstIterator
begin () const { return seq_
.begin (); }
933 inline ConstIterator
end () const { return seq_
.end (); }
940 template < class T
, class S
= Stack
< T
> >
945 Slice (const S
& stack
,
946 unsigned range
) : stack_ (stack
),
953 operator [] (unsigned i
) const
955 return stack_
[range_
- i
];
965 #endif // not BISON_STACK_HH]
968 b4_copyright([Position
class for Bison C
++ parsers
], [2002, 2003])[
972 ** Define the Location class.
975 #ifndef BISON_POSITION_HH
976 # define BISON_POSITION_HH
983 /** \brief Abstract a Position. */
987 /** \brief Initial column number. */
988 static const unsigned int initial_column
= 0;
989 /** \brief Initial line number. */
990 static const unsigned int initial_line
= 1;
992 /** \name Ctor & dtor.
995 /** \brief Construct a Position. */
999 column (initial_column
)
1005 /** \name Line and Column related manipulators
1008 /** \brief (line related) Advance to the COUNT next lines. */
1009 inline void lines (int count
= 1)
1011 column
= initial_column
;
1015 /** \brief (column related) Advance to the COUNT next columns. */
1016 inline void columns (int count
= 1)
1018 int leftmost
= initial_column
;
1019 int current
= column
;
1020 if (leftmost
<= current
+ count
)
1023 column
= initial_column
;
1028 /** \brief File name to which this position refers. */
1029 std::string filename
;
1030 /** \brief Current line number. */
1032 /** \brief Current column number. */
1033 unsigned int column
;
1036 /** \brief Add and assign a Position. */
1037 inline const Position
&
1038 operator+= (Position
& res
, const int width
)
1040 res
.columns (width
);
1044 /** \brief Add two Position objects. */
1045 inline const Position
1046 operator+ (const Position
& begin
, const int width
)
1048 Position res
= begin
;
1049 return res
+= width
;
1052 /** \brief Add and assign a Position. */
1053 inline const Position
&
1054 operator-= (Position
& res
, const int width
)
1056 return res
+= -width
;
1059 /** \brief Add two Position objects. */
1060 inline const Position
1061 operator- (const Position
& begin
, const int width
)
1063 return begin
+ -width
;
1066 /** \brief Intercept output stream redirection.
1067 ** \param ostr the destination output stream
1068 ** \param pos a reference to the Position to redirect
1070 inline std::ostream
&
1071 operator<< (std::ostream
& ostr
, const Position
& pos
)
1073 if (!pos
.filename
.empty ())
1074 ostr
<< pos
.filename
<< ':';
1075 return ostr
<< pos
.line
<< '.' << pos
.column
;
1079 #endif // not BISON_POSITION_HH]
1081 b4_copyright([Location
class for Bison C
++ parsers
], [2002, 2003])[
1084 ** \file location.hh
1085 ** Define the Location class.
1088 #ifndef BISON_LOCATION_HH
1089 # define BISON_LOCATION_HH
1091 # include <iostream>
1093 # include "position.hh"
1098 /** \brief Abstract a Location. */
1101 /** \name Ctor & dtor.
1104 /** \brief Construct a Location. */
1113 /** \name Line and Column related manipulators
1116 /** \brief Reset initial location to final location. */
1117 inline void step (void)
1122 /** \brief Extend the current location to the COUNT next columns. */
1123 inline void columns (unsigned int count
= 1)
1128 /** \brief Extend the current location to the COUNT next lines. */
1129 inline void lines (unsigned int count
= 1)
1137 /** \brief Beginning of the located region. */
1139 /** \brief End of the located region. */
1143 /** \brief Join two Location objects to create a Location. */
1144 inline const Location
operator+ (const Location
& begin
, const Location
& end
)
1146 Location res
= begin
;
1151 /** \brief Add two Location objects */
1152 inline const Location
operator+ (const Location
& begin
, unsigned width
)
1154 Location res
= begin
;
1155 res
.columns (width
);
1159 /** \brief Add and assign a Location */
1160 inline Location
&operator+= (Location
& res
, unsigned width
)
1162 res
.columns (width
);
1166 /** \brief Intercept output stream redirection.
1167 ** \param ostr the destination output stream
1168 ** \param loc a reference to the Location to redirect
1170 ** Avoid duplicate information.
1172 inline std::ostream
& operator<< (std::ostream
& ostr
, const Location
& loc
)
1174 Position last
= loc
.end
- 1;
1176 if (loc
.begin
.filename
!= last
.filename
)
1177 ostr
<< '-' << last
;
1178 else if (loc
.begin
.line
!= last
.line
)
1179 ostr
<< '-' << last
.line
<< '.' << last
.column
;
1180 else if (loc
.begin
.column
!= last
.column
)
1181 ostr
<< '-' << last
.column
;
1187 #endif // not BISON_LOCATION_HH]