-2005-09-16 Akim <akim@epita.fr>
+2005-09-16 Paul Eggert <eggert@cs.ucla.edu>
+
+ * NEWS: Version 2.1.
+
+ * NEWS: Remove notice of yytname change, since it was never in an
+ official release.
+ * data/glr.c (yydestroyGLRState): Rename local var to avoid shadowing
+ diagnostic.
+ * src/output.c (prepare): Likewise.
+ * data/lalr1.cc (YYERROR_VERBOSE_IF): New macro.
+ (yysyntax_error_): Use it to avoid GCC warning when YYERROR_VERBOSE
+ is not defined. This is an awful hack, but it's enough for now.
+ All callers changed.
+ * tests/glr-regression-at (make_value): Args are const pointers now,
+ to avoid GCC warning.
+ (Duplicated user destructor for lookahead): New test. Currently
+ skipped. It fails on my host but I'm not sure it'll always fail.
+
+2005-09-16 Akim Demaille <akim@epita.fr>
* src/symtab.h (struct symbol): Declare the printer and destructor
as const, to avoid accidental calls to free.
(symbol_destructor_set, symbol_printer_set): Adjust.
* src/symtab.c: Adjust.
-2005-09-16 Akim <akim@epita.fr>
+2005-09-16 Akim Demaille <akim@epita.fr>
* data/c.m4 (b4_token_enums): New.
(b4_token_defines): Rename as...
Bison News
----------
-Changes in version 2.0b, 2005-07-24:
+Changes in version 2.1, 2005-09-16:
* Bison-generated parsers now support the translation of diagnostics like
"syntax error" into languages other than English. The default
behind on the stack. Also, the start symbol is now destroyed after a
successful parse. In both cases, the behavior was formerly inconsistent.
-* The yytname array now contains the same contents that it did in 2.0,
- undoing an incompatible and undocumented change made in 2.0a.
-
-Changes in version 2.0a, 2005-05-22:
-
* When generating verbose diagnostics, Bison-generated parsers no longer
quote the literal strings associated with tokens. For example, for
a syntax error associated with '%token NUM "number"' they might
# least Autoconf 2.59.
AC_PREREQ(2.59)
-AC_INIT([GNU Bison], [2.0c], [bug-bison@gnu.org])
+AC_INIT([GNU Bison], [2.1], [bug-bison@gnu.org])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
if (yys->yysemantics.yyfirstVal)
{
yySemanticOption *yyoption = yys->yysemantics.yyfirstVal;
- yyGLRState *yyrhs;
+ yyGLRState *yyrh;
int yyn;
- for (yyrhs = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
+ for (yyrh = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
yyn > 0;
- yyrhs = yyrhs->yypred, yyn -= 1)
- yydestroyGLRState (yymsg, yyrhs);
+ yyrh = yyrh->yypred, yyn -= 1)
+ yydestroyGLRState (yymsg, yyrh);
}
}
}
# define YYERROR_VERBOSE ]b4_error_verbose[
#endif
+#if YYERROR_VERBOSE
+# define YYERROR_VERBOSE_IF(x) x
+#else
+# define YYERROR_VERBOSE_IF(x) /* empty */
+#endif
+
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE ]b4_token_table[
/// Generate an error message.
/// \param tok the look-ahead token.
- virtual std::string yysyntax_error_ (int tok);
+ virtual std::string yysyntax_error_ (YYERROR_VERBOSE_IF (int tok));
#if YYDEBUG
/// \brief Report a symbol on the debug stream.
if (!yyerrstatus_)
{
++yynerrs_;
- error (yylloc, yysyntax_error_ (yyilooka));
+ error (yylloc, yysyntax_error_ (YYERROR_VERBOSE_IF (yyilooka)));
}
yyerror_range[0] = yylloc;
// Generate an error message.
std::string
-yy::]b4_parser_class_name[::yysyntax_error_ (int tok)
+yy::]b4_parser_class_name[::yysyntax_error_ (YYERROR_VERBOSE_IF (int tok))
{
std::string res;
#if YYERROR_VERBOSE
/* About the skeletons. */
{
- char const* p = getenv ("BISON_PKGDATADIR");
- MUSCLE_INSERT_STRING ("pkgdatadir", p ? p : PKGDATADIR);
+ char const *pkgdatadir = getenv ("BISON_PKGDATADIR");
+ MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir ? pkgdatadir : PKGDATADIR);
MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
}
}
AT_SETUP([Duplicate representation of merged trees])
AT_DATA_GRAMMAR([glr-regr4.y],
-[[%union { char *ptr; }
+[[
+%union { char *ptr; }
%type <ptr> S A A1 A2 B
%glr-parser
#include <stdlib.h>
#include <string.h>
static char *merge (YYSTYPE, YYSTYPE);
- static char *make_value (char *, char *);
+ static char *make_value (char const *, char const *);
static void yyerror (char const *);
static int yylex (void);
%}
}
static char *
-make_value (char *parent, char *child)
+make_value (char const *parent, char const *child)
{
char const format[] = "%s <- %s";
char *value =
AT_SETUP([User destructor for unresolved GLR semantic value])
AT_DATA_GRAMMAR([glr-regr5.y],
-[[%{
+[[
+%{
#include <stdio.h>
#include <stdlib.h>
static void yyerror (char const *);
AT_SETUP([User destructor after an error during a split parse])
AT_DATA_GRAMMAR([glr-regr6.y],
-[[%{
+[[
+%{
#include <stdio.h>
#include <stdlib.h>
static void yyerror (char const *);
])
AT_CLEANUP
+
+
+## ------------------------------------------------------------------------- ##
+## Duplicated user destructor for lookahead ##
+## Thanks to Joel E. Denny for this test; see ##
+## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>. ##
+## ------------------------------------------------------------------------- ##
+
+AT_SETUP([Duplicated user destructor for lookahead])
+
+AT_DATA_GRAMMAR([glr-regr7.y],
+[[
+%{
+ #include <stdio.h>
+ #include <stdlib.h>
+ static void yyerror (char const *);
+ static int yylex (void);
+ #define YYSTACKEXPANDABLE 0
+%}
+
+%glr-parser
+%union { int *count; }
+%type <count> 'a'
+
+%destructor {
+ if ((*$$)++)
+ fprintf (stderr, "Destructor called on same value twice.\n");
+} 'a'
+
+%%
+
+start:
+ stack1 start
+ | stack2 start
+ | /* empty */
+ ;
+stack1: 'a' ;
+stack2: 'a' ;
+
+%%
+
+static int
+yylex (void)
+{
+ yylval.count = malloc (sizeof (int));
+ if (!yylval.count)
+ {
+ fprintf (stderr, "Test inconclusive.\n");
+ exit (EXIT_FAILURE);
+ }
+ *yylval.count = 0;
+ return 'a';
+}
+
+static void
+yyerror (char const *msg)
+{
+ fprintf (stderr, "%s\n", msg);
+}
+
+int
+main (void)
+{
+ return yyparse ();
+}
+]])
+
+AT_CHECK([[bison -o glr-regr7.c glr-regr7.y]], 0, [],
+[glr-regr7.y: conflicts: 2 reduce/reduce
+])
+AT_COMPILE([glr-regr7])
+
+AT_CHECK([[exit 77; ./glr-regr7]], 2, [],
+[memory exhausted
+])
+
+AT_CLEANUP