* data/location.cc: New, extract from...

* data/lalr1.cc: here.
(location.hh): Include it after the user prologue, in case the
filename type is defined by the user.
Forward declation location and position before the pre-prologue.
(yyresult_): Rename as...
(yyresult): this, it's a local variable, not an attribute.
* data/Makefile.am (dist_pkgdata_DATA): Adjust.
This commit is contained in:
Akim Demaille
2005-10-02 16:34:02 +00:00
parent 24dfa6ec84
commit fc695704a1
3 changed files with 27 additions and 233 deletions

View File

@@ -1,4 +1,15 @@
2005-10-01 Akim <akim@epita.fr> 2005-10-02 Akim Demaille <akim@epita.fr>
* data/location.cc: New, extract from...
* data/lalr1.cc: here.
(location.hh): Include it after the user prologue, in case the
filename type is defined by the user.
Forward declation location and position before the pre-prologue.
(yyresult_): Rename as...
(yyresult): this, it's a local variable, not an attribute.
* data/Makefile.am (dist_pkgdata_DATA): Adjust.
2005-10-01 Akim Demaille <akim@epita.fr>
* examples/extexi: Restore the #line generation. * examples/extexi: Restore the #line generation.

View File

@@ -17,7 +17,7 @@
dist_pkgdata_DATA = README \ dist_pkgdata_DATA = README \
c.m4 yacc.c glr.c \ c.m4 yacc.c glr.c \
c++.m4 lalr1.cc c++.m4 location.cc lalr1.cc
m4sugardir = $(pkgdatadir)/m4sugar m4sugardir = $(pkgdatadir)/m4sugar
dist_m4sugar_DATA = m4sugar/m4sugar.m4 dist_m4sugar_DATA = m4sugar/m4sugar.m4

View File

@@ -20,6 +20,7 @@ m4_divert(-1)
# 02110-1301 USA # 02110-1301 USA
m4_include(b4_pkgdatadir/[c++.m4]) m4_include(b4_pkgdatadir/[c++.m4])
m4_include(b4_pkgdatadir/[location.cc])
# We do want M4 expansion after # for CPP macros. # We do want M4 expansion after # for CPP macros.
m4_changecom() m4_changecom()
@@ -37,10 +38,12 @@ dnl FIXME: I don\'t know why the macros are missing now. :(
#include <string> #include <string>
#include <iostream> #include <iostream>
#include "stack.hh" #include "stack.hh"
#include "location.hh"
/* Using locations. */ namespace yy
#define YYLSP_NEEDED ]b4_locations_flag[ {
class position;
class location;
}
/* First part of user declarations. */ /* First part of user declarations. */
]b4_pre_prologue[ ]b4_pre_prologue[
@@ -48,6 +51,9 @@ dnl FIXME: I don\'t know why the macros are missing now. :(
]/* Line __line__ of lalr1.cc. */ ]/* Line __line__ of lalr1.cc. */
b4_syncline([@oline@], [@ofile@])[ b4_syncline([@oline@], [@ofile@])[
]dnl Include location.hh here: it might depend on headers included above.
[#include "location.hh"
/* Enabling traces. */ /* Enabling traces. */
#ifndef YYDEBUG #ifndef YYDEBUG
# define YYDEBUG ]b4_debug[ # define YYDEBUG ]b4_debug[
@@ -506,7 +512,7 @@ yy::]b4_parser_class_name[::parse ()
/// @@$. /// @@$.
location_type yyloc; location_type yyloc;
int yyresult_; int yyresult;
YYCDEBUG << "Starting parse" << std::endl; YYCDEBUG << "Starting parse" << std::endl;
@@ -765,12 +771,12 @@ yyerrlab1:
/* Accept. */ /* Accept. */
yyacceptlab: yyacceptlab:
yyresult_ = 0; yyresult = 0;
goto yyreturn; goto yyreturn;
/* Abort. */ /* Abort. */
yyabortlab: yyabortlab:
yyresult_ = 1; yyresult = 1;
goto yyreturn; goto yyreturn;
yyreturn: yyreturn:
@@ -786,7 +792,7 @@ yyreturn:
yypop_ (); yypop_ ();
} }
return yyresult_; return yyresult;
} }
// Generate an error message. // Generate an error message.
@@ -1107,227 +1113,4 @@ namespace yy
} }
#endif // not BISON_STACK_HH] #endif // not BISON_STACK_HH]
dnl m4_divert(-1)
@output 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 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]