mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-08-13 04:35:14 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5604903f7a | ||
|
|
678853da7e | ||
|
|
961ea2ac85 | ||
|
|
cc6e5cf854 | ||
|
|
1376a7c6e2 | ||
|
|
1c273826d4 | ||
|
|
4a55a5ea9a | ||
|
|
72f04ca80f | ||
|
|
cca8c73431 | ||
|
|
cb40f5c624 | ||
|
|
6c23b012b9 | ||
|
|
ef88dfba81 | ||
|
|
6e89bc0fd2 | ||
|
|
e3e21cc0d8 | ||
|
|
15ea35019f |
+1
-1
@@ -1 +1 @@
|
||||
3.5.2
|
||||
3.5.3
|
||||
|
||||
@@ -1,5 +1,25 @@
|
||||
GNU Bison NEWS
|
||||
|
||||
* 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
|
||||
|
||||
@@ -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
|
||||
|
||||
-->
|
||||
|
||||
@@ -61,6 +61,7 @@ Enrico Scholz [email protected]
|
||||
Eric Blake [email protected]
|
||||
Eric S. Raymond [email protected]
|
||||
Étienne Renault [email protected]
|
||||
Evan Lavelle [email protected]
|
||||
Evan Nemerson [email protected]
|
||||
Evgeny Stambulchik [email protected]
|
||||
Fabrice Bauzac [email protected]
|
||||
|
||||
@@ -109,7 +109,7 @@ 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_ = yy$2_init();
|
||||
private static final ]$1[[] yy$2_init()
|
||||
{
|
||||
return new ]$1[[]
|
||||
|
||||
@@ -1012,7 +1012,7 @@ b4_dollar_popdef[]dnl
|
||||
private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
|
||||
]b4_api_token_raw_if(dnl
|
||||
[[ {
|
||||
return t;
|
||||
return (]b4_int_type_for([b4_translate])[) t;
|
||||
}
|
||||
]],
|
||||
[[ {
|
||||
|
||||
+15
-4
@@ -12105,13 +12105,24 @@ designed the grammar for.
|
||||
%defines
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
@findex %define api.token.raw
|
||||
Because our scanner returns only genuine tokens and never simple characters
|
||||
(i.e., it returns @samp{PLUS}, not @samp{'+'}), we can avoid conversions.
|
||||
|
||||
@comment file: calc++/parser.yy
|
||||
@example
|
||||
%define api.token.raw
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
@findex %define api.token.constructor
|
||||
@findex %define api.value.type variant
|
||||
This example will use genuine C++ objects as semantic values, therefore, we
|
||||
require the variant-based interface. To make sure we properly use it, we
|
||||
enable assertions. To fully benefit from type-safety and more natural
|
||||
definition of ``symbol'', we enable @code{api.token.constructor}.
|
||||
This example uses genuine C++ objects as semantic values, therefore, we
|
||||
require the variant-based storage of semantic values. To make sure we
|
||||
properly use it, we enable assertions. To fully benefit from type-safety
|
||||
and more natural definition of ``symbol'', we enable
|
||||
@code{api.token.constructor}.
|
||||
|
||||
@comment file: calc++/parser.yy
|
||||
@example
|
||||
|
||||
@@ -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
|
||||
|
||||
+3
-3
@@ -41,9 +41,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. */
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -617,7 +617,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';
|
||||
|
||||
|
||||
+1
-1
@@ -130,7 +130,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
|
||||
|
||||
+7
-2
@@ -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\"")
|
||||
|
||||
+1
-1
@@ -720,7 +720,7 @@ _AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (1 2) = 1], [113],
|
||||
calc: error: 2222 != 1])
|
||||
|
||||
# Check that yyerrok works properly: second error is not reported,
|
||||
# third and fourth are. Parse status is succesful.
|
||||
# third and fourth are. Parse status is successful.
|
||||
_AT_CHECK_CALC_ERROR([$1], [0], [(* *) + (*) + (*)], [113],
|
||||
[1.2: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
|
||||
1.10: syntax error, unexpected '*', expecting number or '-' or '(' or '!'
|
||||
|
||||
+19
-2
@@ -233,6 +233,11 @@ m4_pushdef([AT_PARSE_PARAMS])
|
||||
m4_bpatsubst([$3], [%parse-param { *\([^{}]*[^{} ]\) *}],
|
||||
[m4_append([AT_PARSE_PARAMS], [\1, ])])
|
||||
|
||||
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])],
|
||||
@@ -382,6 +387,7 @@ m4_popdef([AT_LOCATION_IF])
|
||||
m4_popdef([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_YACC_IF])
|
||||
@@ -409,6 +415,12 @@ m4_define([AT_LANG_CASE],
|
||||
[m4_case(AT_LANG, $@)])
|
||||
|
||||
|
||||
# AT_LANG_MATCH(LANG1, IF-LANG1, LANG2, IF-LANG2, ..., DEFAULT)
|
||||
# ------------------------------------------------------------
|
||||
m4_define([AT_LANG_MATCH],
|
||||
[m4_bmatch(AT_LANG, $@)])
|
||||
|
||||
|
||||
# _AT_LANG_DISPATCH(LANG, MACRO, ARGS)
|
||||
# ------------------------------------
|
||||
# Call the specialization of MACRO for LANG with ARGS. Complain if
|
||||
@@ -747,6 +759,9 @@ m4_define([AT_MAIN_DEFINE(d)],
|
||||
# ------------------------------
|
||||
m4_copy([AT_DATA], [AT_DATA_GRAMMAR(java)])
|
||||
|
||||
# No need to declare, it's part of the class interface.
|
||||
m4_define([AT_YYERROR_DECLARE(java)], [])
|
||||
m4_define([AT_YYERROR_DECLARE_EXTERN(java)], [])
|
||||
|
||||
# AT_JAVA_POSITION_DEFINE
|
||||
# -----------------------
|
||||
@@ -829,10 +844,12 @@ m4_define([AT_YYLEX_DEFINE(java)],
|
||||
m4_define([AT_MAIN_DEFINE(java)],
|
||||
[[class input
|
||||
{
|
||||
public static void main (String args[]) throws IOException
|
||||
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);
|
||||
}
|
||||
}]])
|
||||
|
||||
|
||||
+4
-4
@@ -96,10 +96,10 @@ clean-local-tests:
|
||||
|
||||
.PHONY: recheck
|
||||
recheck: $(RUN_TESTSUITE_deps)
|
||||
$(RUN_TESTSUITE) \
|
||||
$$(perl -n \
|
||||
-e 'if (/Summary of the failures/../Detailed failed tests/)' \
|
||||
-e '{ /^ *[0-9]+:/ && s/:.*//s && print }' %D%/testsuite.log)
|
||||
$(RUN_TESTSUITE) \
|
||||
$$(perl -n \
|
||||
-e 'eof && /^(\d+).*: FAILED/ && print "$$1 "' \
|
||||
%D%/testsuite.dir/*/testsuite.log)
|
||||
|
||||
check-local: $(RUN_TESTSUITE_deps)
|
||||
$(RUN_TESTSUITE)
|
||||
|
||||
+102
-8
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user