[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Merge branch 'maint' into master
From: |
Akim Demaille |
Subject: |
Merge branch 'maint' into master |
Date: |
Sun, 5 Apr 2020 09:48:54 +0200 |
Merge branch 'maint'
* maint:
maint: post-release administrivia
version 3.5.4
examples: reccalc: really compile cleanly in C99
news: announce that Bison 3.6 drops YYERROR_VERBOSE
news: update for 3.5.4
style: fix spellos
typo: succesful -> successful
package: improve the readme
java: check and fix support for api.token.raw
java: style: prefer 'int[] foo' to 'int foo[]'
build: fix syntax-check issues
tests: recheck: work properly when the test suite was interrupted
doc: c++: promote api.token.raw
build: fix compatibility with old compilers
examples: reccalc: compile cleanly in C99
diff --git a/.prev-version b/.prev-version
index 444877d4..65afb3b8 100644
--- a/.prev-version
+++ b/.prev-version
@@ -1 +1 @@
-3.5.3
+3.5.4
diff --git a/NEWS b/NEWS
index 062efd83..d3017c8a 100644
--- a/NEWS
+++ b/NEWS
@@ -130,6 +130,26 @@ GNU Bison NEWS
location tracking, internationalized custom error messages, lookahead
correction, rich debug traces, etc.
+* Noteworthy changes in release 3.5.4 (2020-04-05) [stable]
+
+** WARNING: Future backward-incompatibilities!
+
+ TL;DR: replace "#define YYERROR_VERBOSE 1" by "%define parse.error verbose".
+
+ Bison 3.6 will no longer support the YYERROR_VERBOSE macro; the parsers
+ that still depend on it will produce Yacc-like error messages (just
+ "syntax error"). It was superseded by the "%error-verbose" directive in
+ Bison 1.875 (2003-01-01). Bison 2.6 (2012-07-19) clearly announced that
+ support for YYERROR_VERBOSE would be removed. Note that since Bison 3.0
+ (2013-07-25), "%error-verbose" is deprecated in favor of "%define
+ parse.error verbose".
+
+** Bug fixes
+
+ Fix portability issues of the package itself on old compilers.
+
+ Fix api.token.raw support in Java.
+
* Noteworthy changes in release 3.5.3 (2020-03-08) [stable]
** Bug fixes
diff --git a/README b/README
index f8d79755..f5748c3c 100644
--- a/README
+++ b/README
@@ -1,4 +1,19 @@
-This package contains the GNU Bison parser generator.
+GNU Bison is a general-purpose parser generator that converts an annotated
+context-free grammar into a deterministic LR or generalized LR (GLR) parser
+employing LALR(1) parser tables. Bison can also generate IELR(1) or
+canonical LR(1) parser tables. Once you are proficient with Bison, you can
+use it to develop a wide range of language parsers, from those used in
+simple desk calculators to complex programming languages.
+
+Bison is upward compatible with Yacc: all properly-written Yacc grammars
+work with Bison with no change. Anyone familiar with Yacc should be able to
+use Bison with little trouble. You need to be fluent in C, C++ or Java
+programming in order to use Bison.
+
+Bison and the parsers it generates are portable, they do not require any
+specific compilers.
+
+GNU Bison's home page is https://gnu.org/software/bison/.
# Installation
## Build from git
@@ -103,7 +118,8 @@ fill-column: 76
ispell-dictionary: "american"
End:
-LocalWords: parsers ngettext Texinfo pdf html YYYY ZZZZ ispell american
-LocalWords: MERCHANTABILITY
+LocalWords: parsers ngettext Texinfo pdf html YYYY ZZZZ ispell american md
+LocalWords: MERCHANTABILITY GLR LALR IELR submodule init README src bw
+LocalWords: Relocatability symlinks symlink
-->
diff --git a/THANKS b/THANKS
index fbaf3237..9d49461e 100644
--- a/THANKS
+++ b/THANKS
@@ -62,6 +62,7 @@ Enrico Scholz address@hidden
Eric Blake address@hidden
Eric S. Raymond address@hidden
Étienne Renault address@hidden
+Evan Lavelle address@hidden
Evan Nemerson address@hidden
Evgeny Stambulchik address@hidden
Fabrice Bauzac address@hidden
diff --git a/data/skeletons/java.m4 b/data/skeletons/java.m4
index d7d7df8a..e3533f4f 100644
--- a/data/skeletons/java.m4
+++ b/data/skeletons/java.m4
@@ -112,8 +112,8 @@ m4_define([b4_null], [null])
m4_define([b4_typed_parser_table_define],
[m4_ifval([$4], [b4_comment([$4])
])dnl
-[private static final ]$1[[] yy$2_ = yy$2_init ();
- private static final ]$1[[] yy$2_init ()
+[private static final ]$1[[] yy$2_ = yy$2_init();
+ private static final ]$1[[] yy$2_init()
{
return new ]$1[[]
{
diff --git a/examples/c/reccalc/parse.y b/examples/c/reccalc/parse.y
index 6d645294..ae80942c 100644
--- a/examples/c/reccalc/parse.y
+++ b/examples/c/reccalc/parse.y
@@ -4,7 +4,11 @@
// Emitted in the header file, before the definition of YYSTYPE.
%code requires
{
+ #ifndef YY_TYPEDEF_YY_SCANNER_T
+ # define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
+ #endif
+
typedef struct
{
// Whether to print the intermediate results.
@@ -132,7 +136,6 @@ exp:
%%
// Epilogue (C code).
-
#include "scan.h"
result
diff --git a/src/complain.c b/src/complain.c
index 9696dfaf..dd6d4887 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -42,9 +42,9 @@ bool warnings_are_errors = false;
/** Whether -Werror/-Wno-error was applied to a warning. */
typedef enum
{
- errority_unset = 0, /** No explict status. */
- errority_disabled = 1, /** Explictly disabled with -Wno-error=foo. */
- errority_enabled = 2 /** Explictly enabled with -Werror=foo. */
+ errority_unset = 0, /** No explicit status. */
+ errority_disabled = 1, /** Explicitly disabled with -Wno-error=foo. */
+ errority_enabled = 2 /** Explicitly enabled with -Werror=foo. */
} errority;
/** For each warning type, its errority. */
diff --git a/src/print-xml.c b/src/print-xml.c
index a7d165dc..61fb93b4 100644
--- a/src/print-xml.c
+++ b/src/print-xml.c
@@ -329,7 +329,7 @@ print_reductions (FILE *out, int level, state *s)
/*--------------------------------------------------------------.
| Report on OUT all the actions (shifts, gotos, reductions, and |
-| explicit erros from %nonassoc) of S. |
+| explicit errors from %nonassoc) of S. |
`--------------------------------------------------------------*/
static void
diff --git a/src/print.c b/src/print.c
index b0c89319..259c16b3 100644
--- a/src/print.c
+++ b/src/print.c
@@ -319,7 +319,7 @@ print_reductions (FILE *out, state *s)
/*--------------------------------------------------------------.
| Report on OUT all the actions (shifts, gotos, reductions, and |
-| explicit erros from %nonassoc) of S. |
+| explicit errors from %nonassoc) of S. |
`--------------------------------------------------------------*/
static void
diff --git a/src/scan-code.l b/src/scan-code.l
index db6d0764..8259bfd3 100644
--- a/src/scan-code.l
+++ b/src/scan-code.l
@@ -612,7 +612,7 @@ handle_action_dollar (symbol_list *rule, char *text, const
location *dollar_loc)
char *cp = fetch_type_name (text + 1, &type_name, dollar_loc);
int n = parse_ref (cp, effective_rule, effective_rule_length,
rule->midrule_parent_rhs_index, text, dollar_loc, '$');
- /* End type_name. Don't do it ealier: parse_ref depends on TEXT. */
+ /* End type_name. Don't do it earlier: parse_ref depends on TEXT. */
if (type_name)
cp[-1] = '\0';
diff --git a/src/symtab.h b/src/symtab.h
index c7e916b5..d16c0270 100644
--- a/src/symtab.h
+++ b/src/symtab.h
@@ -135,7 +135,7 @@ struct sym_content
/** Its \c \%type's location. */
location type_loc;
- /** Any \c \%destructor (resp. \%printer) declared specificially for this
+ /** Any \c \%destructor (resp. \%printer) declared specifically for this
symbol.
Access this field only through <tt>symbol</tt>'s interface functions. For
diff --git a/src/system.h b/src/system.h
index 0210f6c6..606d3c46 100644
--- a/src/system.h
+++ b/src/system.h
@@ -73,9 +73,14 @@ typedef size_t uintptr_t;
# include <verify.h>
# include <xalloc.h>
+// Clang and ICC like to pretend they are GCC.
+# if defined __GNUC__ && !defined __clang__ && !defined __ICC
+# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
+# endif
-/* See https://lists.gnu.org/archive/html/bug-bison/2019-10/msg00061.html. */
-# if defined __GNUC__ && ! defined __clang__ && ! defined __ICC && __GNUC__ < 5
+// See https://lists.gnu.org/archive/html/bug-bison/2019-10/msg00061.html
+// and https://trac.macports.org/ticket/59927.
+# if defined GCC_VERSION && 405 <= GCC_VERSION
# define IGNORE_TYPE_LIMITS_BEGIN \
_Pragma ("GCC diagnostic push") \
_Pragma ("GCC diagnostic ignored \"-Wtype-limits\"")
diff --git a/tests/local.at b/tests/local.at
index c34c2b1b..d43f9b25 100644
--- a/tests/local.at
+++ b/tests/local.at
@@ -260,6 +260,11 @@ m4_rpatsubst([$3], [%parse-param { *\([^{}]*[^{} ]\)
*}\([^{}].*\)?$],
m4_ifndef([AT_PARSE_PARAMS],
[m4_define([AT_PARSE_PARAMS])])
+m4_pushdef([AT_PARSER_CLASS],
+[m4_bmatch([$3], [%define *api\.parser\.class {\([^\}]*\)}],
+ [m4_bregexp([$3], [%define *api\.parser\.class {\([^\}]*\)}],
[\1])],
+ [AT_API_PREFIX[]Parser])])
+
m4_pushdef([AT_PURE_IF],
[m4_bmatch([$3], [%define *api\.pure\|%pure-parser],
[m4_bmatch([$3], [%define *api\.pure *false], [$2], [$1])],
@@ -409,6 +414,7 @@ m4_popdef([AT_LOCATION_IF])
m4_undefine([AT_PARSE_PARAMS])
m4_popdef([AT_PUSH_IF])
m4_popdef([AT_PURE_IF])
+m4_popdef([AT_PARSER_CLASS])
m4_popdef([AT_PARAM_IF])
m4_popdef([AT_LEXPARAM_IF])
m4_popdef([AT_LAC_IF])
@@ -1022,7 +1028,9 @@ m4_define([AT_MAIN_DEFINE(java)],
public static void main (String[] args) throws IOException
{
]AT_API_prefix[Parser p = new ]AT_API_prefix[Parser ();
- System.exit (p.parse () ? 0 : 1);
+ boolean success = p.parse ();
+ if (!success)
+ System.exit (1);
}
}]])
diff --git a/tests/local.mk b/tests/local.mk
index b7e7cc59..fac8426f 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -99,7 +99,7 @@ recheck: $(RUN_TESTSUITE_deps)
$(RUN_TESTSUITE) \
$$(perl -n \
-e 'eof && /^(\d+).*: FAILED/ && print "$$1 "' \
- %D%/testsuite.dir/*/testsuite.log)
+ %D%/testsuite.dir/*/testsuite.log)
check-local: $(RUN_TESTSUITE_deps)
$(RUN_TESTSUITE)
diff --git a/tests/scanner.at b/tests/scanner.at
index 43484cfe..bc05538a 100644
--- a/tests/scanner.at
+++ b/tests/scanner.at
@@ -158,6 +158,78 @@ m4_pushdef([AT_MAIN_DEFINE(d)],
}]])
+m4_pushdef([AT_MAIN_DEFINE(java)],
+[[class input
+{
+ public static void main (String[] args) throws IOException
+ {]AT_LEXPARAM_IF([[
+ ]AT_PARSER_CLASS[ p = new ]AT_PARSER_CLASS[ (System.in);]], [[
+ ]AT_API_prefix[Lexer l = new ]AT_API_prefix[Lexer (System.in);
+ ]AT_PARSER_CLASS[ p = new ]AT_PARSER_CLASS[ (l);]])AT_DEBUG_IF([[
+ //p.setDebugLevel (1);]])[
+ boolean success = p.parse ();
+ if (!success)
+ System.exit (1);
+ }
+}]])
+
+m4_define([AT_RAW_YYLEX(java)],
+[[class CalcLexer implements Calc.Lexer {
+
+ StreamTokenizer st;
+
+ public CalcLexer (InputStream is)
+ {
+ st = new StreamTokenizer (new StringReader ("0-(1+2)*3/9"));
+ st.resetSyntax ();
+ st.eolIsSignificant (true);
+ st.whitespaceChars ('\t', '\t');
+ st.whitespaceChars (' ', ' ');
+ st.wordChars ('0', '9');
+ }
+
+ public void yyerror (String s)
+ {
+ System.err.println (s);
+ }
+
+ Integer yylval;
+
+ public Object getLVal () {
+ return yylval;
+ }
+
+ public int yylex () throws IOException {
+ int ttype = st.nextToken ();
+ switch (ttype)
+ {
+ case StreamTokenizer.TT_EOF:
+ return EOF;
+ case StreamTokenizer.TT_EOL:
+ return (int) '\n';
+ case StreamTokenizer.TT_WORD:
+ yylval = new Integer (st.sval);
+ return NUM;
+ case '+':
+ return PLUS;
+ case '-':
+ return MINUS;
+ case '*':
+ return STAR;
+ case '/':
+ return SLASH;
+ case '(':
+ return LPAR;
+ case ')':
+ return RPAR;
+ default:
+ throw new AssertionError ("invalid character: " + ttype);
+ }
+ }
+}
+]])
+
+
## ------------------- ##
## Raw token numbers. ##
## ------------------- ##
@@ -166,19 +238,31 @@ m4_pushdef([AT_TEST],
[
AT_SETUP([Token numbers: $1])
-AT_BISON_OPTION_PUSHDEFS([%debug $1])
+AT_BISON_OPTION_PUSHDEFS([%debug ]m4_bmatch([$1], [java], [[%define api.prefix
{Calc} %define api.parser.class {Calc}]])[ $1])
AT_DATA_GRAMMAR([[input.y]],
[[$1
%debug
-]AT_D_IF([], [[
+]AT_LANG_MATCH([[c\|c++]], [[
%code
{
#include <stdio.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-}]])[
+}]],
+ [java], [[
+%define api.prefix {Calc}
+%define api.parser.class {Calc}
+%code imports {
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.io.StringReader;
+ import java.io.Reader;
+ import java.io.StreamTokenizer;
+}
+]])[
-]AT_VARIANT_IF([[
+]AT_LANG_MATCH([c\|c++\|d],
+[AT_VARIANT_IF([[
%token <int> NUM "number"
%nterm <int> exp
]], [[
@@ -187,6 +271,10 @@ AT_DATA_GRAMMAR([[input.y]],
}
%token <val> NUM "number"
%nterm <val> exp
+]])],
+ [java],
+[[%token <Integer> NUM "number"
+%type <Integer> exp
]])[
%token
@@ -204,7 +292,7 @@ AT_DATA_GRAMMAR([[input.y]],
%%
input
-: exp { printf ("%d\n", $][1); }
+: exp { ]AT_JAVA_IF([[System.out.println ($][1)]], [[printf ("%d\n",
$][1)]])[; }
;
exp
@@ -217,21 +305,26 @@ exp
;
%%
-]AT_YYERROR_DEFINE[
+]AT_LANG_MATCH([c\|c++\|d],
+ [AT_YYERROR_DEFINE])[
]AT_RAW_YYLEX[
]AT_MAIN_DEFINE[
]])
AT_FULL_COMPILE([input])
+# When api.token.raw, the yytranslate table should not be included.
+#
# yacc.c, glr.c and glr.cc use 'yytranslate' (and YYTRANSLATE).
# lalr1.cc uses 'translate_table' (and yytranslate_).
# lalr1.d uses 'byte[] translate_table =' (and yytranslate_).
-AT_CHECK([[$EGREP -c 'yytranslate\[\]|translate_table\[\]|translate_table ='
input.]AT_LANG_EXT],
+# lalr1.java uses 'byte[] translate_table_ =' (and yytranslate_).
+AT_CHECK([[$EGREP -c 'yytranslate\[\]|translate_table\[\]|translate_table
=|translate_table_ =' input.]AT_LANG_EXT],
[ignore],
[AT_TOKEN_RAW_IF([0], [1])[
]])
+
AT_PARSER_CHECK([input], 0,
[[-1
]])
@@ -240,11 +333,12 @@ AT_BISON_OPTION_POPDEFS
AT_CLEANUP
])
-m4_foreach([b4_skel], [[yacc.c], [glr.c], [lalr1.cc], [glr.cc], [lalr1.d]],
+m4_foreach([b4_skel], [[yacc.c], [glr.c], [lalr1.cc], [glr.cc], [lalr1.java],
[lalr1.d]],
[AT_TEST([%skeleton "]b4_skel["])
AT_TEST([%skeleton "]b4_skel[" %define api.token.raw])])
AT_TEST([%skeleton "lalr1.cc" %define api.token.raw %define api.value.type
variant %define api.token.constructor])])
+m4_popdef([AT_MAIN_DEFINE(java)])
m4_popdef([AT_MAIN_DEFINE(d)])
m4_popdef([AT_TEST])
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Merge branch 'maint' into master,
Akim Demaille <=