* data/lalr1.cc (Parser::report_syntax_error_): New, extracted from

(Parser::parse): here.
Adjust: nerrs and errstatus is now replaced by...
(Parser::nerrs_, Parser::errstatus_): New.
This commit is contained in:
Akim Demaille
2003-08-26 05:21:41 +00:00
parent 603f1cfdc5
commit a08460b08c
2 changed files with 58 additions and 44 deletions

View File

@@ -234,6 +234,7 @@ namespace yy
virtual void lex_ ();
virtual void error_ ();
virtual void print_ ();
virtual void report_syntax_error_ ();
/* Stacks. */
StateStack state_stack_;
@@ -288,6 +289,10 @@ namespace yy
int len_;
int state_;
/* Error handling. */
int nerrs_;
int errstatus_;
/* Debugging. */
int debug_;
std::ostream &cdebug_;
@@ -348,8 +353,8 @@ do { \
int
yy::]b4_parser_class_name[::parse ()
{
int nerrs = 0;
int errstatus = 0;
nerrs_ = 0;
errstatus_ = 0;
/* Initialize the stacks. The initial state will be pushed in
yynewstate, since the latter expects the semantical and the
@@ -449,8 +454,8 @@ yy::]b4_parser_class_name[::parse ()
/* Count tokens shifted since error; after three, turn off error
status. */
if (errstatus)
--errstatus;
if (errstatus_)
--errstatus_;
state_ = n_;
goto yynewstate;
@@ -523,46 +528,9 @@ b4_syncline([@oline@], [@ofile@])[
`------------------------------------*/
yyerrlab:
/* If not already recovering from an error, report this error. */
if (!errstatus)
{
++nerrs;
report_syntax_error_ ();
#if YYERROR_VERBOSE
n_ = pact_[state_];
if (pact_ninf_ < n_ && n_ < last_)
{
message = "syntax error, unexpected ";
message += name_[ilooka_];
{
int count = 0;
/* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. */
int xbegin = n_ < 0 ? -n_ : 0;
/* Stay within bounds of both yycheck and yytname. */
int checklim = last_ - n_;
int xend = checklim < ntokens_ ? checklim : ntokens_;
for (int x = xbegin; x < xend; ++x)
if (check_[x + n_] == x && x != terror_)
++count;
if (count < 5)
{
count = 0;
for (int x1 = xbegin; x1 < xend; ++x1)
if (check_[x1 + n_] == x1 && x1 != terror_)
{
message += (!count++) ? ", expecting " : " or ";
message += name_[x1];
}
}
}
}
else
#endif
message = "syntax error";
error_ ();
}
if (errstatus == 3)
if (errstatus_ == 3)
{
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
@@ -615,7 +583,7 @@ yyerrorlab:
| yyerrlab1 -- common code for both syntax error and YYERROR. |
`-------------------------------------------------------------*/
yyerrlab1:
errstatus = 3; /* Each real token shifted decrements this. */
errstatus_ = 3; /* Each real token shifted decrements this. */
for (;;)
{
@@ -694,6 +662,45 @@ yy::]b4_parser_class_name[::lex_ ()
#endif
}
/** Generate an error message, and invoke yyerror. */
void
yy::]b4_parser_class_name[::report_syntax_error_ ()
{
/* If not already recovering from an error, report this error. */
if (!errstatus_)
{
++nerrs_;
#if YYERROR_VERBOSE
n_ = pact_[state_];
if (pact_ninf_ < n_ && n_ < last_)
{
message = "syntax error, unexpected ";
message += name_[ilooka_];
{
int count = 0;
for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x)
if (check_[x + n_] == x && x != terror_)
++count;
if (count < 5)
{
count = 0;
for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x)
if (check_[x + n_] == x && x != terror_)
{
message += (!count++) ? ", expecting " : " or ";
message += name_[x];
}
}
}
}
else
#endif
message = "syntax error";
error_ ();
}
}
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */