* data/location.cc: New.
authorAkim Demaille <akim@epita.fr>
Sun, 2 Oct 2005 18:17:23 +0000 (18:17 +0000)
committerAkim Demaille <akim@epita.fr>
Sun, 2 Oct 2005 18:17:23 +0000 (18:17 +0000)
ChangeLog
data/location.cc [new file with mode: 0644]

index 63ad46df12e7d4514ae9da55d65c3234eb6f98fc..c714fce074e22bc44bc9d6dd295d51b847b5df67 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-10-02  Akim Demaille  <akim@epita.fr>
+
+       * data/location.cc: New.
+
 2005-10-02  Paul Eggert  <eggert@cs.ucla.edu>,
            Akim Demaille  <akim@epita.fr>
 
 2005-10-02  Paul Eggert  <eggert@cs.ucla.edu>,
            Akim Demaille  <akim@epita.fr>
 
diff --git a/data/location.cc b/data/location.cc
new file mode 100644 (file)
index 0000000..2226adc
--- /dev/null
@@ -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 <iostream>
+# include <string>
+
+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 <iostream>
+# include <string>
+# 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([#])