yychar cannot be empty in yyerrlab.

* TODO (yychar == yyempty_): New.
	* data/lalr1.cc: Remove the handling of this case.
	This eases forthcoming changes related to yychar and yytranslate.
This commit is contained in:
Akim Demaille
2008-08-18 21:31:06 +02:00
parent fce629c0ef
commit 27cb5b5901
3 changed files with 35 additions and 11 deletions

View File

@@ -1,3 +1,10 @@
2008-11-11 Akim Demaille <demaille@gostai.com>
yychar cannot be empty in yyerrlab.
* TODO (yychar == yyempty_): New.
* data/lalr1.cc: Remove the handling of this case.
This eases forthcoming changes related to yychar and yytranslate.
2008-11-11 Akim Demaille <demaille@gostai.com> 2008-11-11 Akim Demaille <demaille@gostai.com>
Bench: syntactic sugar for %define/#define. Bench: syntactic sugar for %define/#define.

16
TODO
View File

@@ -54,6 +54,22 @@ what it should look like. For instance what follows crashes.
return yyparse (); return yyparse ();
} }
** yychar == yyempty_
The code in yyerrlab reads:
if (yychar <= YYEOF)
{
/* Return failure if at end of input. */
if (yychar == YYEOF)
YYABORT;
}
There are only two yychar that can be <= YYEOF: YYEMPTY and YYEOF.
But I can't produce the situation where yychar is YYEMPTY here, is it
really possible? The test suite does not exercise this case.
This shows that it would be interesting to manage to install skeleton
coverage analysis to the test suite.
* Header guards * Header guards

View File

@@ -1281,18 +1281,19 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
if (yyerrstatus_ == 3) if (yyerrstatus_ == 3)
{ {
/* If just tried and failed to reuse lookahead token after an /* If just tried and failed to reuse lookahead token after an
error, discard it. */ error, discard it. */
if (yychar <= yyeof_) /* Return failure if at end of input. */
{ if (yychar == yyeof_)
/* Return failure if at end of input. */ YYABORT;
if (yychar == yyeof_) else
YYABORT; {]b4_assert_if([
} // Previous version of this code was ready to handle
else // yychar == yyempty_ (actually yychar <= yyeof_). Can it
{ // really be triggered?
yy_destroy_ ("Error: discarding", yyla); assert (yychar != yyempty_);])[
yychar = yyempty_; yy_destroy_ ("Error: discarding", yyla);
yychar = yyempty_;
} }
} }