Compare commits

..
19 Commits
Author SHA1 Message Date
Akim Demaille 659376b590 version 3.8.1
* NEWS: Record release date.
2021-09-11 08:26:40 +02:00
Akim Demaille 0343acbe89 portability: don't use strtof
It is not available on HP-UX 11i.
Reported by Larkin Nickle <[email protected]>.
<https://lists.gnu.org/r/bug-bison/2021-09/msg00012.html>

Gnulib provides no replacement, but anyway we should be using doubles,
since difftime uses doubles.

* bootstrap.conf: We want portability on stdtod.
* src/counterexample.c: Use double, not float, for time measurements.
2021-09-11 08:26:10 +02:00
Akim Demaille 5d9ccd5a87 yacc: declare yyerror/yylex only when POSIXLY_CORRECT
The recent changes to comply with POSIX are breaking Automake's test
suite.
Reported by Kiyoshi Kanazawa.
<https://lists.gnu.org/r/bug-bison/2021-09/msg00005.html>

To limit the impact of POSIX changes, bind them to $POSIXLY_CORRECT.
Suggested by Karl Berry.
<https://lists.gnu.org/r/bug-bison/2021-09/msg00009.html>

The existing `maintainer-check-posix` Make target checks these
changes.

* src/getargs.h, src/getargs.c (set_yacc): New.
Use it.
* data/skeletons/bison.m4 (b4_posix_if): New.
* data/skeletons/yacc.c (b4_declare_yyerror_and_yylex): Use it.
* doc/bison.texi, tests/local.at: Adjust.
2021-09-11 08:26:10 +02:00
Akim Demaille ad9b8a069f maint: post-release administrivia
* NEWS: Add header line for next release.
* .prev-version: Record previous version.
* cfg.mk (old_NEWS_hash): Auto-update.
2021-09-07 20:56:23 +02:00
Akim Demaille ec3375ab4e version 3.8
* NEWS: Record release date.
2021-09-07 20:28:49 +02:00
Akim Demaille 12c8e427c7 news: update 2021-09-07 20:28:36 +02:00
Akim Demaille 9f8f3d2e77 maint: post-release administrivia
* NEWS: Add header line for next release.
* .prev-version: Record previous version.
* cfg.mk (old_NEWS_hash): Auto-update.
2021-09-02 07:56:44 +02:00
Akim Demaille 108724c2e7 version 3.7.91
* NEWS: Record release date.
2021-09-02 07:31:20 +02:00
Akim Demaille da0f993fb9 tests: disable "Multistart reports"
For some reason this test fails on Solaris/x86.  But multistart is not
part of 3.8, so we can postpone the debugging of this issue.
Reported by Dagobert Michelsen.
<https://lists.gnu.org/r/bug-bison/2021-08/msg00027.html>

* tests/report.at (Multistart reports): Comment out.
2021-09-02 07:27:42 +02:00
Akim Demaille 075a879052 style: c++: formatting changes
* data/skeletons/variant.hh, data/skeletons/glr2.cc: Fix space before
paren issue.
2021-08-29 18:36:07 +02:00
Akim Demaille a7ded4284e style: rename stmtMerge as stmt_merge
Follow the GNU Coding Style.

* doc/bison.texi, examples/c++/glr/c++-types.yy,
* examples/c/glr/c++-types.y, tests/cxx-type.at: s/stmtMerge/stmt_merge/g.
2021-08-29 16:25:38 +02:00
Akim Demaille a5c55bb758 c++: beware of Visual C++ limitations
Contrary to what commit d8cc6b073e "c++:
shorten the assertions that check whether tokens are correct"
believed, MS Visual C++'s preprocessor limitation is not on the input
line length, but on the size of the line holding the full C++
statement.

Reported by Vince Huffaker <[email protected]>
<https://lists.gnu.org/r/help-bison/2021-08/msg00003.html>

* data/skeletons/variant.hh (_b4_symbol_constructor_define): Hide the
assertion from Visual C++.
2021-08-29 10:10:56 +02:00
Akim Demaille bc5aa8e274 tests: don't postprocess stderr with sed
On Solaris, sed throws away the NUL bytes from the stream, even in C
locale.  So instead of postprocessing bison's stderr to neutralize
changes in value of `argv[0]`, use an envvar to actually neutralize
variations of `argv[0]` during tests.

Reported by Dagobert Michelsen.
<https://lists.gnu.org/r/bug-bison/2021-08/msg00025.html>

* src/main.c (main): Change `argv[0]` if BISON_PROGRAM_NAME is
defined.
* tests/bison.in: No longer mess with stderr, just pass
the expected BISON_PROGRAM_NAME value.
2021-08-29 09:50:02 +02:00
Akim Demaille 0a82bf5c07 CI: don't require Autoconf 2.71 2021-08-19 10:07:51 +02:00
Akim Demaille a70e75b8a4 examples: don't demonstrate multistart, which is not part of 3.8
Besides, for mysterious reasons, this fails on some environment.
Reported by Dagobert Michelsen.
<https://lists.gnu.org/archive/html/bug-bison/2021-08/msg00008.html>

* examples/c/lexcalc/lexcalc.test, examples/c/lexcalc/parse.y,
* examples/c/lexcalc/scan.l: Revert to a single-start example.
2021-08-19 09:19:07 +02:00
Akim Demaille 3afa9757da tests: grep -E is not portable
Reported by Dagobert Michelsen.
<https://lists.gnu.org/r/bug-bison/2021-08/msg00008.html>

* tests/calc.at: Use $EGREP.
2021-08-19 08:21:23 +02:00
Akim Demaille 36f37568ba glr2.cc: require C++11
Reported by Dagobert Michelsen.
https://lists.gnu.org/r/bug-bison/2021-08/msg00006.html

* m4/bison-cxx-std.m4 (_BISON_CXXSTD_98_snippet): We don't need
vector::data, it was only for glr2.cc, which is C++11 anyway.
(_BISON_CXXSTD_11_snippet): We need vector::data and std::swap on
arrays.
* m4/cxx.m4 (BISON_TEST_FOR_WORKING_CXX_COMPILER): We don't need
vector::data.
* tests/local.at (AT_COMPILE_CXX): Skip when glr2.cc and no support
for C++11.
2021-08-19 08:21:22 +02:00
Akim Demaille f2c568d3ef readme: add D 2021-08-13 09:06:34 +02:00
Akim Demaille bb7860d208 maint: post-release administrivia
* NEWS: Add header line for next release.
* .prev-version: Record previous version.
* cfg.mk (old_NEWS_hash): Auto-update.
2021-08-13 08:47:37 +02:00
34 changed files with 1774 additions and 1773 deletions
+1 -1
View File
@@ -1 +1 @@
3.7.6
3.8
+2
View File
@@ -44,6 +44,8 @@ jobs:
- git fetch --unshallow || true
- git submodule update --init --recursive
# As of 2021-08, we don't have Autoconf 2.71 on Ubuntu.
- sed -i 's/AC_PREREQ(\[2\.71\])/AC_PREREQ([2.69])/g' configure.ac
- ./bootstrap
- ./configure --enable-gcc-warnings || { cat config.log && false; }
- make -j2
+13 -2
View File
@@ -1,6 +1,17 @@
GNU Bison NEWS
* Noteworthy changes in release 3.7.90 (2021-08-13) [beta]
* Noteworthy changes in release 3.8.1 (2021-09-11) [stable]
The generation of prototypes for yylex and yyerror in Yacc mode is
breaking existing grammar files. To avoid breaking too many grammars, the
prototypes are now generated when `-y/--yacc` is used *and* the
`POSIXLY_CORRECT` environment variable is defined.
Avoid using `-y`/`--yacc` simply to comply with Yacc's file name
conventions, rather, use `-o y.tab.c`. Autoconf's AC_PROG_YACC macro uses
`-y`. Avoid it if possible, for instance by using gnulib's gl_PROG_BISON.
* Noteworthy changes in release 3.8 (2021-09-07) [stable]
** Backward incompatible changes
@@ -4703,7 +4714,7 @@ LocalWords: autocompletion bistromathic submessages Cayuela lexcalc hoc
LocalWords: yytoken YYUNDEF YYerror basename Automake's UTF ifdef ffile
LocalWords: gotos readline Imbimbo Wcounterexamples Wcex Nonunifying rcex
LocalWords: Vais xsltproc YYNOMEM YYLOCATION signedness YYBISON MITRE's
LocalWords: libreadline YYMALLOC YYFREE MSVC redefinitions
LocalWords: libreadline YYMALLOC YYFREE MSVC redefinitions POSIXLY
Local Variables:
ispell-dictionary: "american"
+1 -1
View File
@@ -7,7 +7,7 @@ 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
use Bison with little trouble. You need to be fluent in C, C++, D or Java
programming in order to use Bison.
Bison and the parsers it generates are portable, they do not require any
+4 -1
View File
@@ -183,7 +183,7 @@ Les catégories d'avertissements incluent :
Line -1 and -3 should mention CATEGORIE, not CATEGORY.
* Bison 3.8
* Bison 3.9
** Rewrite glr.cc (currently glr2.cc)
*** custom error messages
@@ -517,6 +517,9 @@ https://github.com/scfc/bison-php/blob/master/data/lalr1.php
https://lists.gnu.org/r/bison-patches/2013-09/msg00000.html and following
** Multiple start symbols
Revert a70e75b8a41755ab96ab211a0ea111ac68a4aadd.
Revert tests: disable "Multistart reports".
Would be very useful when parsing closely related languages. The idea is to
declare several start symbols, for instance
+1 -1
View File
@@ -45,7 +45,7 @@ gnulib_modules='
realloc-posix
relocatable-prog relocatable-script
rename
spawn-pipe stdbool stpcpy stpncpy strdup-posix strerror strverscmp
spawn-pipe stdbool stpcpy stpncpy strdup-posix strerror strtod strverscmp
sys_ioctl
termios
timevar
-5
View File
@@ -15,11 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# In order for some versions of Sun Studio to compile our C++ test cases
# correctly, we need Autoconf 2.64 or better to handle the restrict
# keyword in at least string.h from gnulib. We need Autoconf 2.68 or
# better to avoid a typo in the 'configure --help' entry for the YACC
# environment variable.
AC_PREREQ([2.71])
m4_pattern_forbid([^_?(gl_[A-Z]|AX_|BISON_)])
m4_pattern_allow([^BISON_USE_NLS$])
+1
View File
@@ -1110,6 +1110,7 @@ b4_percent_define_if_define([token_ctor], [api.token.constructor])
b4_percent_define_if_define([locations]) # Whether locations are tracked.
b4_percent_define_if_define([parse.assert])
b4_percent_define_if_define([parse.trace])
b4_percent_define_if_define([posix])
# b4_bison_locations_if([IF-TRUE])
+6 -8
View File
@@ -1370,7 +1370,6 @@ public:
check_ ();
other.check_ ();]])[
std::swap (is_state_, other.is_state_);
// NB: swap on arrays is C++11.
std::swap (raw_, other.raw_);
return *this;
}
@@ -2163,7 +2162,7 @@ b4_dollar_popdef])[]dnl
reductions on all stacks) helps prevent double destructor calls
on yylval in the event of memory exhaustion. */
for (state_set_index yys = create_state_set_index(0); yys.uget() < this->yystateStack.numTops(); ++yys)
for (state_set_index yys = create_state_set_index (0); yys.uget () < this->yystateStack.numTops (); ++yys)
YYCHK1 (this->yyprocessOneStack (yys, yyposn]b4_locations_if([, &this->yylloc])[));
this->yystateStack.yytops.yyremoveDeletes ();
if (this->yystateStack.yytops.size() == 0)
@@ -2173,7 +2172,7 @@ b4_dollar_popdef])[]dnl
this->yyFail (]b4_locations_if([&this->yylloc, ])[YY_("syntax error"));
YYCHK1 (this->yyresolveStack ());
YYCDEBUG << "Returning to deterministic operation.\n";]b4_locations_if([[
this->yyerror_range[1].getState().yyloc = this->yylloc;]])[
this->yyerror_range[1].getState ().yyloc = this->yylloc;]])[
this->yyreportSyntaxError ();
goto yyuser_error;
}
@@ -2186,12 +2185,11 @@ b4_dollar_popdef])[]dnl
yysymbol_kind_t yytoken_to_shift = this->yytoken;
this->yytoken = ]b4_symbol(empty, kind)[;
yyposn += 1;
for (state_set_index yys = create_state_set_index(0); yys.uget() < this->yystateStack.numTops(); ++yys)
for (state_set_index yys = create_state_set_index (0); yys.uget () < this->yystateStack.numTops (); ++yys)
{
const state_num yystate = this->topState(yys)->yylrState;
const state_num yystate = this->topState (yys)->yylrState;
const short* yyconflicts;
const int yyaction
= yygetLRActions (yystate, yytoken_to_shift, yyconflicts);
const int yyaction = yygetLRActions (yystate, yytoken_to_shift, yyconflicts);
/* Note that yyconflicts were handled by yyprocessOneStack. */
YYCDEBUG << "On stack " << yys.get() << ", ";
YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, this->yylval, this->yylloc);
@@ -2204,7 +2202,7 @@ b4_dollar_popdef])[]dnl
// Value type destructor.
]b4_symbol_variant([[yytoken_to_shift]], [[this->yylval]], [[template destroy]])])[
if (this->yystateStack.yytops.size() == 1)
if (this->yystateStack.yytops.size () == 1)
{
YYCHK1 (this->yyresolveStack ());
YYCDEBUG << "Returning to deterministic operation.\n";
+8 -6
View File
@@ -470,21 +470,23 @@ m4_define([_b4_symbol_constructor_define],
b4_symbol_if([$1], [has_type],
[b4_symbol([$1], [type]) v]),
b4_locations_if([location_type l]))[)
: super_type(]b4_join([token_type (tok)],
b4_symbol_if([$1], [has_type], [std::move (v)]),
b4_locations_if([std::move (l)]))[)
: super_type (]b4_join([token_type (tok)],
b4_symbol_if([$1], [has_type], [std::move (v)]),
b4_locations_if([std::move (l)]))[)
#else
symbol_type (]b4_join(
[int tok],
b4_symbol_if([$1], [has_type],
[const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l]))[)
: super_type(]b4_join([token_type (tok)],
b4_symbol_if([$1], [has_type], [v]),
b4_locations_if([l]))[)
: super_type (]b4_join([token_type (tok)],
b4_symbol_if([$1], [has_type], [v]),
b4_locations_if([l]))[)
#endif
{]b4_parse_assert_if([[
#if !defined _MSC_VER || defined __clang__
]b4_assert[ (]b4_tok_in($@)[);
#endif
]])[}
]])])
+1 -1
View File
@@ -367,7 +367,7 @@ m4_define([b4_declare_yyparse],
# Comply with POSIX Yacc.
# <https://austingroupbugs.net/view.php?id=1388#c5220>
m4_define([b4_declare_yyerror_and_yylex],
[b4_yacc_if([[#if !defined ]b4_prefix[error && !defined ]b4_api_PREFIX[ERROR_IS_DECLARED
[b4_posix_if([[#if !defined ]b4_prefix[error && !defined ]b4_api_PREFIX[ERROR_IS_DECLARED
]b4_function_declare([b4_prefix[error]], void, b4_yyerror_formals)[
#endif
#if !defined ]b4_prefix[lex && !defined ]b4_api_PREFIX[LEX_IS_DECLARED
+13 -10
View File
@@ -1283,17 +1283,17 @@ follows:
@example
stmt:
expr ';' %merge <stmtMerge>
| decl %merge <stmtMerge>
expr ';' %merge <stmt_merge>
| decl %merge <stmt_merge>
;
@end example
@noindent
and define the @code{stmtMerge} function as:
and define the @code{stmt_merge} function as:
@example
static YYSTYPE
stmtMerge (YYSTYPE x0, YYSTYPE x1)
stmt_merge (YYSTYPE x0, YYSTYPE x1)
@{
printf ("<OR> ");
return "";
@@ -1306,7 +1306,7 @@ in the C declarations at the beginning of the file:
@example
%@{
static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
static YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);
%@}
@end example
@@ -1331,7 +1331,7 @@ previous example, the merged-to symbol (@code{stmt}) does not have a
specific type, and the merger is
@example
YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);
YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);
@end example
@noindent
@@ -1358,12 +1358,12 @@ or
then the prototype of the merger must be:
@example
Node *stmtMerge (YYSTYPE x0, YYSTYPE x1);
Node *stmt_merge (YYSTYPE x0, YYSTYPE x1);
@end example
@noindent
(This signature might be a mistake originally, and maybe it should have been
@samp{Node *stmtMerge (Node *x0, Node *x1)}. If you have an opinion about
@samp{Node *stmt_merge (Node *x0, Node *x1)}. If you have an opinion about
it, please let us know.)
@node GLR Semantic Actions
@@ -11877,7 +11877,10 @@ Generate different diagnostics (it implies @option{-Wyacc}).
Generate @code{#define} statements in addition to an @code{enum} to
associate token codes with token kind names.
@item
Generate prototypes for @code{yyerror} and @code{yylex} (since Bison 3.8):
If the @code{POSIXLY_CORRECT} environment variable is defined, generate
prototypes for @code{yyerror} and @code{yylex}@footnote{See
@url{https://austingroupbugs.net/view.php?id=1388#c5220}.} (since Bison
3.8):
@example
int yylex (void);
void yyerror (const char *);
@@ -16594,7 +16597,7 @@ London, Department of Computer Science, TR-00-12 (December 2000).
@c LocalWords: rpcalc Lexer Expr ltcalc mfcalc yylex defaultprec Donnelly Gotos
@c LocalWords: yyerror pxref LR yylval cindex dfn LALR samp gpl BNF xref yypush
@c LocalWords: const int paren ifnotinfo AC noindent emph expr stmt findex lr
@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init stmtMerge POSIX
@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init POSIX ODR
@c LocalWords: pre STDC GNUC endif yy YY alloca lf stddef stdlib YYDEBUG yypull
@c LocalWords: NUM exp subsubsection kbd Ctrl ctype EOF getchar isdigit nonfree
@c LocalWords: ungetc stdin scanf sc calc ulator ls lm cc NEG prec yyerrok rr
+5 -5
View File
@@ -45,7 +45,7 @@
#include <cstring>
static Node
stmtMerge (const Node& x0, const Node& x1);
stmt_merge (const Node& x0, const Node& x1);
static yy::parser::symbol_type
yylex ();
@@ -74,9 +74,9 @@ prog : %empty
| prog stmt { std::cout << @2 << ": " << $2 << '\n'; }
;
stmt : expr ";" %merge <stmtMerge> { $$ = $1; }
| decl %merge <stmtMerge>
| error ";" { $$ = Nterm ("<error>"); }
stmt : expr ";" %merge <stmt_merge> { $$ = $1; }
| decl %merge <stmt_merge>
| error ";" { $$ = Nterm ("<error>"); }
;
expr : ID
@@ -169,7 +169,7 @@ yylex ()
}
static Node
stmtMerge (const Node& x0, const Node& x1)
stmt_merge (const Node& x0, const Node& x1)
{
return Nterm ("<OR>", x0, x1);
}
+8 -8
View File
@@ -66,7 +66,7 @@
static void free_node (Node *);
static char *node_to_string (const Node *);
static void node_print (FILE *, const Node *);
static Node *stmtMerge (YYSTYPE x0, YYSTYPE x1);
static Node *stmt_merge (YYSTYPE x0, YYSTYPE x1);
static void yyerror (YYLTYPE const * const loc, const char *msg);
static yytoken_kind_t yylex (YYSTYPE *lval, YYLTYPE *lloc);
@@ -83,9 +83,9 @@
%glr-parser
%type <Node*> stmt expr decl declarator TYPENAME ID
%destructor { free_node ($$); } <Node*>
%printer { node_print (yyo, $$); } <Node*>
%type <Node *> stmt expr decl declarator TYPENAME ID
%destructor { free_node ($$); } <Node *>
%printer { node_print (yyo, $$); } <Node *>
%%
@@ -100,8 +100,8 @@ prog : %empty
}
;
stmt : expr ';' %merge <stmtMerge> { $$ = $1; }
| decl %merge <stmtMerge>
stmt : expr ';' %merge <stmt_merge> { $$ = $1; }
| decl %merge <stmt_merge>
| error ';' { $$ = new_nterm ("<error>", NULL, NULL, NULL); }
;
@@ -290,8 +290,8 @@ node_print (FILE *out, const Node *n)
}
static Node*
stmtMerge (YYSTYPE x0, YYSTYPE x1)
static Node *
stmt_merge (YYSTYPE x0, YYSTYPE x1)
{
return new_nterm ("<OR>(%s, %s)", x0.stmt, x1.stmt, NULL);
}
+2 -19
View File
@@ -38,26 +38,9 @@ run -noerr 0 9 -p
cat >input <<EOF
(1+2) *
EOF
run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number
err: errors: 1'
run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number'
cat >input <<EOF
1 / (2 - 2)
EOF
run 1 'err: 1.1-11: error: division by zero
err: errors: 1'
# Multistart: parse "expression" instead of "input".
cat >input <<EOF
1+2*3
EOF
run 0 'expression: 7' -e
cat >input <<EOF
1
2
EOF
run 1 'expression: failure
err: 2.1: syntax error, unexpected number, expecting end of file
err: errors: 1' -e
run 1 'err: 1.1-11: error: division by zero'
+14 -34
View File
@@ -25,10 +25,10 @@
{
// Tell Flex the expected prototype of yylex.
#define YY_DECL \
yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc)
yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc, int *nerrs)
YY_DECL;
void yyerror (const YYLTYPE *loc, const char *msg);
void yyerror (const YYLTYPE *loc, int *nerrs, const char *msg);
}
// Emitted on top of the implementation file.
@@ -62,6 +62,9 @@
// Enable debug traces (see yydebug in main).
%define parse.trace
// Error count, exchanged between main, yyparse and yylex.
%param {int *nerrs}
%token
PLUS "+"
MINUS "-"
@@ -73,11 +76,9 @@
;
%token <int> NUM "number"
%type <int> exp expression line
%type <int> exp
%printer { fprintf (yyo, "%d", $$); } <int>
%start input expression NUM
// Precedence (from lowest to highest) and associativity.
%left "+" "-"
%left "*" "/"
@@ -90,12 +91,8 @@ input:
;
line:
exp EOL { $$ = $exp; printf ("%d\n", $$); }
| error EOL { $$ = 0; yyerrok; }
;
expression:
exp EOL { $$ = $exp; }
exp EOL { printf ("%d\n", $exp); }
| error EOL { yyerrok; }
;
exp:
@@ -106,7 +103,7 @@ exp:
{
if ($3 == 0)
{
yyerror (&@$, "error: division by zero");
yyerror (&@$, nerrs, "error: division by zero");
YYERROR;
}
else
@@ -118,41 +115,24 @@ exp:
%%
// Epilogue (C code).
void yyerror (const YYLTYPE *loc, const char *msg)
void yyerror (const YYLTYPE *loc, int *nerrs, const char *msg)
{
YYLOCATION_PRINT (stderr, loc);
fprintf (stderr, ": %s\n", msg);
++*nerrs;
}
int main (int argc, const char *argv[])
{
// Possibly enable parser runtime debugging.
yydebug = !!getenv ("YYDEBUG");
int parse_expression_p = 0;
int nerrs = 0;
// Enable parse traces on option -p.
for (int i = 1; i < argc; ++i)
if (strcmp (argv[i], "-e") == 0)
parse_expression_p = 1;
else if (strcmp (argv[i], "-p") == 0)
if (strcmp (argv[i], "-p") == 0)
yydebug = 1;
if (parse_expression_p)
{
yyparse_expression_t res = yyparse_expression ();
nerrs = res.yynerrs;
if (res.yystatus == 0)
printf ("expression: %d\n", res.yyvalue);
else
printf ("expression: failure\n");
}
else
nerrs = yyparse_input ().yynerrs;
if (nerrs)
fprintf (stderr, "errors: %d\n", nerrs);
int nerrs = 0;
yyparse (&nerrs);
// Exit on failure if there were errors.
return !!nerrs;
}
+2 -2
View File
@@ -61,7 +61,7 @@
errno = 0;
long n = strtol (yytext, NULL, 10);
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
yyerror (yylloc, "integer is out of range");
yyerror (yylloc, nerrs, "integer is out of range");
yylval->TOK_NUM = (int) n;
return TOK_NUM;
}
@@ -71,7 +71,7 @@
/* Ignore white spaces. */
[ \t]+ LOCATION_STEP (); continue;
. yyerror (yylloc, "syntax error, invalid character"); continue;
. yyerror (yylloc, nerrs, "syntax error, invalid character"); continue;
<<EOF>> return TOK_YYEOF;
%%
+1
View File
@@ -391,6 +391,7 @@
/stripslash.c
/strndup.c
/strnlen.c
/strtod.c
/strverscmp.c
/sys
/sys_ioctl.in.h
+1
View File
@@ -216,6 +216,7 @@
/strings_h.m4
/strndup.m4
/strnlen.m4
/strtod.m4
/strverscmp.m4
/sys_ioctl_h.m4
/sys_resource_h.m4
+24 -22
View File
@@ -7,36 +7,22 @@
# with or without modifications, as long as this notice is preserved.
m4_define([_BISON_CXXSTD_98_snippet],
[[#include <cassert>
#include <vector>
void cxx98_vector ()
{
typedef std::vector<int> ints;
// Check support for std::vector<T,Allocator>::data.
// GCC 4.2 on macOS claims to support C++98, but does not feature it.
//
// input.cc: In member function 'void state_stack::yycompressStack()':
// input.cc:1774: error: 'class std::vector<glr_stack_item, std::allocator<glr_stack_item> >' has no member named 'data'
//
// <https://trac.macports.org/raw-attachment/ticket/59927/bison-test-results-20210811-95b72.log.xz>.
ints my_ints;
assert (my_ints.data () == &my_ints[0]);
}
]])
[[]])
m4_define([_BISON_CXXSTD_03_snippet],
[])
[[]])
m4_define([_BISON_CXXSTD_11_snippet],
[[#include <algorithm>
[[ // C++11
#include <algorithm>
#include <cassert>
#include <memory>
#include <set>
#include <sstream>
#include <string>
#include <utility> // std::swap
#include <vector>
// C++11
template <typename T>
struct check
{
@@ -80,6 +66,22 @@ m4_define([_BISON_CXXSTD_11_snippet],
// GCC 4.8.2 on Solaris 11.3 does not support to_string.
auto e = std::to_string(42);
// Needed by glr2.cc.
void cxx11_vector_data ()
{
std::vector<int> ints;
ints.emplace_back (42);
assert (ints.data () == &ints[0]);
}
// Needed by glr2.cc.
void cxx11_array_swap ()
{
int i0[4] = { 1, 2, 3, 4 };
int i1[4] = { 5, 6, 7, 8 };
std::swap (i0, i1);
}
]])
m4_define([_BISON_CXXSTD_14_snippet],
@@ -177,7 +179,7 @@ m4_define([_BISON_CXXSTD_testbody],
# BISON_CXXSTD(STD)
# -----------------
# Check whether the C++ compiler support STD (11, 98, 2b, etc.).
# Check whether the C++ compiler supports STD (11, 98, 2b, etc.).
# If it does, AC_SUBST 'CXX<STD>_CXXFLAGS' to the corresponding flags.
AC_DEFUN([BISON_CXXSTD],
[AC_REQUIRE([AC_PROG_CXX])
-4
View File
@@ -28,17 +28,13 @@ AC_DEFUN([BISON_TEST_FOR_WORKING_CXX_COMPILER],
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;]],
[[std::cerr << "";
cout << "";
std::vector<int> ints;
assert(ints.data () == &ints[0]);
typedef std::pair<unsigned, int> uipair;
std::map<unsigned, int> m;
std::map<unsigned, int>::iterator i;
+5 -5
View File
@@ -57,12 +57,12 @@
/** The time limit before printing an assurance message to the user to
* indicate that the search is still running. */
#define ASSURANCE_LIMIT 2.0f
#define ASSURANCE_LIMIT 2.0
/* The time limit before giving up looking for unifying counterexample. */
static float time_limit = 5.0f;
static double time_limit = 5.0;
#define CUMULATIVE_TIME_LIMIT 120.0f
#define CUMULATIVE_TIME_LIMIT 120.0
// This is the fastest way to get the tail node from the gl_list API.
static gl_list_node_t
@@ -1164,7 +1164,7 @@ unifying_example (state_item_number itm1,
}
if (TIME_LIMIT_ENFORCED)
{
float time_passed = difftime (time (NULL), start);
double time_passed = difftime (time (NULL), start);
if (!assurance_printed && time_passed > ASSURANCE_LIMIT
&& stage3result)
{
@@ -1218,7 +1218,7 @@ counterexample_init (void)
if (cp)
{
char *end = NULL;
float v = strtof (cp, &end);
double v = strtod (cp, &end);
if (*end == '\0' && errno == 0)
time_limit = v;
}
+14 -3
View File
@@ -71,6 +71,18 @@ struct bison_language const *language = &valid_languages[0];
typedef int* (xargmatch_fn) (const char *context, const char *arg);
void
set_yacc (location loc)
{
yacc_loc = loc;
if (getenv ("POSIXLY_CORRECT"))
muscle_percent_define_insert ("posix",
loc,
muscle_keyword, "",
MUSCLE_PERCENT_DEFINE_D);
}
/** Decode an option's key.
*
* \param opt option being decoded.
@@ -631,8 +643,7 @@ static struct option const long_options[] =
};
/* Build a location for the current command line argument. */
static
location
static location
command_line_location (void)
{
location res;
@@ -835,7 +846,7 @@ getargs (int argc, char *argv[])
case 'y':
warning_argmatch ("yacc", 0, 0);
yacc_loc = loc;
set_yacc (loc);
break;
case COLOR_OPTION:
+1
View File
@@ -140,6 +140,7 @@ void getargs (int argc, char *argv[]);
/* Used by parse-gram.y. */
void language_argmatch (char const *arg, int prio, location loc);
void skeleton_arg (const char *arg, int prio, location loc);
void set_yacc (location loc);
/** In the string \c s, replace all characters \c from by \c to. */
void tr (char *s, char from, char to);
+6
View File
@@ -63,6 +63,12 @@
int
main (int argc, char *argv[])
{
{
char *cp = getenv ("BISON_PROGRAM_NAME");
if (cp)
argv[0] = cp;
}
#define DEPENDS_ON_LIBINTL 1
set_program_name (argv[0]);
setlocale (LC_ALL, "");
+4 -4
View File
@@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 3.7.5.297-b46a. */
/* A Bison parser, made by GNU Bison 3.8. */
/* Bison implementation for Yacc-like parsers in C
@@ -46,10 +46,10 @@
USER NAME SPACE" below. */
/* Identify Bison output, and Bison version. */
#define YYBISON 30705
#define YYBISON 30800
/* Bison version string. */
#define YYBISON_VERSION "3.7.5.297-b46a"
#define YYBISON_VERSION "3.8"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
@@ -3129,7 +3129,7 @@ handle_yacc (location const *loc)
const char *directive = "%yacc";
bison_directive (loc, directive);
if (location_empty (yacc_loc))
yacc_loc = *loc;
set_yacc (*loc);
else
duplicate_directive (directive, yacc_loc, *loc);
}
+2 -1
View File
@@ -1,4 +1,4 @@
/* A Bison parser, made by GNU Bison 3.7.5.297-b46a. */
/* A Bison parser, made by GNU Bison 3.8. */
/* Bison interface for Yacc-like parsers in C
@@ -215,6 +215,7 @@ struct GRAM_LTYPE
int gram_parse (void);
/* "%code provides" blocks. */
+1 -1
View File
@@ -1112,7 +1112,7 @@ handle_yacc (location const *loc)
const char *directive = "%yacc";
bison_directive (loc, directive);
if (location_empty (yacc_loc))
yacc_loc = *loc;
set_yacc (*loc);
else
duplicate_directive (directive, yacc_loc, *loc);
}
+5 -19
View File
@@ -25,27 +25,13 @@ abs_top_builddir='@abs_top_builddir@'
BISON_PKGDATADIR=$abs_top_srcdir/data
export BISON_PKGDATADIR
stderr=tmp-bison.$$
# If stderr is a tty, force --color=yes to simulate --color=auto
# although we save and modify stderr.
if test -t 2; then
set x --color=yes ${1+"$@"}
shift
fi
# We redirect stderr, which breaks the computation of the terminal
# screen width. So export COLUMNS to Bison, hoping for the shell to
# have defined it.
: ${COLUMNS=`(tput cols) 2>/dev/null || echo 132`}
export COLUMNS
$PREBISON "$abs_top_builddir/src/bison" ${1+"$@"} 2>"$stderr"
status=$?
# Neutralize path differences in error messages so that check and
# installcheck behave the same way.
sed -e "s,$abs_top_builddir/src/,,g" <"$stderr" >&2
rm -f "$stderr"
BISON_PROGRAM_NAME=bison
export BISON_PROGRAM_NAME
$PREBISON "$abs_top_builddir/src/bison" ${1+"$@"}
status=$?
# As a special dark magic, if we are actually using this wrapper to
# compile Bison's src/parse-gram.y, post-process the synclines to
+14 -2
View File
@@ -268,7 +268,7 @@ read_integer (]AT_YYLEX_FORMALS[)
m4_define([_AT_DATA_CALC_Y(c)],
[AT_DATA_GRAMMAR([calc.y],
[AT_DATA_GRAMMAR([calc.y.tmp],
[[/* Infix notation calculator--calc */
]$4[
%code requires
@@ -493,6 +493,18 @@ location_print (FILE *o, Span s)
[AT_CALC_YYLEX
AT_CALC_MAIN])])
# Remove the generated prototypes.
AT_CHECK(
[AT_YACC_IF([[
if "$POSIXLY_CORRECT_IS_EXPORTED"; then
sed -e '/\/\* !POSIX \*\//d' calc.y.tmp >calc.y
else
mv calc.y.tmp calc.y
fi
]],
[[mv calc.y.tmp calc.y]])
])
AT_HEADER_IF([AT_DATA_SOURCE([[calc-lex.]AT_LANG_EXT],
[[#include "calc.]AT_LANG_HDR["
@@ -970,7 +982,7 @@ AT_JAVA_IF(
[AT_PARSER_CHECK([calc $1 input], 0, [m4_ifvaln(m4_quote($3), [$3])], [stderr])])
AT_LANG_MATCH([c\|c++\|java],
[AT_GLR_IF([],
[AT_CHECK([grep -c -v -E 'Return for a new token:|LAC:' stderr],
[AT_CHECK([$EGREP -c -v 'Return for a new token:|LAC:' stderr],
[ignore],
[m4_n([AT_DEBUG_IF([$4], [0])])])])])
])
+9 -9
View File
@@ -61,8 +61,8 @@ $1
static Node *new_term (char *);
static void free_node (Node *);
static char *node_to_string (Node *);
]m4_bmatch([$2], [stmtMerge],
[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[
]m4_bmatch([$2], [stmt_merge],
[ static YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);])[
#define YYINITDEPTH 10
#define YYSTACKEXPANDABLE 1
]AT_YYERROR_DECLARE[
@@ -291,9 +291,9 @@ node_to_string (Node *node)
}
]]
m4_bmatch([$2], [stmtMerge],
m4_bmatch([$2], [stmt_merge],
[[static YYSTYPE
stmtMerge (YYSTYPE x0, YYSTYPE x1)
stmt_merge (YYSTYPE x0, YYSTYPE x1)
{
return new_nterm ("<OR>(%s,%s)", x0, x1, YY_NULLPTR);
}
@@ -431,30 +431,30 @@ AT_CLEANUP
AT_SETUP([GLR: Merge conflicting parses, impure, no locations])
_AT_TEST_GLR_CXXTYPES([],
[%merge <stmtMerge>], [%merge <stmtMerge>])
[%merge <stmt_merge>], [%merge <stmt_merge>])
AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
AT_CLEANUP
AT_SETUP([GLR: Merge conflicting parses, impure, locations])
_AT_TEST_GLR_CXXTYPES([%locations],
[%merge <stmtMerge>], [%merge <stmtMerge>])
[%merge <stmt_merge>], [%merge <stmt_merge>])
AT_TEST([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
AT_CLEANUP
AT_SETUP([GLR: Merge conflicting parses, pure, no locations])
_AT_TEST_GLR_CXXTYPES([%define api.pure],
[%merge <stmtMerge>], [%merge <stmtMerge>])
[%merge <stmt_merge>], [%merge <stmt_merge>])
AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
AT_CLEANUP
AT_SETUP([GLR: Merge conflicting parses, pure, locations])
_AT_TEST_GLR_CXXTYPES([%define api.pure %locations],
[%merge <stmtMerge>],[%merge <stmtMerge>])
[%merge <stmt_merge>],[%merge <stmt_merge>])
AT_TEST([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
AT_CLEANUP
AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations])
_AT_TEST_GLR_CXXTYPES([%define parse.error verbose],
[%merge <stmtMerge>], [%merge <stmtMerge>])
[%merge <stmt_merge>], [%merge <stmt_merge>])
AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_VERBOSE_GLR_STDERR])
AT_CLEANUP
+6 -4
View File
@@ -687,8 +687,8 @@ m4_define([AT_YYERROR_DECLARE_EXTERN(c)],
m4_define([AT_YYERROR_DECLARE(c)],
[[#include <stdio.h>
]AT_LOCATION_PRINT_DECLARE[
]AT_YACC_IF([], [[static ]AT_YYERROR_DECLARE_EXTERN])])
/* !POSIX */ static ]AT_YYERROR_DECLARE_EXTERN[]dnl
])
# "%define parse.error custom" uses a different format, easy to check.
# The "verbose" one can be computed from it (see _AT_CHECK_CALC_ERROR).
@@ -733,7 +733,7 @@ yyreport_syntax_error (const yypcontext_t *ctx]AT_PARAM_IF([, AT_PARSE_PARAMS])[
]])[
/* A C error reporting function. */
]AT_YACC_IF([], [static])[
/* !POSIX */ static
]AT_YYERROR_PROTOTYPE[
{]m4_bpatsubst(m4_defn([AT_PARSE_PARAMS]),
[[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\),* *], [
@@ -1362,8 +1362,10 @@ AT_CHECK(m4_join([ ],
# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT
# with trailing ".o" removed, and ".cc" appended.
m4_define([AT_COMPILE_CXX],
[AT_KEYWORDS(c++)
[AT_KEYWORDS([c++])
AT_SKIP_IF([[! $BISON_CXX_WORKS]])
m4_ifdef([AT_GLR2_CC_IF],
[AT_GLR2_CC_IF([AT_SKIP_IF([[test x"$CXX11_CXXFLAGS" == x]])])])
AT_CHECK(m4_join([ ],
[$CXX $CXXFLAGS $CPPFLAGS $3],
[m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])],
+1
View File
@@ -744,6 +744,7 @@ m4_popdef([AT_TEST])
AT_SETUP([C++ Output File Prefix Mapping])
# AT_TEST([PREFIX], [DIRECTIVES])
# -------------------------------
m4_pushdef([AT_TEST],
[AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" %define api.namespace {$1} $2])
AT_LOC_PUSHDEF([begin.line], [begin.column], [end.line], [end.column])
+1598 -1595
View File
File diff suppressed because it is too large Load Diff