bison-patches
[Top][All Lists]
Advanced

[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])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]