Fix handling of yychar manipulation in user semantic actions.

The problem was that yacc.c didn't always update the yychar
translation afterwards.  However, other skeletons appear to be
fine.  glr.c appears to already translate yychar before every
use.  lalr1.cc does not define yychar and does not document its
replacement, yyla, for users.  It does provide yyclearin, but
that does not manipulate yyla and thus requires no translation
update.  In lalr1.java, yychar is out of scope during semantic
actions.
* NEWS (2.5): Document.
* data/yacc.c (YYBACKUP): Don't bother translating yychar into
yytoken here.
(yyparse, yypush_parse): Instead, translate before every use of
yytoken, and add comments explaining this approach.
* tests/actions.at (Destroying lookahead assigned by semantic
action): New test group checking that translation happens before
lookahead destructor calls at parser return.  Previously,
incorrect destructors were called.
* tests/conflicts.at (parse.error=verbose and consistent
errors): New test group checking that translation happens at
syntax error detection before the associated verbose error
message and the associated lookahead destructor calls.  While
the destructor call is fixed by this patch, the verbose error
message is currently incorrect due to another bug (see
comments in test group), so this is an expected failure for now.
This commit is contained in:
Joel E. Denny
2009-12-20 02:22:53 -05:00
parent 4395a9ff4f
commit df222dfaf4
7 changed files with 612 additions and 344 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 2.4.456-ea2e. */
/* A Bison parser, made by GNU Bison 2.4.457-4395a. */
/* Interface for Bison's Yacc-like parsers in C
@@ -31,7 +31,7 @@
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* "%code requires" blocks. */
/* Line 1640 of yacc.c */
/* Line 1659 of yacc.c */
#line 202 "src/parse-gram.y"
# ifndef PARAM_TYPE
@@ -46,7 +46,7 @@
# endif
/* Line 1640 of yacc.c */
/* Line 1659 of yacc.c */
#line 51 "src/parse-gram.h"
/* Tokens. */
@@ -173,7 +173,7 @@
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
/* Line 1640 of yacc.c */
/* Line 1659 of yacc.c */
#line 88 "src/parse-gram.y"
assoc assoc;
@@ -186,13 +186,13 @@ typedef union YYSTYPE
uniqstr uniqstr;
unsigned char character;
/* Line 1640 of yacc.c */
/* Line 1659 of yacc.c */
#line 226 "src/parse-gram.y"
param_type param;
/* Line 1640 of yacc.c */
/* Line 1659 of yacc.c */
#line 197 "src/parse-gram.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1