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 fetch --unshallow || true
- git submodule update --init --recursive - 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 - ./bootstrap
- ./configure --enable-gcc-warnings || { cat config.log && false; } - ./configure --enable-gcc-warnings || { cat config.log && false; }
- make -j2 - make -j2
+13 -2
View File
@@ -1,6 +1,17 @@
GNU Bison NEWS 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 ** 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: yytoken YYUNDEF YYerror basename Automake's UTF ifdef ffile
LocalWords: gotos readline Imbimbo Wcounterexamples Wcex Nonunifying rcex LocalWords: gotos readline Imbimbo Wcounterexamples Wcex Nonunifying rcex
LocalWords: Vais xsltproc YYNOMEM YYLOCATION signedness YYBISON MITRE's LocalWords: Vais xsltproc YYNOMEM YYLOCATION signedness YYBISON MITRE's
LocalWords: libreadline YYMALLOC YYFREE MSVC redefinitions LocalWords: libreadline YYMALLOC YYFREE MSVC redefinitions POSIXLY
Local Variables: Local Variables:
ispell-dictionary: "american" 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 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 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. programming in order to use Bison.
Bison and the parsers it generates are portable, they do not require any 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. Line -1 and -3 should mention CATEGORIE, not CATEGORY.
* Bison 3.8 * Bison 3.9
** Rewrite glr.cc (currently glr2.cc) ** Rewrite glr.cc (currently glr2.cc)
*** custom error messages *** 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 https://lists.gnu.org/r/bison-patches/2013-09/msg00000.html and following
** Multiple start symbols ** Multiple start symbols
Revert a70e75b8a41755ab96ab211a0ea111ac68a4aadd.
Revert tests: disable "Multistart reports".
Would be very useful when parsing closely related languages. The idea is to Would be very useful when parsing closely related languages. The idea is to
declare several start symbols, for instance declare several start symbols, for instance
+1 -1
View File
@@ -45,7 +45,7 @@ gnulib_modules='
realloc-posix realloc-posix
relocatable-prog relocatable-script relocatable-prog relocatable-script
rename rename
spawn-pipe stdbool stpcpy stpncpy strdup-posix strerror strverscmp spawn-pipe stdbool stpcpy stpncpy strdup-posix strerror strtod strverscmp
sys_ioctl sys_ioctl
termios termios
timevar timevar
-5
View File
@@ -15,11 +15,6 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # 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]) AC_PREREQ([2.71])
m4_pattern_forbid([^_?(gl_[A-Z]|AX_|BISON_)]) m4_pattern_forbid([^_?(gl_[A-Z]|AX_|BISON_)])
m4_pattern_allow([^BISON_USE_NLS$]) 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([locations]) # Whether locations are tracked.
b4_percent_define_if_define([parse.assert]) b4_percent_define_if_define([parse.assert])
b4_percent_define_if_define([parse.trace]) b4_percent_define_if_define([parse.trace])
b4_percent_define_if_define([posix])
# b4_bison_locations_if([IF-TRUE]) # b4_bison_locations_if([IF-TRUE])
+6 -8
View File
@@ -1370,7 +1370,6 @@ public:
check_ (); check_ ();
other.check_ ();]])[ other.check_ ();]])[
std::swap (is_state_, other.is_state_); std::swap (is_state_, other.is_state_);
// NB: swap on arrays is C++11.
std::swap (raw_, other.raw_); std::swap (raw_, other.raw_);
return *this; return *this;
} }
@@ -2163,7 +2162,7 @@ b4_dollar_popdef])[]dnl
reductions on all stacks) helps prevent double destructor calls reductions on all stacks) helps prevent double destructor calls
on yylval in the event of memory exhaustion. */ 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])[)); YYCHK1 (this->yyprocessOneStack (yys, yyposn]b4_locations_if([, &this->yylloc])[));
this->yystateStack.yytops.yyremoveDeletes (); this->yystateStack.yytops.yyremoveDeletes ();
if (this->yystateStack.yytops.size() == 0) if (this->yystateStack.yytops.size() == 0)
@@ -2173,7 +2172,7 @@ b4_dollar_popdef])[]dnl
this->yyFail (]b4_locations_if([&this->yylloc, ])[YY_("syntax error")); this->yyFail (]b4_locations_if([&this->yylloc, ])[YY_("syntax error"));
YYCHK1 (this->yyresolveStack ()); YYCHK1 (this->yyresolveStack ());
YYCDEBUG << "Returning to deterministic operation.\n";]b4_locations_if([[ 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 (); this->yyreportSyntaxError ();
goto yyuser_error; goto yyuser_error;
} }
@@ -2186,12 +2185,11 @@ b4_dollar_popdef])[]dnl
yysymbol_kind_t yytoken_to_shift = this->yytoken; yysymbol_kind_t yytoken_to_shift = this->yytoken;
this->yytoken = ]b4_symbol(empty, kind)[; this->yytoken = ]b4_symbol(empty, kind)[;
yyposn += 1; 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 short* yyconflicts;
const int yyaction const int yyaction = yygetLRActions (yystate, yytoken_to_shift, yyconflicts);
= yygetLRActions (yystate, yytoken_to_shift, yyconflicts);
/* Note that yyconflicts were handled by yyprocessOneStack. */ /* Note that yyconflicts were handled by yyprocessOneStack. */
YYCDEBUG << "On stack " << yys.get() << ", "; YYCDEBUG << "On stack " << yys.get() << ", ";
YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, this->yylval, this->yylloc); YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, this->yylval, this->yylloc);
@@ -2204,7 +2202,7 @@ b4_dollar_popdef])[]dnl
// Value type destructor. // Value type destructor.
]b4_symbol_variant([[yytoken_to_shift]], [[this->yylval]], [[template destroy]])])[ ]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 ()); YYCHK1 (this->yyresolveStack ());
YYCDEBUG << "Returning to deterministic operation.\n"; 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_if([$1], [has_type],
[b4_symbol([$1], [type]) v]), [b4_symbol([$1], [type]) v]),
b4_locations_if([location_type l]))[) b4_locations_if([location_type l]))[)
: super_type(]b4_join([token_type (tok)], : super_type (]b4_join([token_type (tok)],
b4_symbol_if([$1], [has_type], [std::move (v)]), b4_symbol_if([$1], [has_type], [std::move (v)]),
b4_locations_if([std::move (l)]))[) b4_locations_if([std::move (l)]))[)
#else #else
symbol_type (]b4_join( symbol_type (]b4_join(
[int tok], [int tok],
b4_symbol_if([$1], [has_type], b4_symbol_if([$1], [has_type],
[const b4_symbol([$1], [type])& v]), [const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l]))[) b4_locations_if([const location_type& l]))[)
: super_type(]b4_join([token_type (tok)], : super_type (]b4_join([token_type (tok)],
b4_symbol_if([$1], [has_type], [v]), b4_symbol_if([$1], [has_type], [v]),
b4_locations_if([l]))[) b4_locations_if([l]))[)
#endif #endif
{]b4_parse_assert_if([[ {]b4_parse_assert_if([[
#if !defined _MSC_VER || defined __clang__
]b4_assert[ (]b4_tok_in($@)[); ]b4_assert[ (]b4_tok_in($@)[);
#endif
]])[} ]])[}
]])]) ]])])
+1 -1
View File
@@ -367,7 +367,7 @@ m4_define([b4_declare_yyparse],
# Comply with POSIX Yacc. # Comply with POSIX Yacc.
# <https://austingroupbugs.net/view.php?id=1388#c5220> # <https://austingroupbugs.net/view.php?id=1388#c5220>
m4_define([b4_declare_yyerror_and_yylex], 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)[ ]b4_function_declare([b4_prefix[error]], void, b4_yyerror_formals)[
#endif #endif
#if !defined ]b4_prefix[lex && !defined ]b4_api_PREFIX[LEX_IS_DECLARED #if !defined ]b4_prefix[lex && !defined ]b4_api_PREFIX[LEX_IS_DECLARED
+13 -10
View File
@@ -1283,17 +1283,17 @@ follows:
@example @example
stmt: stmt:
expr ';' %merge <stmtMerge> expr ';' %merge <stmt_merge>
| decl %merge <stmtMerge> | decl %merge <stmt_merge>
; ;
@end example @end example
@noindent @noindent
and define the @code{stmtMerge} function as: and define the @code{stmt_merge} function as:
@example @example
static YYSTYPE static YYSTYPE
stmtMerge (YYSTYPE x0, YYSTYPE x1) stmt_merge (YYSTYPE x0, YYSTYPE x1)
@{ @{
printf ("<OR> "); printf ("<OR> ");
return ""; return "";
@@ -1306,7 +1306,7 @@ in the C declarations at the beginning of the file:
@example @example
%@{ %@{
static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); static YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);
%@} %@}
@end example @end example
@@ -1331,7 +1331,7 @@ previous example, the merged-to symbol (@code{stmt}) does not have a
specific type, and the merger is specific type, and the merger is
@example @example
YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);
@end example @end example
@noindent @noindent
@@ -1358,12 +1358,12 @@ or
then the prototype of the merger must be: then the prototype of the merger must be:
@example @example
Node *stmtMerge (YYSTYPE x0, YYSTYPE x1); Node *stmt_merge (YYSTYPE x0, YYSTYPE x1);
@end example @end example
@noindent @noindent
(This signature might be a mistake originally, and maybe it should have been (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.) it, please let us know.)
@node GLR Semantic Actions @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 Generate @code{#define} statements in addition to an @code{enum} to
associate token codes with token kind names. associate token codes with token kind names.
@item @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 @example
int yylex (void); int yylex (void);
void yyerror (const char *); 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: 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: 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: 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: 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: 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 @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> #include <cstring>
static Node static Node
stmtMerge (const Node& x0, const Node& x1); stmt_merge (const Node& x0, const Node& x1);
static yy::parser::symbol_type static yy::parser::symbol_type
yylex (); yylex ();
@@ -74,9 +74,9 @@ prog : %empty
| prog stmt { std::cout << @2 << ": " << $2 << '\n'; } | prog stmt { std::cout << @2 << ": " << $2 << '\n'; }
; ;
stmt : expr ";" %merge <stmtMerge> { $$ = $1; } stmt : expr ";" %merge <stmt_merge> { $$ = $1; }
| decl %merge <stmtMerge> | decl %merge <stmt_merge>
| error ";" { $$ = Nterm ("<error>"); } | error ";" { $$ = Nterm ("<error>"); }
; ;
expr : ID expr : ID
@@ -169,7 +169,7 @@ yylex ()
} }
static Node static Node
stmtMerge (const Node& x0, const Node& x1) stmt_merge (const Node& x0, const Node& x1)
{ {
return Nterm ("<OR>", x0, x1); return Nterm ("<OR>", x0, x1);
} }
+8 -8
View File
@@ -66,7 +66,7 @@
static void free_node (Node *); static void free_node (Node *);
static char *node_to_string (const Node *); static char *node_to_string (const Node *);
static void node_print (FILE *, 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 void yyerror (YYLTYPE const * const loc, const char *msg);
static yytoken_kind_t yylex (YYSTYPE *lval, YYLTYPE *lloc); static yytoken_kind_t yylex (YYSTYPE *lval, YYLTYPE *lloc);
@@ -83,9 +83,9 @@
%glr-parser %glr-parser
%type <Node*> stmt expr decl declarator TYPENAME ID %type <Node *> stmt expr decl declarator TYPENAME ID
%destructor { free_node ($$); } <Node*> %destructor { free_node ($$); } <Node *>
%printer { node_print (yyo, $$); } <Node*> %printer { node_print (yyo, $$); } <Node *>
%% %%
@@ -100,8 +100,8 @@ prog : %empty
} }
; ;
stmt : expr ';' %merge <stmtMerge> { $$ = $1; } stmt : expr ';' %merge <stmt_merge> { $$ = $1; }
| decl %merge <stmtMerge> | decl %merge <stmt_merge>
| error ';' { $$ = new_nterm ("<error>", NULL, NULL, NULL); } | error ';' { $$ = new_nterm ("<error>", NULL, NULL, NULL); }
; ;
@@ -290,8 +290,8 @@ node_print (FILE *out, const Node *n)
} }
static Node* static Node *
stmtMerge (YYSTYPE x0, YYSTYPE x1) stmt_merge (YYSTYPE x0, YYSTYPE x1)
{ {
return new_nterm ("<OR>(%s, %s)", x0.stmt, x1.stmt, NULL); 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 cat >input <<EOF
(1+2) * (1+2) *
EOF EOF
run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number'
err: errors: 1'
cat >input <<EOF cat >input <<EOF
1 / (2 - 2) 1 / (2 - 2)
EOF EOF
run 1 'err: 1.1-11: error: division by zero 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
+14 -34
View File
@@ -25,10 +25,10 @@
{ {
// Tell Flex the expected prototype of yylex. // Tell Flex the expected prototype of yylex.
#define YY_DECL \ #define YY_DECL \
yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc) yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc, int *nerrs)
YY_DECL; 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. // Emitted on top of the implementation file.
@@ -62,6 +62,9 @@
// Enable debug traces (see yydebug in main). // Enable debug traces (see yydebug in main).
%define parse.trace %define parse.trace
// Error count, exchanged between main, yyparse and yylex.
%param {int *nerrs}
%token %token
PLUS "+" PLUS "+"
MINUS "-" MINUS "-"
@@ -73,11 +76,9 @@
; ;
%token <int> NUM "number" %token <int> NUM "number"
%type <int> exp expression line %type <int> exp
%printer { fprintf (yyo, "%d", $$); } <int> %printer { fprintf (yyo, "%d", $$); } <int>
%start input expression NUM
// Precedence (from lowest to highest) and associativity. // Precedence (from lowest to highest) and associativity.
%left "+" "-" %left "+" "-"
%left "*" "/" %left "*" "/"
@@ -90,12 +91,8 @@ input:
; ;
line: line:
exp EOL { $$ = $exp; printf ("%d\n", $$); } exp EOL { printf ("%d\n", $exp); }
| error EOL { $$ = 0; yyerrok; } | error EOL { yyerrok; }
;
expression:
exp EOL { $$ = $exp; }
; ;
exp: exp:
@@ -106,7 +103,7 @@ exp:
{ {
if ($3 == 0) if ($3 == 0)
{ {
yyerror (&@$, "error: division by zero"); yyerror (&@$, nerrs, "error: division by zero");
YYERROR; YYERROR;
} }
else else
@@ -118,41 +115,24 @@ exp:
%% %%
// Epilogue (C code). // 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); YYLOCATION_PRINT (stderr, loc);
fprintf (stderr, ": %s\n", msg); fprintf (stderr, ": %s\n", msg);
++*nerrs;
} }
int main (int argc, const char *argv[]) int main (int argc, const char *argv[])
{ {
// Possibly enable parser runtime debugging. // Possibly enable parser runtime debugging.
yydebug = !!getenv ("YYDEBUG"); yydebug = !!getenv ("YYDEBUG");
int parse_expression_p = 0;
int nerrs = 0;
// Enable parse traces on option -p. // Enable parse traces on option -p.
for (int i = 1; i < argc; ++i) for (int i = 1; i < argc; ++i)
if (strcmp (argv[i], "-e") == 0) if (strcmp (argv[i], "-p") == 0)
parse_expression_p = 1;
else if (strcmp (argv[i], "-p") == 0)
yydebug = 1; yydebug = 1;
if (parse_expression_p) int nerrs = 0;
{ yyparse (&nerrs);
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);
// Exit on failure if there were errors. // Exit on failure if there were errors.
return !!nerrs; return !!nerrs;
} }
+2 -2
View File
@@ -61,7 +61,7 @@
errno = 0; errno = 0;
long n = strtol (yytext, NULL, 10); long n = strtol (yytext, NULL, 10);
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE)) 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; yylval->TOK_NUM = (int) n;
return TOK_NUM; return TOK_NUM;
} }
@@ -71,7 +71,7 @@
/* Ignore white spaces. */ /* Ignore white spaces. */
[ \t]+ LOCATION_STEP (); continue; [ \t]+ LOCATION_STEP (); continue;
. yyerror (yylloc, "syntax error, invalid character"); continue; . yyerror (yylloc, nerrs, "syntax error, invalid character"); continue;
<<EOF>> return TOK_YYEOF; <<EOF>> return TOK_YYEOF;
%% %%
+1
View File
@@ -391,6 +391,7 @@
/stripslash.c /stripslash.c
/strndup.c /strndup.c
/strnlen.c /strnlen.c
/strtod.c
/strverscmp.c /strverscmp.c
/sys /sys
/sys_ioctl.in.h /sys_ioctl.in.h
+1
View File
@@ -216,6 +216,7 @@
/strings_h.m4 /strings_h.m4
/strndup.m4 /strndup.m4
/strnlen.m4 /strnlen.m4
/strtod.m4
/strverscmp.m4 /strverscmp.m4
/sys_ioctl_h.m4 /sys_ioctl_h.m4
/sys_resource_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. # with or without modifications, as long as this notice is preserved.
m4_define([_BISON_CXXSTD_98_snippet], 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_03_snippet],
[]) [[]])
m4_define([_BISON_CXXSTD_11_snippet], m4_define([_BISON_CXXSTD_11_snippet],
[[#include <algorithm> [[ // C++11
#include <algorithm>
#include <cassert>
#include <memory> #include <memory>
#include <set> #include <set>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include <utility> // std::swap
#include <vector>
// C++11
template <typename T> template <typename T>
struct check 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. // GCC 4.8.2 on Solaris 11.3 does not support to_string.
auto e = std::to_string(42); 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], m4_define([_BISON_CXXSTD_14_snippet],
@@ -177,7 +179,7 @@ m4_define([_BISON_CXXSTD_testbody],
# BISON_CXXSTD(STD) # 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. # If it does, AC_SUBST 'CXX<STD>_CXXFLAGS' to the corresponding flags.
AC_DEFUN([BISON_CXXSTD], AC_DEFUN([BISON_CXXSTD],
[AC_REQUIRE([AC_PROG_CXX]) [AC_REQUIRE([AC_PROG_CXX])
-4
View File
@@ -28,17 +28,13 @@ AC_DEFUN([BISON_TEST_FOR_WORKING_CXX_COMPILER],
AC_COMPILE_IFELSE( AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM( [AC_LANG_PROGRAM(
[[ [[
#include <cassert>
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include <map> #include <map>
#include <string> #include <string>
#include <vector>
using namespace std;]], using namespace std;]],
[[std::cerr << ""; [[std::cerr << "";
cout << ""; cout << "";
std::vector<int> ints;
assert(ints.data () == &ints[0]);
typedef std::pair<unsigned, int> uipair; typedef std::pair<unsigned, int> uipair;
std::map<unsigned, int> m; std::map<unsigned, int> m;
std::map<unsigned, int>::iterator i; 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 /** The time limit before printing an assurance message to the user to
* indicate that the search is still running. */ * 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. */ /* 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. // This is the fastest way to get the tail node from the gl_list API.
static gl_list_node_t static gl_list_node_t
@@ -1164,7 +1164,7 @@ unifying_example (state_item_number itm1,
} }
if (TIME_LIMIT_ENFORCED) 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 if (!assurance_printed && time_passed > ASSURANCE_LIMIT
&& stage3result) && stage3result)
{ {
@@ -1218,7 +1218,7 @@ counterexample_init (void)
if (cp) if (cp)
{ {
char *end = NULL; char *end = NULL;
float v = strtof (cp, &end); double v = strtod (cp, &end);
if (*end == '\0' && errno == 0) if (*end == '\0' && errno == 0)
time_limit = v; 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); 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. /** Decode an option's key.
* *
* \param opt option being decoded. * \param opt option being decoded.
@@ -631,8 +643,7 @@ static struct option const long_options[] =
}; };
/* Build a location for the current command line argument. */ /* Build a location for the current command line argument. */
static static location
location
command_line_location (void) command_line_location (void)
{ {
location res; location res;
@@ -835,7 +846,7 @@ getargs (int argc, char *argv[])
case 'y': case 'y':
warning_argmatch ("yacc", 0, 0); warning_argmatch ("yacc", 0, 0);
yacc_loc = loc; set_yacc (loc);
break; break;
case COLOR_OPTION: case COLOR_OPTION:
+1
View File
@@ -140,6 +140,7 @@ void getargs (int argc, char *argv[]);
/* Used by parse-gram.y. */ /* Used by parse-gram.y. */
void language_argmatch (char const *arg, int prio, location loc); void language_argmatch (char const *arg, int prio, location loc);
void skeleton_arg (const char *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. */ /** In the string \c s, replace all characters \c from by \c to. */
void tr (char *s, char from, char to); void tr (char *s, char from, char to);
+6
View File
@@ -63,6 +63,12 @@
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
{
char *cp = getenv ("BISON_PROGRAM_NAME");
if (cp)
argv[0] = cp;
}
#define DEPENDS_ON_LIBINTL 1 #define DEPENDS_ON_LIBINTL 1
set_program_name (argv[0]); set_program_name (argv[0]);
setlocale (LC_ALL, ""); 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 /* Bison implementation for Yacc-like parsers in C
@@ -46,10 +46,10 @@
USER NAME SPACE" below. */ USER NAME SPACE" below. */
/* Identify Bison output, and Bison version. */ /* Identify Bison output, and Bison version. */
#define YYBISON 30705 #define YYBISON 30800
/* Bison version string. */ /* Bison version string. */
#define YYBISON_VERSION "3.7.5.297-b46a" #define YYBISON_VERSION "3.8"
/* Skeleton name. */ /* Skeleton name. */
#define YYSKELETON_NAME "yacc.c" #define YYSKELETON_NAME "yacc.c"
@@ -3129,7 +3129,7 @@ handle_yacc (location const *loc)
const char *directive = "%yacc"; const char *directive = "%yacc";
bison_directive (loc, directive); bison_directive (loc, directive);
if (location_empty (yacc_loc)) if (location_empty (yacc_loc))
yacc_loc = *loc; set_yacc (*loc);
else else
duplicate_directive (directive, yacc_loc, *loc); 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 /* Bison interface for Yacc-like parsers in C
@@ -215,6 +215,7 @@ struct GRAM_LTYPE
int gram_parse (void); int gram_parse (void);
/* "%code provides" blocks. */ /* "%code provides" blocks. */
+1 -1
View File
@@ -1112,7 +1112,7 @@ handle_yacc (location const *loc)
const char *directive = "%yacc"; const char *directive = "%yacc";
bison_directive (loc, directive); bison_directive (loc, directive);
if (location_empty (yacc_loc)) if (location_empty (yacc_loc))
yacc_loc = *loc; set_yacc (*loc);
else else
duplicate_directive (directive, yacc_loc, *loc); 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 BISON_PKGDATADIR=$abs_top_srcdir/data
export BISON_PKGDATADIR 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 # Neutralize path differences in error messages so that check and
# installcheck behave the same way. # installcheck behave the same way.
sed -e "s,$abs_top_builddir/src/,,g" <"$stderr" >&2 BISON_PROGRAM_NAME=bison
rm -f "$stderr" 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 # 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 # 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)], m4_define([_AT_DATA_CALC_Y(c)],
[AT_DATA_GRAMMAR([calc.y], [AT_DATA_GRAMMAR([calc.y.tmp],
[[/* Infix notation calculator--calc */ [[/* Infix notation calculator--calc */
]$4[ ]$4[
%code requires %code requires
@@ -493,6 +493,18 @@ location_print (FILE *o, Span s)
[AT_CALC_YYLEX [AT_CALC_YYLEX
AT_CALC_MAIN])]) 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], AT_HEADER_IF([AT_DATA_SOURCE([[calc-lex.]AT_LANG_EXT],
[[#include "calc.]AT_LANG_HDR[" [[#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_PARSER_CHECK([calc $1 input], 0, [m4_ifvaln(m4_quote($3), [$3])], [stderr])])
AT_LANG_MATCH([c\|c++\|java], AT_LANG_MATCH([c\|c++\|java],
[AT_GLR_IF([], [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], [ignore],
[m4_n([AT_DEBUG_IF([$4], [0])])])])]) [m4_n([AT_DEBUG_IF([$4], [0])])])])])
]) ])
+9 -9
View File
@@ -61,8 +61,8 @@ $1
static Node *new_term (char *); static Node *new_term (char *);
static void free_node (Node *); static void free_node (Node *);
static char *node_to_string (Node *); static char *node_to_string (Node *);
]m4_bmatch([$2], [stmtMerge], ]m4_bmatch([$2], [stmt_merge],
[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[ [ static YYSTYPE stmt_merge (YYSTYPE x0, YYSTYPE x1);])[
#define YYINITDEPTH 10 #define YYINITDEPTH 10
#define YYSTACKEXPANDABLE 1 #define YYSTACKEXPANDABLE 1
]AT_YYERROR_DECLARE[ ]AT_YYERROR_DECLARE[
@@ -291,9 +291,9 @@ node_to_string (Node *node)
} }
]] ]]
m4_bmatch([$2], [stmtMerge], m4_bmatch([$2], [stmt_merge],
[[static YYSTYPE [[static YYSTYPE
stmtMerge (YYSTYPE x0, YYSTYPE x1) stmt_merge (YYSTYPE x0, YYSTYPE x1)
{ {
return new_nterm ("<OR>(%s,%s)", x0, x1, YY_NULLPTR); 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_SETUP([GLR: Merge conflicting parses, impure, no locations])
_AT_TEST_GLR_CXXTYPES([], _AT_TEST_GLR_CXXTYPES([],
[%merge <stmtMerge>], [%merge <stmtMerge>]) [%merge <stmt_merge>], [%merge <stmt_merge>])
AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR]) AT_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
AT_CLEANUP AT_CLEANUP
AT_SETUP([GLR: Merge conflicting parses, impure, locations]) AT_SETUP([GLR: Merge conflicting parses, impure, locations])
_AT_TEST_GLR_CXXTYPES([%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_TEST([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
AT_CLEANUP AT_CLEANUP
AT_SETUP([GLR: Merge conflicting parses, pure, no locations]) AT_SETUP([GLR: Merge conflicting parses, pure, no locations])
_AT_TEST_GLR_CXXTYPES([%define api.pure], _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_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR])
AT_CLEANUP AT_CLEANUP
AT_SETUP([GLR: Merge conflicting parses, pure, locations]) AT_SETUP([GLR: Merge conflicting parses, pure, locations])
_AT_TEST_GLR_CXXTYPES([%define api.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_TEST([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC])
AT_CLEANUP AT_CLEANUP
AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations]) AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations])
_AT_TEST_GLR_CXXTYPES([%define parse.error verbose], _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_TEST([_AT_AMBIG_GLR_OUTPUT], [_AT_VERBOSE_GLR_STDERR])
AT_CLEANUP AT_CLEANUP
+6 -4
View File
@@ -687,8 +687,8 @@ m4_define([AT_YYERROR_DECLARE_EXTERN(c)],
m4_define([AT_YYERROR_DECLARE(c)], m4_define([AT_YYERROR_DECLARE(c)],
[[#include <stdio.h> [[#include <stdio.h>
]AT_LOCATION_PRINT_DECLARE[ ]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. # "%define parse.error custom" uses a different format, easy to check.
# The "verbose" one can be computed from it (see _AT_CHECK_CALC_ERROR). # 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. */ /* A C error reporting function. */
]AT_YACC_IF([], [static])[ /* !POSIX */ static
]AT_YYERROR_PROTOTYPE[ ]AT_YYERROR_PROTOTYPE[
{]m4_bpatsubst(m4_defn([AT_PARSE_PARAMS]), {]m4_bpatsubst(m4_defn([AT_PARSE_PARAMS]),
[[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\),* *], [ [[^,]+[^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 # otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT
# with trailing ".o" removed, and ".cc" appended. # with trailing ".o" removed, and ".cc" appended.
m4_define([AT_COMPILE_CXX], m4_define([AT_COMPILE_CXX],
[AT_KEYWORDS(c++) [AT_KEYWORDS([c++])
AT_SKIP_IF([[! $BISON_CXX_WORKS]]) 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([ ], AT_CHECK(m4_join([ ],
[$CXX $CXXFLAGS $CPPFLAGS $3], [$CXX $CXXFLAGS $CPPFLAGS $3],
[m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])], [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])],
+1
View File
@@ -744,6 +744,7 @@ m4_popdef([AT_TEST])
AT_SETUP([C++ Output File Prefix Mapping]) AT_SETUP([C++ Output File Prefix Mapping])
# AT_TEST([PREFIX], [DIRECTIVES]) # AT_TEST([PREFIX], [DIRECTIVES])
# -------------------------------
m4_pushdef([AT_TEST], m4_pushdef([AT_TEST],
[AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" %define api.namespace {$1} $2]) [AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" %define api.namespace {$1} $2])
AT_LOC_PUSHDEF([begin.line], [begin.column], [end.line], [end.column]) 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