From: Akim Demaille Date: Sun, 2 Oct 2005 18:17:23 +0000 (+0000) Subject: * data/location.cc: New. X-Git-Tag: v2.3b~615 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/21667f64cd57381cdee86a536010b09a55703a51 * data/location.cc: New. --- diff --git a/ChangeLog b/ChangeLog index 63ad46df..c714fce0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-10-02 Akim Demaille + + * data/location.cc: New. + 2005-10-02 Paul Eggert , Akim Demaille diff --git a/data/location.cc b/data/location.cc new file mode 100644 index 00000000..2226adca --- /dev/null +++ b/data/location.cc @@ -0,0 +1,251 @@ +m4_divert(-1) + +# C++ skeleton for Bison + +# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +m4_include(b4_pkgdatadir/[c++.m4]) + +# We do want M4 expansion after # for CPP macros. +m4_changecom() +m4_divert(0)dnl +@output b4_dir_prefix[]position.hh +b4_copyright([Position class for Bison C++ parsers], [2002, 2003, 2004, 2005])[ + +/** + ** \file position.hh + ** Define the position class. + */ + +#ifndef BISON_POSITION_HH +# define BISON_POSITION_HH + +# include +# include + +namespace yy +{ + /// Abstract a position. + class position + { + public: + /// Initial column number. + static const unsigned int initial_column = 0; + /// Initial line number. + static const unsigned int initial_line = 1; + + /** \name Ctor & dtor. + ** \{ */ + public: + /// Construct a position. + position () : + filename (0), + line (initial_line), + column (initial_column) + { + } + /** \} */ + + + /** \name Line and Column related manipulators + ** \{ */ + public: + /// (line related) Advance to the COUNT next lines. + inline void lines (int count = 1) + { + column = initial_column; + line += count; + } + + /// (column related) Advance to the COUNT next columns. + inline void columns (int count = 1) + { + int leftmost = initial_column; + int current = column; + if (leftmost <= current + count) + column += count; + else + column = initial_column; + } + /** \} */ + + public: + /// File name to which this position refers. + ]b4_filename_type[* filename; + /// Current line number. + unsigned int line; + /// Current column number. + unsigned int column; + }; + + /// Add and assign a position. + inline const position& + operator+= (position& res, const int width) + { + res.columns (width); + return res; + } + + /// Add two position objects. + inline const position + operator+ (const position& begin, const int width) + { + position res = begin; + return res += width; + } + + /// Add and assign a position. + inline const position& + operator-= (position& res, const int width) + { + return res += -width; + } + + /// Add two position objects. + inline const position + operator- (const position& begin, const int width) + { + return begin + -width; + } + + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param pos a reference to the position to redirect + */ + inline std::ostream& + operator<< (std::ostream& ostr, const position& pos) + { + if (pos.filename) + ostr << *pos.filename << ':'; + return ostr << pos.line << '.' << pos.column; + } + +} +#endif // not BISON_POSITION_HH] +@output b4_dir_prefix[]location.hh +b4_copyright([Location class for Bison C++ parsers], [2002, 2003, 2004, 2005])[ + +/** + ** \file location.hh + ** Define the location class. + */ + +#ifndef BISON_LOCATION_HH +# define BISON_LOCATION_HH + +# include +# include +# include "position.hh" + +namespace yy +{ + + /// Abstract a location. + class location + { + /** \name Ctor & dtor. + ** \{ */ + public: + /// Construct a location. + location () : + begin (), + end () + { + } + /** \} */ + + + /** \name Line and Column related manipulators + ** \{ */ + public: + /// Reset initial location to final location. + inline void step () + { + begin = end; + } + + /// Extend the current location to the COUNT next columns. + inline void columns (unsigned int count = 1) + { + end += count; + } + + /// Extend the current location to the COUNT next lines. + inline void lines (unsigned int count = 1) + { + end.lines (count); + } + /** \} */ + + + public: + /// Beginning of the located region. + position begin; + /// End of the located region. + position end; + }; + + /// Join two location objects to create a location. + inline const location operator+ (const location& begin, const location& end) + { + location res = begin; + res.end = end.end; + return res; + } + + /// Add two location objects. + inline const location operator+ (const location& begin, unsigned int width) + { + location res = begin; + res.columns (width); + return res; + } + + /// Add and assign a location. + inline location& operator+= (location& res, unsigned int width) + { + res.columns (width); + return res; + } + + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param loc a reference to the location to redirect + ** + ** Avoid duplicate information. + */ + inline std::ostream& operator<< (std::ostream& ostr, const location& loc) + { + position last = loc.end - 1; + ostr << loc.begin; + if (last.filename + && (!loc.begin.filename + || *loc.begin.filename != *last.filename)) + ostr << '-' << last; + else if (loc.begin.line != last.line) + ostr << '-' << last.line << '.' << last.column; + else if (loc.begin.column != last.column) + ostr << '-' << last.column; + return ostr; + } + +} + +#endif // not BISON_LOCATION_HH] +m4_divert(-1) +m4_changecom([#])