* data/glr.c, data/lalr1.cc, data/yacc.c: When YYABORT was

invoked, yydestruct the lookahead.
* tests/calc.at (Calculator $1): Update the expected lengths of
traces: there is an added line for the discarded lookahead.
* doc/bison.texinfo (Destructor Decl): Some rewording.
Define "discarded" symbols.
This commit is contained in:
Akim Demaille
2004-09-06 07:48:20 +00:00
parent 0fe1f06d36
commit e757bb10bc
6 changed files with 64 additions and 27 deletions

View File

@@ -1,3 +1,12 @@
2004-09-03 Akim Demaille <akim@epita.fr>
* data/glr.c, data/lalr1.cc, data/yacc.c: When YYABORT was
invoked, yydestruct the lookahead.
* tests/calc.at (Calculator $1): Update the expected lengths of
traces: there is an added line for the discarded lookahead.
* doc/bison.texinfo (Destructor Decl): Some rewording.
Define "discarded" symbols.
2004-09-02 Akim Demaille <akim@epita.fr>
* data/lalr1.cc (translate_, destruct_): No reason to be static.

View File

@@ -1916,7 +1916,13 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
yyposn = yystack.yytops.yystates[0]->yyposn;
}
yyDone:
;
/* On YYABORT, free the lookahead. */
if (yystack.yyerrflag == 1 && yytoken != YYEMPTY)
{
YY_SYMBOL_PRINT ("Error: discarding lookahead",
yytoken, yylvalp, yyllocp);
yydestruct (yytoken, yylvalp]b4_location_if([, yyllocp])[);
}
yyfreeGLRStack (&yystack);
return yystack.yyerrflag;

View File

@@ -714,6 +714,10 @@ yyacceptlab:
/* Abort. */
yyabortlab:
/* Free the lookahead. */
YY_SYMBOL_PRINT ("Error: discarding lookahead", ilooka_, &value, &location);
destruct_ (ilooka_, &value, &location);
looka_ = empty_;
return 1;
}

View File

@@ -1209,6 +1209,9 @@ yyacceptlab:
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
YY_SYMBOL_PRINT ("Error: discarding lookahead", yytoken, &yylval, &yylloc);
yydestruct (yytoken, &yylval]b4_location_if([, &yylloc])[);
yychar = YYEMPTY;
yyresult = 1;
goto yyreturn;

View File

@@ -3734,14 +3734,13 @@ terminal symbol. All kinds of token declarations allow
@cindex freeing discarded symbols
@findex %destructor
Some symbols can be discarded by the parser, typically during error
recovery (@pxref{Error Recovery}). Basically, during error recovery,
embarrassing symbols already pushed on the stack, and embarrassing
tokens coming from the rest of the file are thrown away until the parser
falls on its feet. If these symbols convey heap based information, this
memory is lost. While this behavior is tolerable for batch parsers,
such as in compilers, it is unacceptable for parsers that can
possibility ``never end'' such as shells, or implementations of
Some symbols can be discarded by the parser. For instance, during error
recovery (@pxref{Error Recovery}), embarrassing symbols already pushed
on the stack, and embarrassing tokens coming from the rest of the file
are thrown away until the parser falls on its feet. If these symbols
convey heap based information, this memory is lost. While this behavior
can be tolerable for batch parsers, such as in compilers, it is not for
possibly ``never ending'' parsers such as shells, or implementations of
communication protocols.
The @code{%destructor} directive allows for the definition of code that
@@ -3794,6 +3793,22 @@ typeless: string; // $$ = $1 does not apply; $1 is destroyed.
typefull: string; // $$ = $1 applies, $1 is not destroyed.
@end smallexample
@sp 1
@cindex discarded symbols
@dfn{Discarded symbols} are the following:
@itemize
@item
stacked symbols popped during the first phase of error recovery,
@item
incoming terminals during the second phase of error recovery,
@item
the current lookahead when the parser aborts (either via an explicit
call to @code{YYABORT}, or as a consequence of a failed error recovery).
@end itemize
@node Expect Decl
@subsection Suppressing Conflict Warnings
@cindex suppressing conflict warnings

View File

@@ -466,21 +466,21 @@ _AT_CHECK_CALC([$1],
[486])
# Some syntax errors.
_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [11],
_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [12],
[1.2: syntax error, unexpected "number"])
_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [15],
_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [16],
[1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!'])
_AT_CHECK_CALC_ERROR([$1], [1], [error], [4],
_AT_CHECK_CALC_ERROR([$1], [1], [error], [5],
[1.0: syntax error, unexpected $undefined])
_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [22],
_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [23],
[1.6: syntax error, unexpected '='])
_AT_CHECK_CALC_ERROR([$1], [1],
[
+1],
[14],
[15],
[2.0: syntax error, unexpected '+'])
# Exercise error messages with EOF: work on an empty file.
_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4],
_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [5],
[1.0: syntax error, unexpected "end of input"])
# Exercise the error token: without it, we die at the first error,