m4_divert(-1)
# C++ skeleton for Bison
-# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004 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
m4_define([b4_cc_var_decl],
[ $1;])
+# b4_cxx_destruct_def(IGNORED-ARGUMENTS)
+# --------------------------------------
+# Declare the destruct_ method.
+m4_define([b4_cxx_destruct_def],
+[void
+yy::b4_parser_class_name::destruct_ (int yytype, SemanticType *yyvaluep, LocationType *yylocationp)[]dnl
+])
+
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert(0)dnl
m4_if(b4_defines_flag, 0, [],
[@output @output_header_name@
b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
- [2002, 2003])[
+ [2002, 2003, 2004])[
/* FIXME: This is wrong, we want computed header guards.
I don't know why the macros are missing now. :( */
#ifndef PARSER_HEADER_H
static const ]b4_int_type_for([b4_table])[ table_[];
static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ table_ninf_;
static const ]b4_int_type_for([b4_check])[ check_[];
+ static const ]b4_int_type_for([b4_stos])[ stos_[];
static const ]b4_int_type_for([b4_r1])[ r1_[];
static const ]b4_int_type_for([b4_r2])[ r2_[];
static const RhsNumberType rhs_[];
static const ]b4_int_type_for([b4_prhs])[ prhs_[];
static const ]b4_int_type_for([b4_rline])[ rline_[];
- static const ]b4_int_type_for([b4_stos])[ stos_[];
static const ]b4_int_type_for([b4_toknum])[ token_number_[];
virtual void reduce_print_ (int yyrule);
virtual void stack_print_ ();
/* Even more tables. */
static inline TokenNumberType translate_ (int token);
+ static inline void destruct_ (int yytype, SemanticType *yyvaluep,
+ LocationType *yylocationp);
/* Constants. */
static const int eof_;
static const int terror_;
static const int errcode_;
static const int ntokens_;
- static const unsigned user_token_number_max_;
+ static const unsigned int user_token_number_max_;
static const TokenNumberType undef_token_;
/* State. */
/* Semantic value and location of lookahead token. */
SemanticType value;
LocationType location;
+ /* Beginning of the last erroneous token popped off. */
+ Position error_start_;
/* @@$ and $$. */
SemanticType yyval;
])dnl
@output @output_parser_name@
b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
- [2002, 2003])
+ [2002, 2003, 2004])
m4_if(b4_defines_flag, 0, [], [#include @output_header_name@])[
#define YYABORT goto yyabortlab
#define YYERROR goto yyerrorlab
+]b4_yydestruct_generate([b4_cxx_destruct_def])[
int
yy::]b4_parser_class_name[::parse ()
/* If not already recovering from an error, report this error. */
report_syntax_error_ ();
+ error_start_ = location.begin;
if (errstatus_ == 3)
{
/* If just tried and failed to reuse lookahead token after an
if (looka_ == eof_)
for (;;)
{
+ error_start_ = location_stack_[0].begin;
state_stack_.pop ();
semantic_stack_.pop ();
location_stack_.pop ();
if (state_stack_.height () == 1)
YYABORT;
// YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
-// FIXME: yydestruct (yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[);
+ destruct_ (stos_[state_stack_[0]],
+ &semantic_stack_[0],
+ &location_stack_[0]);
}
}
else
{
#if YYDEBUG
- YYCDEBUG << "Discarding token " << looka_
- << " (" << name_[ilooka_] << ")." << std::endl;
-// yydestruct (yytoken, &yylval]b4_location_if([, &yylloc])[);
+ YYCDEBUG << "Discarding token " << looka_
+ << " (" << name_[ilooka_] << ")." << std::endl;
#endif
- looka_ = empty_;
+ destruct_ (ilooka_, &value, &location);
+ looka_ = empty_;
}
}
state_stack_.pop (len_);
semantic_stack_.pop (len_);
+ error_start_ = location_stack_[len_ - 1].begin;
location_stack_.pop (len_);
state_ = state_stack_[0];
goto yyerrlab1;
}
}
#endif
+ destruct_ (stos_[state_], &semantic_stack_[0], &location_stack_[0]);
+ error_start_ = location_stack_[0].begin;
state_stack_.pop ();
semantic_stack_.pop ();
YYCDEBUG << "Shifting error token, ";
- semantic_stack_.push (value);
- location_stack_.push (location);
+ {
+ Location errloc;
+ errloc.begin = error_start_;
+ errloc.end = location.end;
+ semantic_stack_.push (value);
+ location_stack_.push (errloc);
+ }
state_ = n_;
goto yynewstate;
]b4_check[
};
-#if YYDEBUG
/* STOS_[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
const ]b4_int_type_for([b4_stos])[
]b4_stos[
};
+#if YYDEBUG
/* TOKEN_NUMBER_[YYLEX-NUM] -- Internal token number corresponding
to YYLEX-NUM. */
const ]b4_int_type_for([b4_toknum])[
{
]b4_translate[
};
- if ((unsigned) token <= user_token_number_max_)
+ if ((unsigned int) token <= user_token_number_max_)
return translate_table[token];
else
return undef_token_;
const int yy::]b4_parser_class_name[::errcode_ = 256;
const int yy::]b4_parser_class_name[::ntokens_ = ]b4_tokens_number[;
-const unsigned yy::]b4_parser_class_name[::user_token_number_max_ = ]b4_user_token_number_max[;
+const unsigned int yy::]b4_parser_class_name[::user_token_number_max_ = ]b4_user_token_number_max[;
const yy::]b4_parser_class_name[::TokenNumberType yy::]b4_parser_class_name[::undef_token_ = ]b4_undef_token_number[;
]b4_epilogue
dnl
@output stack.hh
-b4_copyright([Stack handling for Bison C++ parsers], [2002, 2003])[
+b4_copyright([Stack handling for Bison C++ parsers], [2002, 2003, 2004])[
#ifndef BISON_STACK_HH
# define BISON_STACK_HH
{
}
- Stack (unsigned n) : seq_ (n)
+ Stack (unsigned int n) : seq_ (n)
{
}
inline
T&
- operator [] (unsigned i)
+ operator [] (unsigned int i)
{
return seq_[i];
}
inline
const T&
- operator [] (unsigned i) const
+ operator [] (unsigned int i) const
{
return seq_[i];
}
inline
void
- pop (unsigned n = 1)
+ pop (unsigned int n = 1)
{
for (; n; --n)
seq_.pop_front ();
}
inline
- unsigned
+ unsigned int
height () const
{
return seq_.size ();
public:
Slice (const S& stack,
- unsigned range) : stack_ (stack),
- range_ (range)
+ unsigned int range) : stack_ (stack),
+ range_ (range)
{
}
inline
const T&
- operator [] (unsigned i) const
+ operator [] (unsigned int i) const
{
return stack_[range_ - i];
}
private:
const S& stack_;
- unsigned range_;
+ unsigned int range_;
};
}
#endif // not BISON_STACK_HH]
dnl
@output position.hh
-b4_copyright([Position class for Bison C++ parsers], [2002, 2003])[
+b4_copyright([Position class for Bison C++ parsers], [2002, 2003, 2004])[
/**
** \file position.hh
}
#endif // not BISON_POSITION_HH]
@output location.hh
-b4_copyright([Location class for Bison C++ parsers], [2002, 2003])[
+b4_copyright([Location class for Bison C++ parsers], [2002, 2003, 2004])[
/**
** \file location.hh
}
/** \brief Add two Location objects */
- inline const Location operator+ (const Location& begin, unsigned width)
+ inline const Location operator+ (const Location& begin, unsigned int width)
{
Location res = begin;
res.columns (width);
}
/** \brief Add and assign a Location */
- inline Location &operator+= (Location& res, unsigned width)
+ inline Location &operator+= (Location& res, unsigned int width)
{
res.columns (width);
return res;