source: trunk/contrib/bison-2.4.2/share/bison/location.cc @ 1933

Last change on this file since 1933 was 1933, checked in by sam, 11 years ago

contrib: add Bison and Flex executables for Windows.

File size: 6.7 KB
Line 
1# C++ skeleton for Bison
2
3# Copyright (C) 2002-2007, 2009-2010 Free Software Foundation, Inc.
4
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 3 of the License, or
8# (at your option) any later version.
9#
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.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18# We do want M4 expansion after # for CPP macros.
19m4_changecom()
20m4_divert_push(0)dnl
21@output(b4_dir_prefix[]position.hh@)@
22b4_copyright([Positions for Bison parsers in C++],
23             [2002-2007, 2009-2010])[
24
25/**
26 ** \file position.hh
27 ** Define the ]b4_namespace_ref[::position class.
28 */
29
30#ifndef BISON_POSITION_HH
31# define BISON_POSITION_HH
32
33# include <iostream>
34# include <string>
35# include <algorithm>
36
37]b4_namespace_open[
38  /// Abstract a position.
39  class position
40  {
41  public:
42]m4_ifdef([b4_location_constructors], [
43    /// Construct a position.
44    position ()
45      : filename (0), line (]b4_location_initial_line[), column (]b4_location_initial_column[)
46    {
47    }
48
49])[
50    /// Initialization.
51    inline void initialize (]b4_percent_define_get([[filename_type]])[* fn)
52    {
53      filename = fn;
54      line = ]b4_location_initial_line[;
55      column = ]b4_location_initial_column[;
56    }
57
58    /** \name Line and Column related manipulators
59     ** \{ */
60  public:
61    /// (line related) Advance to the COUNT next lines.
62    inline void lines (int count = 1)
63    {
64      column = ]b4_location_initial_column[;
65      line += count;
66    }
67
68    /// (column related) Advance to the COUNT next columns.
69    inline void columns (int count = 1)
70    {
71      column = std::max (]b4_location_initial_column[u, column + count);
72    }
73    /** \} */
74
75  public:
76    /// File name to which this position refers.
77    ]b4_percent_define_get([[filename_type]])[* filename;
78    /// Current line number.
79    unsigned int line;
80    /// Current column number.
81    unsigned int column;
82  };
83
84  /// Add and assign a position.
85  inline const position&
86  operator+= (position& res, const int width)
87  {
88    res.columns (width);
89    return res;
90  }
91
92  /// Add two position objects.
93  inline const position
94  operator+ (const position& begin, const int width)
95  {
96    position res = begin;
97    return res += width;
98  }
99
100  /// Add and assign a position.
101  inline const position&
102  operator-= (position& res, const int width)
103  {
104    return res += -width;
105  }
106
107  /// Add two position objects.
108  inline const position
109  operator- (const position& begin, const int width)
110  {
111    return begin + -width;
112  }
113]b4_percent_define_flag_if([[define_location_comparison]], [[
114  /// Compare two position objects.
115  inline bool
116  operator== (const position& pos1, const position& pos2)
117  {
118    return (pos1.line == pos2.line
119            && pos1.column == pos2.column
120            && (pos1.filename == pos2.filename
121                || (pos1.filename && pos2.filename
122                    && *pos1.filename == *pos2.filename)));
123  }
124
125  /// Compare two position objects.
126  inline bool
127  operator!= (const position& pos1, const position& pos2)
128  {
129    return !(pos1 == pos2);
130  }
131]])[
132  /** \brief Intercept output stream redirection.
133   ** \param ostr the destination output stream
134   ** \param pos a reference to the position to redirect
135   */
136  inline std::ostream&
137  operator<< (std::ostream& ostr, const position& pos)
138  {
139    if (pos.filename)
140      ostr << *pos.filename << ':';
141    return ostr << pos.line << '.' << pos.column;
142  }
143
144]b4_namespace_close[
145#endif // not BISON_POSITION_HH]
146@output(b4_dir_prefix[]location.hh@)@
147b4_copyright([Locations for Bison parsers in C++],
148             [2002-2007, 2009-2010])[
149
150/**
151 ** \file location.hh
152 ** Define the ]b4_namespace_ref[::location class.
153 */
154
155#ifndef BISON_LOCATION_HH
156# define BISON_LOCATION_HH
157
158# include <iostream>
159# include <string>
160# include "position.hh"
161
162]b4_namespace_open[
163
164  /// Abstract a location.
165  class location
166  {
167  public:
168]m4_ifdef([b4_location_constructors], [
169    /// Construct a location.
170    location ()
171      : begin (), end ()
172    {
173    }
174
175])[
176    /// Initialization.
177    inline void initialize (]b4_percent_define_get([[filename_type]])[* fn)
178    {
179      begin.initialize (fn);
180      end = begin;
181    }
182
183    /** \name Line and Column related manipulators
184     ** \{ */
185  public:
186    /// Reset initial location to final location.
187    inline void step ()
188    {
189      begin = end;
190    }
191
192    /// Extend the current location to the COUNT next columns.
193    inline void columns (unsigned int count = 1)
194    {
195      end += count;
196    }
197
198    /// Extend the current location to the COUNT next lines.
199    inline void lines (unsigned int count = 1)
200    {
201      end.lines (count);
202    }
203    /** \} */
204
205
206  public:
207    /// Beginning of the located region.
208    position begin;
209    /// End of the located region.
210    position end;
211  };
212
213  /// Join two location objects to create a location.
214  inline const location operator+ (const location& begin, const location& end)
215  {
216    location res = begin;
217    res.end = end.end;
218    return res;
219  }
220
221  /// Add two location objects.
222  inline const location operator+ (const location& begin, unsigned int width)
223  {
224    location res = begin;
225    res.columns (width);
226    return res;
227  }
228
229  /// Add and assign a location.
230  inline location& operator+= (location& res, unsigned int width)
231  {
232    res.columns (width);
233    return res;
234  }
235]b4_percent_define_flag_if([[define_location_comparison]], [[
236  /// Compare two location objects.
237  inline bool
238  operator== (const location& loc1, const location& loc2)
239  {
240    return loc1.begin == loc2.begin && loc1.end == loc2.end;
241  }
242
243  /// Compare two location objects.
244  inline bool
245  operator!= (const location& loc1, const location& loc2)
246  {
247    return !(loc1 == loc2);
248  }
249]])[
250  /** \brief Intercept output stream redirection.
251   ** \param ostr the destination output stream
252   ** \param loc a reference to the location to redirect
253   **
254   ** Avoid duplicate information.
255   */
256  inline std::ostream& operator<< (std::ostream& ostr, const location& loc)
257  {
258    position last = loc.end - 1;
259    ostr << loc.begin;
260    if (last.filename
261        && (!loc.begin.filename
262            || *loc.begin.filename != *last.filename))
263      ostr << '-' << last;
264    else if (loc.begin.line != last.line)
265      ostr << '-' << last.line  << '.' << last.column;
266    else if (loc.begin.column != last.column)
267      ostr << '-' << last.column;
268    return ostr;
269  }
270
271]b4_namespace_close[
272
273#endif // not BISON_LOCATION_HH]
274m4_divert_pop(0)
275m4_changecom([#])
Note: See TracBrowser for help on using the repository browser.