mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-08-09 02:35:15 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
437f6250c5 | ||
|
|
334cb8f222 | ||
|
|
03878edf77 | ||
|
|
cacdfc2f6e | ||
|
|
31788ed4c7 | ||
|
|
69061fed82 | ||
|
|
7a21067bb9 | ||
|
|
ed02d34fbc | ||
|
|
8b0b295569 | ||
|
|
59a108c0a6 | ||
|
|
83ebc8bdb6 | ||
|
|
8023b3153a | ||
|
|
b23ca37ed2 | ||
|
|
bb5e4b659b | ||
|
|
bc8ec1d7bf | ||
|
|
665c5d688c | ||
|
|
53d379b905 | ||
|
|
aa85bfe3a7 | ||
|
|
5ec9c99662 | ||
|
|
36cae8e752 | ||
|
|
7498ede3ab | ||
|
|
27104acdbe | ||
|
|
7b3368a155 | ||
|
|
ec08b369ec | ||
|
|
05b70f47e8 | ||
|
|
626d2f2dca | ||
|
|
5c797b1627 | ||
|
|
ac692b572a | ||
|
|
2f208ee43a |
+1
-1
@@ -1 +1 @@
|
||||
3.2.90
|
||||
3.3.1
|
||||
|
||||
+2
-1
@@ -8,7 +8,8 @@ language: cpp
|
||||
env:
|
||||
global:
|
||||
# ICC serial number.
|
||||
secure: ED3w6rzxuE6tVu3oyxha2MoGMRzRQCtinvr9uor1gw9TGKB80esTLx4KyX0xHemUdyQVarFDDQfVS5rf7jSDY8XiWIR6O+2Af9/30gb+8eyngyvACu7E28n+1XHmYWIEHsbvB9mic6C60FBj5sPcDnFWZeyttGL0WooSjYHiw1Egafwqbeu1mD3Aet9OI9VaLQvy0KcWAdVrYWSI9UWLvLM+xPVUjPFko4oS+dTlETzVnmn6JFbZX1OKONtfcvdoDRFBzs3iHm5dQUt/Fz+y/DtKSuvF3zvePHSgF6c8URbEPPjBdh87gkovSLyy+83fVeh4WMkF8b+dGZmikQv6kRsjKJdbQrS8tiMhZlORC5Gfmn4HXNgmapL+paUweakH7UZQHm6d5SZoBgCHNazfqMrywbZsZkGvZTDQIVG1Be7Lhh2BDFbPhPZNDvI9XYiqZP0QSb0BVfeO+AUSRcUPM7TvarxB74jYdfpTBu7sqJP6dSwhcDTEUhHmuLGjzsNm3uTZe8SUw/TGGx5uPTXNsCjJq6ClIOAIYXZTXLbBmIL/NBWCy0MUpD+9zsiknU7vzzq1RfgCCExhvYgosTjBLcX1kKI+eRSU5M44e+xCg4xx0m9WfafbKbhA20FfnWxCFIkZeVpkOOsexJ9zfe0SflVLxkd7vmci5SCBixLVbN0=
|
||||
# See https://github.com/nemequ/icc-travis.
|
||||
secure: B3manbbi0anCAGDJTdAa9TlodzRHeiYD87FKmFzS877dPm8Cm0BDvtUhKBUpBvP8+nbHOWFGrgDmLugSZjTGU+mAxtuQpamUFHvinu0BIk3qtjlqouwvbtIqUu8iiZ3Uqu+xKeAANKRy0YVZGLlEb9F3N119tJ/Fxp1p9bXL1qph+CZ25OFbUgZ2s4F+/AyHMUxJlNXKFe3Qean65hC6edhU3zoaKzr/g/wtbhRmcyWbkOa1dJqzr2yKotcPvrnApGhDzgMKFtohg/t7xfMADDVv6sGS5XNpt25Z+MUCmLg4Z9eD7u109jvRV1eu/jgVafqsthWEhXbuMiFgFhKBKGCNZ0dACIfKZSkFZI6FdM7ovJ6aNhSlxZ2169Ybd22rN1UTHeCQWySPcVVOg5taLVpqe+E8Xhnv4hBO5NrzElWwCMLxIdPUSwVStYvtDr8ZytHWzfot50vSnFKIFpTOr9hP4+AJMVmmqJfaJo2MLBft/q2xkztrMv3lQSj3m4+ma9kPDwXIu9uCutjlnhc00jNx9qegi5VfpAjxcG1R+pX4T20az6ByHk/7LPQsANkT31RJq/jAeD9LEuMOy8miha83q4QuvbFaqPK3PY0el/O1LZaXqLsV2aQ0uqH8YX0l4r5NzHdhb+3lYgvpMBO5ytr/EWJiEyNYV518050IUDE=
|
||||
|
||||
matrix:
|
||||
include:
|
||||
|
||||
@@ -1,6 +1,72 @@
|
||||
GNU Bison NEWS
|
||||
|
||||
* Noteworthy changes in release 3.2.91 (2019-01-19) [beta]
|
||||
* Noteworthy changes in release 3.3.2 (2019-02-03) [stable]
|
||||
|
||||
** Bug fixes
|
||||
|
||||
Bison 3.3 failed to generate parsers for grammars with unused nonterminal
|
||||
symbols.
|
||||
|
||||
* Noteworthy changes in release 3.3.1 (2019-01-27) [stable]
|
||||
|
||||
** Changes
|
||||
|
||||
The option -y/--yacc used to imply -Werror=yacc, which turns uses of Bison
|
||||
extensions into errors. It now makes them simple warnings (-Wyacc).
|
||||
|
||||
* Noteworthy changes in release 3.3 (2019-01-26) [stable]
|
||||
|
||||
A new mailing list was created, Bison Announce. It is low traffic, and is
|
||||
only about announcing new releases and important messages (e.g., polls
|
||||
about major decisions to make).
|
||||
|
||||
https://lists.gnu.org/mailman/listinfo/bison-announce
|
||||
|
||||
** Backward incompatible changes
|
||||
|
||||
Support for DJGPP, which has been unmaintained and untested for years, is
|
||||
removed.
|
||||
|
||||
** Deprecated features
|
||||
|
||||
A new feature, --update (see below) helps adjusting existing grammars to
|
||||
deprecations.
|
||||
|
||||
*** Deprecated directives
|
||||
|
||||
The %error-verbose directive is deprecated in favor of '%define
|
||||
parse.error verbose' since Bison 3.0, but no warning was issued.
|
||||
|
||||
The '%name-prefix "xx"' directive is deprecated in favor of '%define
|
||||
api.prefix {xx}' since Bison 3.0, but no warning was issued. These
|
||||
directives are slightly different, you might need to adjust your code.
|
||||
%name-prefix renames only symbols with external linkage, while api.prefix
|
||||
also renames types and macros, including YYDEBUG, YYTOKENTYPE,
|
||||
yytokentype, YYSTYPE, YYLTYPE, etc.
|
||||
|
||||
Users of Flex that move from '%name-prefix "xx"' to '%define api.prefix
|
||||
{xx}' will typically have to update YY_DECL from
|
||||
|
||||
#define YY_DECL int xxlex (YYSTYPE *yylval, YYLTYPE *yylloc)
|
||||
|
||||
to
|
||||
|
||||
#define YY_DECL int xxlex (XXSTYPE *yylval, XXLTYPE *yylloc)
|
||||
|
||||
*** Deprecated %define variable names
|
||||
|
||||
The following variables, mostly related to parsers in Java, have been
|
||||
renamed for consistency. Backward compatibility is ensured, but upgrading
|
||||
is recommended.
|
||||
|
||||
abstract -> api.parser.abstract
|
||||
annotations -> api.parser.annotations
|
||||
extends -> api.parser.extends
|
||||
final -> api.parser.final
|
||||
implements -> api.parser.implements
|
||||
parser_class_name -> api.parser.class
|
||||
public -> api.parser.public
|
||||
strictfp -> api.parser.strictfp
|
||||
|
||||
** New features
|
||||
|
||||
@@ -56,62 +122,14 @@ GNU Bison NEWS
|
||||
%%
|
||||
exp:;
|
||||
|
||||
* Noteworthy changes in release 3.2.90 (2019-01-12) [beta]
|
||||
|
||||
** Backward incompatible changes
|
||||
|
||||
Support for DJGPP, which has been unmaintained and untested for years, is
|
||||
removed.
|
||||
|
||||
** Deprecated features
|
||||
|
||||
*** Deprecated directives
|
||||
|
||||
The %error-verbose directive is deprecated in favor of '%define
|
||||
parse.error verbose' since Bison 3.0, but no warning was issued.
|
||||
|
||||
The '%name-prefix "xx"' directive is deprecated in favor of '%define
|
||||
api.prefix {xx}' since Bison 3.0, but no warning was issued. These
|
||||
directives are slightly different, you might need to adjust your code.
|
||||
%name-prefix renames only symbols with external linkage, while api.prefix
|
||||
also renames types and macros, including @code{YYDEBUG},
|
||||
@code{YYTOKENTYPE}, @code{yytokentype}, @code{YYSTYPE}, @code{YYLTYPE},
|
||||
etc.
|
||||
|
||||
Users of Flex that move from '%name-prefix "xx"' to '%define api.prefix
|
||||
{xx}' will typically have to update YY_DECL from
|
||||
|
||||
#define YY_DECL int xxlex (YYSTYPE *yylval, YYLTYPE *yylloc)
|
||||
|
||||
to
|
||||
|
||||
#define YY_DECL int xxlex (XXSTYPE *yylval, XXLTYPE *yylloc)
|
||||
|
||||
*** Deprecated %define variable names
|
||||
|
||||
The following variables, mostly related to parsers in Java, have been
|
||||
renamed for consistency. Backward compatibility is ensured, but upgrading
|
||||
is recommended.
|
||||
|
||||
abstract -> api.parser.abstract
|
||||
annotations -> api.parser.annotations
|
||||
extends -> api.parser.extends
|
||||
final -> api.parser.final
|
||||
implements -> api.parser.implements
|
||||
parser_class_name -> api.parser.class
|
||||
public -> api.parser.public
|
||||
strictfp -> api.parser.strictfp
|
||||
|
||||
** New features
|
||||
|
||||
*** Bison is now relocatable
|
||||
|
||||
If you pass '--enable-relocatable' to 'configure', Bison is relocatable.
|
||||
|
||||
A relocatable program can be moved or copied to a different location on
|
||||
the file system. It can also be used through mount points for network
|
||||
sharing. It is possible to make symlinks to the installed and moved
|
||||
programs, and invoke them through the symlink.
|
||||
sharing. It is possible to make symbolic links to the installed and moved
|
||||
programs, and invoke them through the symbolic link.
|
||||
|
||||
*** %expect and %expect-rr modifiers on individual rules
|
||||
|
||||
@@ -190,7 +208,7 @@ GNU Bison NEWS
|
||||
*** C++: Actual token constructors
|
||||
|
||||
When variants and token constructors are enabled, in addition to the
|
||||
type-safe named token constructors (make_ID, amke_INT, etc.), we now
|
||||
type-safe named token constructors (make_ID, make_INT, etc.), we now
|
||||
generate genuine constructors for symbol_type.
|
||||
|
||||
For instance with these declarations
|
||||
@@ -205,17 +223,18 @@ GNU Bison NEWS
|
||||
symbol_type (int token, const int&);
|
||||
symbol_type (int token);
|
||||
|
||||
which should be used in a Flex-scanner as follows.
|
||||
|
||||
%%
|
||||
[a-z]+ return yy::parser::symbol_type (ID, yytext);
|
||||
[0-9]+ return yy::parser::symbol_type (INT, text_to_int (yytext);
|
||||
":" return yy::parser::symbol_type (’:’);
|
||||
<<EOF>> return yy::parser::symbol_type (0);
|
||||
|
||||
Correct matching between token types and value types is checked via
|
||||
'assert'. For instance, 'symbol_type (ID, 42)' would abort (while
|
||||
'make_ID (42)' would not even compile).
|
||||
'assert'; for instance, 'symbol_type (ID, 42)' would abort. Named
|
||||
constructors are preferable, as they offer better type safety (for
|
||||
instance 'make_ID (42)' would not even compile), but symbol_type
|
||||
constructors may help when token types are discovered at run-time, e.g.,
|
||||
|
||||
[a-z]+ {
|
||||
if (auto i = lookup_keyword (yytext))
|
||||
return yy::parser::symbol_type (i);
|
||||
else
|
||||
return yy::parser::make_ID (yytext);
|
||||
}
|
||||
|
||||
*** C++: Variadic emplace
|
||||
|
||||
@@ -307,7 +326,7 @@ GNU Bison NEWS
|
||||
where TAG denotes a type tag such as ‘<ival>’, ID denotes an identifier
|
||||
such as ‘NUM’, NUMBER a decimal or hexadecimal integer such as ‘300’ or
|
||||
‘0x12d’, CHAR a character literal such as ‘'+'’, and STRING a string
|
||||
literal such as ‘"number"’. The postfix quantifiers are ‘?’ (zero or
|
||||
literal such as ‘"number"’. The post-fix quantifiers are ‘?’ (zero or
|
||||
one), ‘*’ (zero or more) and ‘+’ (one or more).
|
||||
|
||||
* Noteworthy changes in release 3.2.4 (2018-12-24) [stable]
|
||||
@@ -3464,10 +3483,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
LocalWords: pragmas noreturn untyped Rozenman unexpanded Wojciech Polak
|
||||
LocalWords: Alexandre MERCHANTABILITY yytype emplace ptr automove lvalues
|
||||
LocalWords: nonterminal yy args Pragma dereference yyformat rhs docdir
|
||||
LocalWords: Redeclarations rpcalc Autoconf YFLAGS Makefiles PROG
|
||||
LocalWords: Heimbigner AST src ast Makefile srcdir MinGW
|
||||
LocalWords: Redeclarations rpcalc Autoconf YFLAGS Makefiles PROG DECL num
|
||||
LocalWords: Heimbigner AST src ast Makefile srcdir MinGW xxlex XXSTYPE
|
||||
LocalWords: XXLTYPE strictfp IDEs ffixit fdiagnostics parseable fixits
|
||||
LocalWords: Wdeprecated yytext Variadic variadic yyrhs yyphrs RCS README
|
||||
LocalWords: noexcept constexpr ispell american deprecations
|
||||
|
||||
Local Variables:
|
||||
ispell-dictionary: "american"
|
||||
mode: outline
|
||||
fill-column: 76
|
||||
End:
|
||||
|
||||
@@ -18,6 +18,7 @@ Antonio Silva Correia [email protected]
|
||||
Arnold Robbins [email protected]
|
||||
Art Haas [email protected]
|
||||
Askar Safin [email protected]
|
||||
Balázs Scheidler [email protected]
|
||||
Baron Schwartz [email protected]
|
||||
Ben Pfaff [email protected]
|
||||
Benoit Perrot [email protected]
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
* Bison 3.4
|
||||
** injection rules
|
||||
** glr.cc
|
||||
move glr.c into the yy namespace
|
||||
** improve syntax errors (UTF-8, internationalization)
|
||||
Bison depends on the current locale. For instance:
|
||||
|
||||
|
||||
+1
-1
@@ -100,7 +100,7 @@ if test "$enable_gcc_warnings" = yes; then
|
||||
-Wpointer-arith -Wshadow
|
||||
-Wwrite-strings'
|
||||
warn_c='-Wbad-function-cast -Wstrict-prototypes'
|
||||
warn_cxx='-Wextra-semi -Wnoexcept -Wundefined-func-template'
|
||||
warn_cxx='-Wextra-semi -Wnoexcept -Wundefined-func-template -Wweak-vtables'
|
||||
# Warnings for the test suite only.
|
||||
#
|
||||
# -fno-color-diagnostics: Clang's use of colors in the error
|
||||
|
||||
+49
-22
@@ -75,48 +75,75 @@ skeletons.
|
||||
|
||||
## Symbols
|
||||
|
||||
### `b4_symbol(NUM, FIELD)`
|
||||
In order to unify the handling of the various aspects of symbols (tag, type
|
||||
name, whether terminal, etc.), bison.exe defines one macro per (token,
|
||||
field), where field can `has_id`, `id`, etc.: see
|
||||
src/output.c:prepare_symbols_definitions().
|
||||
`prepare_symbols_definitions()` in `src/output.c`.
|
||||
|
||||
The various FIELDS are:
|
||||
The macro `b4_symbol(NUM, FIELD)` gives access to the following FIELDS:
|
||||
|
||||
- `has_id`: 0 or 1.
|
||||
|
||||
- has_id: 0 or 1.
|
||||
Whether the symbol has an id.
|
||||
- id: string
|
||||
If has_id, the id. Guaranteed to be usable as a C identifier.
|
||||
Prefixed by api.token.prefix if defined.
|
||||
- tag: string.
|
||||
|
||||
- `id`: string
|
||||
If has_id, the id (prefixed by api.token.prefix if defined), otherwise
|
||||
defined as empty. Guaranteed to be usable as a C identifier.
|
||||
|
||||
- `tag`: string.
|
||||
A representation of the symbol. Can be 'foo', 'foo.id', '"foo"' etc.
|
||||
- user_number: integer
|
||||
|
||||
- `user_number`: integer
|
||||
The external number as used by yylex. Can be ASCII code when a character,
|
||||
some number chosen by bison, or some user number in the case of
|
||||
%token FOO <NUM>. Corresponds to yychar in yacc.c.
|
||||
- is_token: 0 or 1
|
||||
|
||||
- `is_token`: 0 or 1
|
||||
Whether this is a terminal symbol.
|
||||
- number: integer
|
||||
|
||||
- `number`: integer
|
||||
The internal number (computed from the external number by yytranslate).
|
||||
Corresponds to yytoken in yacc.c. This is the same number that serves as
|
||||
key in b4_symbol(NUM, FIELD).
|
||||
- has_type: 0, 1
|
||||
|
||||
In bison, symbols are first assigned increasing numbers in order of
|
||||
appearance (but tokens first, then nterms). After grammar reduction,
|
||||
unused nterms are then renumbered to appear last (i.e., first tokens, then
|
||||
used nterms and finally unused nterms). This final number NUM is the one
|
||||
contained in this field, and it is the one used as key in `b4_symbol(NUM,
|
||||
FIELD)`.
|
||||
|
||||
The code of the rule actions, however, is emitted before we know what
|
||||
symbols are unused, so they use the original numbers. To avoid confusion,
|
||||
they actually use "orig NUM" instead of just "NUM". bison also emits
|
||||
definitions for `b4_symbol(orig NUM, number)` that map from original
|
||||
numbers to the new ones. `b4_symbol` actually resolves `orig NUM` in the
|
||||
other case, i.e., `b4_symbol(orig 42, tag)` would return the tag of the
|
||||
symbols whose original number was 42.
|
||||
|
||||
- `has_type`: 0, 1
|
||||
Whether has a semantic value.
|
||||
- type_tag: string
|
||||
|
||||
- `type_tag`: string
|
||||
When api.value.type=union, the generated name for the union member.
|
||||
yytype_INT etc. for symbols that has_id, otherwise yytype_1 etc.
|
||||
- type
|
||||
|
||||
- `type`
|
||||
If it has a semantic value, its type tag, or, if variant are used,
|
||||
its type.
|
||||
In the case of api.value.type=union, type is the real type (e.g. int).
|
||||
- has_printer: 0, 1
|
||||
- printer: string
|
||||
- printer_file: string
|
||||
- printer_line: integer
|
||||
|
||||
- `has_printer`: 0, 1
|
||||
- `printer`: string
|
||||
- `printer_file`: string
|
||||
- `printer_line`: integer
|
||||
If the symbol has a printer, everything about it.
|
||||
- has_destructor, destructor, destructor_file, destructor_line
|
||||
|
||||
- `has_destructor`, `destructor`, `destructor_file`, `destructor_line`
|
||||
Likewise.
|
||||
|
||||
### b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
|
||||
### `b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])`
|
||||
Expansion of $$, $1, $<TYPE-TAG>3, etc.
|
||||
|
||||
The semantic value from a given VAL.
|
||||
@@ -127,14 +154,14 @@ The semantic value from a given VAL.
|
||||
The result can be used safely, it is put in parens to avoid nasty precedence
|
||||
issues.
|
||||
|
||||
### b4_lhs_value(SYMBOL-NUM, [TYPE])
|
||||
### `b4_lhs_value(SYMBOL-NUM, [TYPE])`
|
||||
Expansion of `$$` or `$<TYPE>$`, for symbol `SYMBOL-NUM`.
|
||||
|
||||
### b4_rhs_data(RULE-LENGTH, POS)
|
||||
### `b4_rhs_data(RULE-LENGTH, POS)`
|
||||
The data corresponding to the symbol `#POS`, where the current rule has
|
||||
`RULE-LENGTH` symbols on RHS.
|
||||
|
||||
### b4_rhs_value(RULE-LENGTH, POS, SYMBOL-NUM, [TYPE])
|
||||
### `b4_rhs_value(RULE-LENGTH, POS, SYMBOL-NUM, [TYPE])`
|
||||
Expansion of `$<TYPE>POS`, where the current rule has `RULE-LENGTH` symbols
|
||||
on RHS.
|
||||
|
||||
|
||||
+18
-5
@@ -389,17 +389,28 @@ m4_define([b4_glr_cc_if],
|
||||
#
|
||||
# The following macros provide access to symbol related values.
|
||||
|
||||
# _b4_symbol(NUM, FIELD)
|
||||
# ----------------------
|
||||
# __b4_symbol(NUM, FIELD)
|
||||
# -----------------------
|
||||
# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if
|
||||
# undefined.
|
||||
m4_define([_b4_symbol],
|
||||
m4_define([__b4_symbol],
|
||||
[m4_indir([b4_symbol($1, $2)])])
|
||||
|
||||
|
||||
# _b4_symbol(NUM, FIELD)
|
||||
# ----------------------
|
||||
# Recover a FIELD about symbol #NUM (or "orig NUM"). Fails if
|
||||
# undefined.
|
||||
m4_define([_b4_symbol],
|
||||
[m4_ifdef([b4_symbol($1, number)],
|
||||
[__b4_symbol(m4_indir([b4_symbol($1, number)]), $2)],
|
||||
[__b4_symbol([$1], [$2])])])
|
||||
|
||||
|
||||
|
||||
# b4_symbol(NUM, FIELD)
|
||||
# ---------------------
|
||||
# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if
|
||||
# Recover a FIELD about symbol #NUM (or "orig NUM"). Fails if
|
||||
# undefined. If FIELD = id, prepend the token prefix.
|
||||
m4_define([b4_symbol],
|
||||
[m4_case([$2],
|
||||
@@ -480,7 +491,9 @@ m4_popdef([b4_actions_])dnl
|
||||
|
||||
# _b4_symbol_case(SYMBOL-NUM)
|
||||
# ---------------------------
|
||||
# Issue a "case NUM" for SYMBOL-NUM.
|
||||
# Issue a "case NUM" for SYMBOL-NUM. Ends with its EOL to make it
|
||||
# easier to use with m4_map, but then, use []dnl to suppress the last
|
||||
# one.
|
||||
m4_define([_b4_symbol_case],
|
||||
[case b4_symbol([$1], [number]): b4_symbol_tag_comment([$1])])
|
||||
])
|
||||
|
||||
+13
-4
@@ -77,11 +77,13 @@ m4_define([b4_cxx_portability],
|
||||
// Support noexcept when possible.
|
||||
#if 201103L <= YY_CPLUSPLUS
|
||||
# define YY_NOEXCEPT noexcept
|
||||
# define YY_NOTHROW
|
||||
#else
|
||||
# define YY_NOEXCEPT
|
||||
#endif[]dnl
|
||||
# define YY_NOTHROW throw ()
|
||||
#endif
|
||||
|
||||
// Support noexcept when possible.
|
||||
// Support constexpr when possible.
|
||||
#if 201703 <= YY_CPLUSPLUS
|
||||
# define YY_CONSTEXPR constexpr
|
||||
#else
|
||||
@@ -217,7 +219,14 @@ m4_define([b4_public_types_declare],
|
||||
syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m)
|
||||
: std::runtime_error (m)]b4_locations_if([
|
||||
, location (l)])[
|
||||
{}]b4_locations_if([
|
||||
{}
|
||||
|
||||
syntax_error (const syntax_error& s)
|
||||
: std::runtime_error (s.what ())]b4_locations_if([
|
||||
, location (s.location)])[
|
||||
{}
|
||||
|
||||
~syntax_error () YY_NOEXCEPT YY_NOTHROW;]b4_locations_if([
|
||||
|
||||
location_type location;])[
|
||||
};
|
||||
@@ -507,7 +516,7 @@ m4_define([b4_public_types_define],
|
||||
])
|
||||
|
||||
|
||||
# b4_tolen_constructor_define
|
||||
# b4_token_constructor_define
|
||||
# ----------------------------
|
||||
# Define symbol constructors for all the value types.
|
||||
# Use at class-level. Redefined in variant.hh.
|
||||
|
||||
@@ -160,6 +160,9 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
|
||||
]b4_parser_class::~b4_parser_class[ ()
|
||||
{}
|
||||
|
||||
]b4_parser_class[::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
|
||||
{}
|
||||
|
||||
int
|
||||
]b4_parser_class[::operator() ()
|
||||
{
|
||||
@@ -246,9 +249,12 @@ b4_percent_code_get([[requires]])[
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
]m4_ifdef([b4_location_file],
|
||||
]b4_cxx_portability[
|
||||
]m4_ifdef([b4_location_include],
|
||||
[[# include ]b4_location_include])[
|
||||
]b4_variant_if([b4_variant_includes])[
|
||||
|
||||
]b4_attribute_define[
|
||||
]b4_null_define[
|
||||
|
||||
// Whether we are compiled with exception support.
|
||||
@@ -263,6 +269,7 @@ b4_percent_code_get([[requires]])[
|
||||
]b4_YYDEBUG_define[
|
||||
|
||||
]b4_namespace_open[
|
||||
|
||||
]b4_bison_locations_if([m4_ifndef([b4_location_file],
|
||||
[b4_location_define])])[
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ b4_dollar_pushdef([yysym.value],
|
||||
[$1],
|
||||
[],
|
||||
[yysym.location])dnl
|
||||
_b4_symbol_case([$1])
|
||||
_b4_symbol_case([$1])[]dnl
|
||||
b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])
|
||||
b4_symbol([$1], [$2])
|
||||
b4_syncline([@oline@], [@ofile@])
|
||||
@@ -562,6 +562,8 @@ m4_if(b4_prefix, [yy], [],
|
||||
]b4_parser_class::~b4_parser_class[ ()
|
||||
{}
|
||||
|
||||
]b4_parser_class[::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
|
||||
{}
|
||||
|
||||
/*---------------.
|
||||
| Symbol types. |
|
||||
@@ -662,10 +664,12 @@ m4_if(b4_prefix, [yy], [],
|
||||
std::ostream& yyoutput = yyo;
|
||||
YYUSE (yyoutput);
|
||||
symbol_number_type yytype = yysym.type_get ();
|
||||
#if defined __GNUC__ && ! defined __clang__ && ! defined __ICC && __GNUC__ * 100 + __GNUC_MINOR__ <= 408
|
||||
// Avoid a (spurious) G++ 4.8 warning about "array subscript is
|
||||
// below array bounds".
|
||||
if (yysym.empty ())
|
||||
std::abort ();
|
||||
#endif
|
||||
yyo << (yytype < yyntokens_ ? "token" : "nterm")
|
||||
<< ' ' << yytname_[yytype] << " ("]b4_locations_if([
|
||||
<< yysym.location << ": "])[;
|
||||
|
||||
+16
-16
@@ -10272,8 +10272,8 @@ Print the name of the directory containing skeletons and XSLT.
|
||||
@item -u
|
||||
@item --update
|
||||
Update the grammar file (remove duplicates, update deprecated directives,
|
||||
etc.). Leaves a backup of the original file with a @code{~} appended. For
|
||||
instance:
|
||||
etc.) and exit (i.e., do not generate any of the output files). Leaves a
|
||||
backup of the original file with a @code{~} appended. For instance:
|
||||
|
||||
@example
|
||||
@group
|
||||
@@ -10308,26 +10308,26 @@ See the documentation of @option{--feature=fixit} below for more details.
|
||||
|
||||
@item -y
|
||||
@itemx --yacc
|
||||
Act more like the traditional Yacc command. This can cause different
|
||||
diagnostics to be generated, and may change behavior in other minor
|
||||
ways. Most importantly, imitate Yacc's output file name conventions,
|
||||
so that the parser implementation file is called @file{y.tab.c}, and
|
||||
the other outputs are called @file{y.output} and @file{y.tab.h}.
|
||||
Also, if generating a deterministic parser in C, generate
|
||||
@code{#define} statements in addition to an @code{enum} to associate
|
||||
token numbers with token names. Thus, the following shell script can
|
||||
substitute for Yacc, and the Bison distribution contains such a script
|
||||
for compatibility with POSIX:
|
||||
Act more like the traditional @command{yacc} command. This can cause
|
||||
different diagnostics to be generated (it implies @option{-Wyacc}), and may
|
||||
change behavior in other minor ways. Most importantly, imitate Yacc's
|
||||
output file name conventions, so that the parser implementation file is
|
||||
called @file{y.tab.c}, and the other outputs are called @file{y.output} and
|
||||
@file{y.tab.h}. Also, if generating a deterministic parser in C, generate
|
||||
@code{#define} statements in addition to an @code{enum} to associate token
|
||||
numbers with token names. Thus, the following shell script can substitute
|
||||
for Yacc, and the Bison distribution contains such a script for
|
||||
compatibility with POSIX:
|
||||
|
||||
@example
|
||||
#! /bin/sh
|
||||
bison -y "$@@"
|
||||
@end example
|
||||
|
||||
The @option{-y}/@option{--yacc} option is intended for use with
|
||||
traditional Yacc grammars. If your grammar uses a Bison extension
|
||||
like @samp{%glr-parser}, Bison might not be Yacc-compatible even if
|
||||
this option is specified.
|
||||
The @option{-y}/@option{--yacc} option is intended for use with traditional
|
||||
Yacc grammars. If your grammar uses Bison extensions like
|
||||
@samp{%glr-parser}, Bison might not be Yacc-compatible even if this option
|
||||
is specified.
|
||||
|
||||
@item -W [@var{category}]
|
||||
@itemx --warnings[=@var{category}]
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
SHELL=/bin/sh
|
||||
export SHELL
|
||||
|
||||
me=$(basename "$1" .test)
|
||||
medir=$(dirname "$1" | sed -e 's,.*examples/,,')
|
||||
|
||||
|
||||
+1
-1
Submodule gnulib updated: 315eb5ffc1...34881aff40
+9
-4
@@ -279,15 +279,18 @@ error_message (const location *loc, warnings flags, const char *prefix,
|
||||
*indent_ptr = pos;
|
||||
else if (*indent_ptr > pos)
|
||||
fprintf (stderr, "%*s", *indent_ptr - pos, "");
|
||||
indent_ptr = 0;
|
||||
indent_ptr = NULL;
|
||||
}
|
||||
|
||||
if (prefix)
|
||||
fprintf (stderr, "%s: ", prefix);
|
||||
|
||||
vfprintf (stderr, message, args);
|
||||
if (! (flags & silent))
|
||||
/* Print the type of warning, only if this is not a sub message
|
||||
(in which case the prefix is null). */
|
||||
if (! (flags & silent) && prefix)
|
||||
warnings_print_categories (flags, stderr);
|
||||
|
||||
{
|
||||
size_t l = strlen (message);
|
||||
if (l < 2 || message[l - 2] != ':' || message[l - 1] != ' ')
|
||||
@@ -418,8 +421,10 @@ duplicate_rule_directive (char const *directive,
|
||||
location first, location second)
|
||||
{
|
||||
unsigned i = 0;
|
||||
complain_indent (&second, complaint, &i, _("only one %s allowed per rule"), directive);
|
||||
complain_indent (&second, complaint, &i,
|
||||
_("only one %s allowed per rule"), directive);
|
||||
i += SUB_INDENT;
|
||||
complain_indent (&first, complaint, &i, _("previous declaration"));
|
||||
complain_indent (&first, complaint, &i,
|
||||
_("previous declaration"));
|
||||
fixits_register (&second, "");
|
||||
}
|
||||
|
||||
+2
-2
@@ -287,7 +287,7 @@ Operation modes:\n\
|
||||
and exit\n\
|
||||
--print-datadir output directory containing skeletons and XSLT\n\
|
||||
and exit\n\
|
||||
-u, --update apply fixes to the source grammar file\n\
|
||||
-u, --update apply fixes to the source grammar file and exit\n\
|
||||
-y, --yacc emulate POSIX Yacc\n\
|
||||
-W, --warnings[=CATEGORY] report the warnings falling in CATEGORY\n\
|
||||
-f, --feature[=FEATURE] activate miscellaneous features\n\
|
||||
@@ -708,7 +708,7 @@ getargs (int argc, char *argv[])
|
||||
break;
|
||||
|
||||
case 'y':
|
||||
warning_argmatch ("error=yacc", 0, 6);
|
||||
warning_argmatch ("yacc", 0, 0);
|
||||
yacc_loc = command_line_location ();
|
||||
break;
|
||||
|
||||
|
||||
+1
-1
@@ -329,7 +329,7 @@ state_lookahead_tokens_count (state *s, bool default_reduction_only_for_accept)
|
||||
&& default_reduction_only_for_accept))
|
||||
n_lookahead_tokens += rp->num;
|
||||
else
|
||||
s->consistent = 1;
|
||||
s->consistent = true;
|
||||
|
||||
return n_lookahead_tokens;
|
||||
}
|
||||
|
||||
+31
-25
@@ -155,31 +155,34 @@ main (int argc, char *argv[])
|
||||
|
||||
print_precedence_warnings ();
|
||||
|
||||
/* Output file names. */
|
||||
compute_output_file_names ();
|
||||
|
||||
/* Output the detailed report on the grammar. */
|
||||
if (report_flag)
|
||||
if (!update_flag)
|
||||
{
|
||||
timevar_push (tv_report);
|
||||
print_results ();
|
||||
timevar_pop (tv_report);
|
||||
}
|
||||
/* Output file names. */
|
||||
compute_output_file_names ();
|
||||
|
||||
/* Output the graph. */
|
||||
if (graph_flag)
|
||||
{
|
||||
timevar_push (tv_graph);
|
||||
print_graph ();
|
||||
timevar_pop (tv_graph);
|
||||
}
|
||||
/* Output the detailed report on the grammar. */
|
||||
if (report_flag)
|
||||
{
|
||||
timevar_push (tv_report);
|
||||
print_results ();
|
||||
timevar_pop (tv_report);
|
||||
}
|
||||
|
||||
/* Output xml. */
|
||||
if (xml_flag)
|
||||
{
|
||||
timevar_push (tv_xml);
|
||||
print_xml ();
|
||||
timevar_pop (tv_xml);
|
||||
/* Output the graph. */
|
||||
if (graph_flag)
|
||||
{
|
||||
timevar_push (tv_graph);
|
||||
print_graph ();
|
||||
timevar_pop (tv_graph);
|
||||
}
|
||||
|
||||
/* Output xml. */
|
||||
if (xml_flag)
|
||||
{
|
||||
timevar_push (tv_xml);
|
||||
print_xml ();
|
||||
timevar_pop (tv_xml);
|
||||
}
|
||||
}
|
||||
|
||||
/* Stop if there were errors, to avoid trashing previous output
|
||||
@@ -193,9 +196,12 @@ main (int argc, char *argv[])
|
||||
timevar_pop (tv_free);
|
||||
|
||||
/* Output the tables and the parser to ftable. In file output. */
|
||||
timevar_push (tv_parser);
|
||||
output ();
|
||||
timevar_pop (tv_parser);
|
||||
if (!update_flag)
|
||||
{
|
||||
timevar_push (tv_parser);
|
||||
output ();
|
||||
timevar_pop (tv_parser);
|
||||
}
|
||||
|
||||
timevar_push (tv_free);
|
||||
nullable_free ();
|
||||
|
||||
+20
-14
@@ -520,21 +520,27 @@ muscle_percent_define_insert (char const *var, location variable_loc,
|
||||
|
||||
/* Command-line options are processed before the grammar file. */
|
||||
bool warned = false;
|
||||
if (how == MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE
|
||||
&& muscle_find_const (name))
|
||||
if (how == MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE)
|
||||
{
|
||||
muscle_percent_define_how how_old = atoi (muscle_find_const (how_name));
|
||||
if (how_old == MUSCLE_PERCENT_DEFINE_F)
|
||||
goto end;
|
||||
unsigned i = 0;
|
||||
complain_indent (&variable_loc, complaint, &i,
|
||||
_("%%define variable %s redefined"),
|
||||
quote (variable));
|
||||
i += SUB_INDENT;
|
||||
location loc = muscle_percent_define_get_loc (variable);
|
||||
complain_indent (&loc, complaint, &i, _("previous definition"));
|
||||
fixits_register (&variable_loc, "");
|
||||
warned = true;
|
||||
char const *current_value = muscle_find_const (name);
|
||||
if (current_value)
|
||||
{
|
||||
muscle_percent_define_how how_old
|
||||
= atoi (muscle_find_const (how_name));
|
||||
if (how_old == MUSCLE_PERCENT_DEFINE_F)
|
||||
goto end;
|
||||
unsigned i = 0;
|
||||
/* If assigning the same value, make it a warning. */
|
||||
warnings warn = STREQ (value, current_value) ? Wother : complaint;
|
||||
complain_indent (&variable_loc, warn, &i,
|
||||
_("%%define variable %s redefined"),
|
||||
quote (variable));
|
||||
i += SUB_INDENT;
|
||||
location loc = muscle_percent_define_get_loc (variable);
|
||||
complain_indent (&loc, warn, &i, _("previous definition"));
|
||||
fixits_register (&variable_loc, "");
|
||||
warned = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!warned && old && upd)
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "muscle-tab.h"
|
||||
#include "output.h"
|
||||
#include "reader.h"
|
||||
#include "reduce.h"
|
||||
#include "scan-code.h" /* max_left_semantic_context */
|
||||
#include "scan-skel.h"
|
||||
#include "symtab.h"
|
||||
@@ -414,6 +415,14 @@ merger_output (FILE *out)
|
||||
static void
|
||||
prepare_symbol_definitions (void)
|
||||
{
|
||||
/* Map "orig NUM" to new numbers. See data/README. */
|
||||
for (symbol_number i = ntokens; i < nsyms + nuseless_nonterminals; ++i)
|
||||
{
|
||||
obstack_printf (&format_obstack, "symbol(orig %d, number)", i);
|
||||
const char *key = obstack_finish0 (&format_obstack);
|
||||
MUSCLE_INSERT_INT (key, nterm_map ? nterm_map[i - ntokens] : i);
|
||||
}
|
||||
|
||||
for (int i = 0; i < nsyms; ++i)
|
||||
{
|
||||
symbol *sym = symbols[i];
|
||||
|
||||
+13
-12
@@ -259,22 +259,23 @@ reduce_grammar_tables (void)
|
||||
| Remove useless nonterminals. |
|
||||
`------------------------------*/
|
||||
|
||||
symbol_number *nterm_map = NULL;
|
||||
|
||||
static void
|
||||
nonterminals_reduce (void)
|
||||
{
|
||||
nterm_map = xnmalloc (nvars, sizeof *nterm_map);
|
||||
/* Map the nonterminals to their new index: useful first, useless
|
||||
afterwards. Kept for later report. */
|
||||
|
||||
symbol_number *nontermmap = xnmalloc (nvars, sizeof *nontermmap);
|
||||
{
|
||||
symbol_number n = ntokens;
|
||||
for (symbol_number i = ntokens; i < nsyms; ++i)
|
||||
if (bitset_test (V, i))
|
||||
nontermmap[i - ntokens] = n++;
|
||||
nterm_map[i - ntokens] = n++;
|
||||
for (symbol_number i = ntokens; i < nsyms; ++i)
|
||||
if (!bitset_test (V, i))
|
||||
{
|
||||
nontermmap[i - ntokens] = n++;
|
||||
nterm_map[i - ntokens] = n++;
|
||||
if (symbols[i]->content->status != used)
|
||||
complain (&symbols[i]->location, Wother,
|
||||
_("nonterminal useless in grammar: %s"),
|
||||
@@ -282,32 +283,30 @@ nonterminals_reduce (void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Shuffle elements of tables indexed by symbol number. */
|
||||
{
|
||||
symbol **symbols_sorted = xnmalloc (nvars, sizeof *symbols_sorted);
|
||||
for (symbol_number i = ntokens; i < nsyms; ++i)
|
||||
symbols[i]->content->number = nontermmap[i - ntokens];
|
||||
symbols[i]->content->number = nterm_map[i - ntokens];
|
||||
for (symbol_number i = ntokens; i < nsyms; ++i)
|
||||
symbols_sorted[nontermmap[i - ntokens] - ntokens] = symbols[i];
|
||||
symbols_sorted[nterm_map[i - ntokens] - ntokens] = symbols[i];
|
||||
for (symbol_number i = ntokens; i < nsyms; ++i)
|
||||
symbols[i] = symbols_sorted[i - ntokens];
|
||||
free (symbols_sorted);
|
||||
}
|
||||
|
||||
/* Update nonterminal numbers in the RHS of the rules. LHS are
|
||||
pointers to the symbol structure, they don't need renumbering. */
|
||||
{
|
||||
for (rule_number r = 0; r < nrules; ++r)
|
||||
for (item_number *rhsp = rules[r].rhs; 0 <= *rhsp; ++rhsp)
|
||||
if (ISVAR (*rhsp))
|
||||
*rhsp = symbol_number_as_item_number (nontermmap[*rhsp
|
||||
- ntokens]);
|
||||
accept->content->number = nontermmap[accept->content->number - ntokens];
|
||||
*rhsp = symbol_number_as_item_number (nterm_map[*rhsp - ntokens]);
|
||||
accept->content->number = nterm_map[accept->content->number - ntokens];
|
||||
}
|
||||
|
||||
nsyms -= nuseless_nonterminals;
|
||||
nvars -= nuseless_nonterminals;
|
||||
|
||||
free (nontermmap);
|
||||
}
|
||||
|
||||
|
||||
@@ -433,4 +432,6 @@ reduce_free (void)
|
||||
bitset_free (V);
|
||||
bitset_free (V1);
|
||||
bitset_free (P);
|
||||
free (nterm_map);
|
||||
nterm_map = NULL;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,11 @@ bool reduce_nonterminal_useless_in_grammar (const sym_content *sym);
|
||||
|
||||
void reduce_free (void);
|
||||
|
||||
/** Map initial nterm numbers to the new ones. Built by
|
||||
* reduce_grammar. Size nvars + nuseless_nonterminals. */
|
||||
extern symbol_number *nterm_map;
|
||||
|
||||
extern unsigned nuseless_nonterminals;
|
||||
extern unsigned nuseless_productions;
|
||||
|
||||
#endif /* !REDUCE_H_ */
|
||||
|
||||
+4
-2
@@ -648,7 +648,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
|
||||
untyped_var_seen = true;
|
||||
}
|
||||
|
||||
obstack_printf (&obstack_for_string, "]b4_lhs_value(%d, ",
|
||||
obstack_printf (&obstack_for_string, "]b4_lhs_value(orig %d, ",
|
||||
sym->content.sym->content->number);
|
||||
obstack_quote (&obstack_for_string, type_name);
|
||||
obstack_sgrow (&obstack_for_string, ")[");
|
||||
@@ -677,7 +677,9 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
|
||||
"]b4_rhs_value(%d, %d, ",
|
||||
effective_rule_length, n);
|
||||
if (sym)
|
||||
obstack_printf (&obstack_for_string, "%d, ", sym->content.sym->content->number);
|
||||
obstack_printf (&obstack_for_string, "%s%d, ",
|
||||
sym->content.sym->content->class == nterm_sym ? "orig " : "",
|
||||
sym->content.sym->content->number);
|
||||
else
|
||||
obstack_sgrow (&obstack_for_string, "[], ");
|
||||
|
||||
|
||||
+1
-1
@@ -143,7 +143,7 @@ state_new (symbol_number accessing_symbol,
|
||||
res->reductions = NULL;
|
||||
res->errs = NULL;
|
||||
res->state_list = NULL;
|
||||
res->consistent = 0;
|
||||
res->consistent = false;
|
||||
res->solved_conflicts = NULL;
|
||||
res->solved_conflicts_xml = NULL;
|
||||
|
||||
|
||||
+5
-3
@@ -81,6 +81,8 @@
|
||||
#ifndef STATE_H_
|
||||
# define STATE_H_
|
||||
|
||||
# include <stdbool.h>
|
||||
|
||||
# include <bitset.h>
|
||||
|
||||
# include "gram.h"
|
||||
@@ -208,9 +210,9 @@ struct state
|
||||
store in this member a reference to the node containing each state. */
|
||||
struct state_list *state_list;
|
||||
|
||||
/* If non-zero, then no lookahead sets on reduce actions are needed to
|
||||
decide what to do in state S. */
|
||||
char consistent;
|
||||
/* Whether no lookahead sets on reduce actions are needed to decide
|
||||
what to do in state S. */
|
||||
bool consistent;
|
||||
|
||||
/* If some conflicts were solved thanks to precedence/associativity,
|
||||
a human readable description of the resolution. */
|
||||
|
||||
+10
-8
@@ -543,7 +543,7 @@ AT_DATA_GRAMMAR([[input.y]],
|
||||
|
||||
#define YYINITDEPTH 10
|
||||
#define YYMAXDEPTH 10
|
||||
#define RANGE(Location) ]AT_LALR1_CC_IF([(Location).begin.line, (Location).end.line],
|
||||
#define RANGE(Location) ]AT_CXX_IF([(Location).begin.line, (Location).end.line],
|
||||
[(Location).first_line, (Location).last_line])[
|
||||
|
||||
#define USE(SYM)
|
||||
@@ -572,8 +572,8 @@ AT_LALR1_CC_IF([typedef yy::location YYLTYPE;])[
|
||||
/* FIXME: This %printer isn't actually tested. */
|
||||
%printer
|
||||
{
|
||||
]AT_LALR1_CC_IF([yyo << $$;],
|
||||
[fprintf (yyo, "%d", $$)])[;
|
||||
]AT_CXX_IF([yyo << $$;],
|
||||
[fprintf (yyo, "%d", $$)])[;
|
||||
}
|
||||
'(' 'x' 'y' ')' ';' thing line input '!' raise check-spontaneous-errors END
|
||||
|
||||
@@ -734,9 +734,8 @@ static
|
||||
fprintf (stderr, " (%d@%d-%d)\n", c, RANGE (]AT_LOC[));
|
||||
return source[c];
|
||||
}
|
||||
]AT_LALR1_CC_IF(
|
||||
[static bool yydebug;
|
||||
int
|
||||
]AT_LALR1_CC_IF([static bool yydebug;])[
|
||||
]AT_CXX_IF([int
|
||||
yyparse ()
|
||||
{
|
||||
yy::parser parser;
|
||||
@@ -999,11 +998,14 @@ AT_CLEANUP
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([])
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([], [ with union])
|
||||
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser])
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union])
|
||||
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"])
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [ with union])
|
||||
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser])
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union])
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr.cc"])
|
||||
AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr.cc"], [ with union])
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -330,6 +330,7 @@ AT_CHECK([[$PERL -n -0777 -e '
|
||||
|YY_MOVE_OR_COPY
|
||||
|YY_MOVE_REF
|
||||
|YY_NOEXCEPT
|
||||
|YY_NOTHROW
|
||||
|YY_NULLPTR
|
||||
|YY_RVREF
|
||||
|YY_\w+_INCLUDED
|
||||
|
||||
+44
-41
@@ -1402,15 +1402,15 @@ without_period: "WITHOUT.PERIOD";
|
||||
AT_BISON_OPTION_POPDEFS
|
||||
|
||||
# POSIX Yacc accept periods, but not dashes.
|
||||
AT_BISON_CHECK([--yacc input.y], [1], [],
|
||||
[[input.y:1.1-5: error: POSIX Yacc does not support %code [-Werror=yacc]
|
||||
input.y:9.8-16: error: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Werror=yacc]
|
||||
input.y:10.21-34: error: POSIX Yacc does not support string literals [-Werror=yacc]
|
||||
input.y:12.23-38: error: POSIX Yacc does not support string literals [-Werror=yacc]
|
||||
input.y:13.1-5: error: POSIX Yacc does not support %code [-Werror=yacc]
|
||||
input.y:20.8-16: error: POSIX Yacc forbids dashes in symbol names: with-dash [-Werror=yacc]
|
||||
input.y:22.15-28: error: POSIX Yacc does not support string literals [-Werror=yacc]
|
||||
input.y:24.17-32: error: POSIX Yacc does not support string literals [-Werror=yacc]
|
||||
AT_BISON_CHECK([--yacc input.y], [], [],
|
||||
[[input.y:1.1-5: warning: POSIX Yacc does not support %code [-Wyacc]
|
||||
input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
|
||||
input.y:10.21-34: warning: POSIX Yacc does not support string literals [-Wyacc]
|
||||
input.y:12.23-38: warning: POSIX Yacc does not support string literals [-Wyacc]
|
||||
input.y:13.1-5: warning: POSIX Yacc does not support %code [-Wyacc]
|
||||
input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
|
||||
input.y:22.15-28: warning: POSIX Yacc does not support string literals [-Wyacc]
|
||||
input.y:24.17-32: warning: POSIX Yacc does not support string literals [-Wyacc]
|
||||
]])
|
||||
|
||||
# Dashes are fine for GNU Bison.
|
||||
@@ -1740,7 +1740,7 @@ start: %empty;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[input-redefined.y]], [[1]], [],
|
||||
[[input-redefined.y:2.1-20: error: %define variable 'var' redefined
|
||||
[[input-redefined.y:2.1-20: warning: %define variable 'var' redefined [-Wother]
|
||||
input-redefined.y:1.1-20: previous definition
|
||||
input-redefined.y:3.2-21: error: %define variable 'var' redefined
|
||||
input-redefined.y:2.1-20: previous definition
|
||||
@@ -1992,7 +1992,6 @@ AT_DATA([[input.y]],
|
||||
[[%define api.push_pull both
|
||||
%define lr.keep_unreachable_states maybe
|
||||
%define namespace "foo"
|
||||
%define api.namespace {foo}
|
||||
%define variant
|
||||
%define parser_class_name {parser}
|
||||
%%
|
||||
@@ -2008,18 +2007,15 @@ input.y:2.1-40: warning: deprecated directive, use '%define lr.keep-unreachable-
|
||||
input.y:3.1-23: warning: deprecated directive, use '%define api.namespace {foo}' [-Wdeprecated]
|
||||
%define namespace "foo"
|
||||
^~~~~~~~~~~~~~~~~~~~~~~
|
||||
input.y:4.1-27: error: %define variable 'api.namespace' redefined
|
||||
%define api.namespace {foo}
|
||||
^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
input.y:3.1-23: previous definition
|
||||
%define namespace "foo"
|
||||
^~~~~~~~~~~~~~~~~~~~~~~
|
||||
input.y:5.1-15: warning: deprecated directive, use '%define api.value.type variant' [-Wdeprecated]
|
||||
input.y:4.1-15: warning: deprecated directive, use '%define api.value.type variant' [-Wdeprecated]
|
||||
%define variant
|
||||
^~~~~~~~~~~~~~~
|
||||
input.y:6.1-34: warning: deprecated directive, use '%define api.parser.class {parser}' [-Wdeprecated]
|
||||
input.y:5.1-34: warning: deprecated directive, use '%define api.parser.class {parser}' [-Wdeprecated]
|
||||
%define parser_class_name {parser}
|
||||
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
input.y:2.1-40: error: invalid value for %define Boolean variable 'lr.keep-unreachable-state'
|
||||
%define lr.keep_unreachable_states maybe
|
||||
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
|
||||
]])
|
||||
|
||||
@@ -2337,8 +2333,8 @@ AT_CLEANUP
|
||||
|
||||
AT_SETUP([[Redefined %union name]])
|
||||
|
||||
# AT_TEST(DIRECTIVES, ERROR)
|
||||
# --------------------------
|
||||
# AT_TEST(DIRECTIVES, EXIT-STATUS, ERROR)
|
||||
# ---------------------------------------
|
||||
m4_pushdef([AT_TEST],
|
||||
[AT_DATA([[input.y]],
|
||||
[$1
|
||||
@@ -2346,27 +2342,28 @@ m4_pushdef([AT_TEST],
|
||||
exp: %empty;
|
||||
])
|
||||
|
||||
AT_BISON_CHECK([[input.y]], [[1]], [[]],
|
||||
[$2])
|
||||
AT_BISON_CHECK([[input.y]], [$2], [[]],
|
||||
[$3])
|
||||
])
|
||||
|
||||
AT_TEST([[%union foo {};
|
||||
%union {};
|
||||
%union foo {};
|
||||
%define api.value.union.name foo]],
|
||||
[[input.y:3.8-10: error: %define variable 'api.value.union.name' redefined
|
||||
[0],
|
||||
[[input.y:3.8-10: warning: %define variable 'api.value.union.name' redefined [-Wother]
|
||||
input.y:1.8-10: previous definition
|
||||
input.y:4.1-32: error: %define variable 'api.value.union.name' redefined
|
||||
input.y:4.1-32: warning: %define variable 'api.value.union.name' redefined [-Wother]
|
||||
input.y:3.8-10: previous definition
|
||||
input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
|
||||
]])
|
||||
|
||||
AT_TEST([[%define api.value.union.name {foo}]],
|
||||
AT_TEST([[%define api.value.union.name {foo}]], [1],
|
||||
[[input.y:1.1-34: error: %define variable 'api.value.union.name' requires keyword values
|
||||
input.y:1.1-34: error: %define variable 'api.value.union.name' is not used
|
||||
]])
|
||||
|
||||
AT_TEST([[%define api.value.union.name "foo"]],
|
||||
AT_TEST([[%define api.value.union.name "foo"]], [1],
|
||||
[[input.y:1.1-34: error: %define variable 'api.value.union.name' requires keyword values
|
||||
input.y:1.1-34: error: %define variable 'api.value.union.name' is not used
|
||||
]])
|
||||
@@ -2503,7 +2500,7 @@ AT_DATA_GRAMMAR([[input.y]],
|
||||
%no-default_prec
|
||||
%no_default-prec
|
||||
%no_lines
|
||||
%output = "foo"
|
||||
%output = "output.c"
|
||||
%pure_parser
|
||||
%token_table
|
||||
%error-verbose
|
||||
@@ -2523,15 +2520,15 @@ fix-it:"input.y":{12:1-12:11}:"%expect-rr"
|
||||
input.y:13.1-14: warning: deprecated directive: '%file-prefix =', use '%file-prefix' [-Wdeprecated]
|
||||
fix-it:"input.y":{13:1-13:15}:"%file-prefix"
|
||||
input.y:14.1-16.5: warning: duplicate directive: '%file-prefix\n =' [-Wother]
|
||||
input.y:13.1-20: previous declaration [-Wother]
|
||||
input.y:13.1-20: previous declaration
|
||||
fix-it:"input.y":{14:1-16:6}:""
|
||||
input.y:17.1-19: warning: deprecated directive: '%fixed-output_files', use '%fixed-output-files' [-Wdeprecated]
|
||||
fix-it:"input.y":{17:1-17:20}:"%fixed-output-files"
|
||||
input.y:18.1-19: warning: duplicate directive: '%fixed_output-files' [-Wother]
|
||||
input.y:17.1-19: previous declaration [-Wother]
|
||||
input.y:17.1-19: previous declaration
|
||||
fix-it:"input.y":{18:1-18:20}:""
|
||||
input.y:19.1-19: warning: duplicate directive: '%fixed-output-files' [-Wother]
|
||||
input.y:17.1-19: previous declaration [-Wother]
|
||||
input.y:17.1-19: previous declaration
|
||||
fix-it:"input.y":{19:1-19:20}:""
|
||||
input.y:20.1-19: warning: deprecated directive: '%name-prefix= "foo"', use '%define api.prefix {foo}' [-Wdeprecated]
|
||||
fix-it:"input.y":{20:1-20:20}:"%define api.prefix {foo}"
|
||||
@@ -2547,30 +2544,35 @@ input.y:25.1-12: warning: deprecated directive: '%pure_parser', use '%pure-parse
|
||||
fix-it:"input.y":{25:1-25:13}:"%pure-parser"
|
||||
input.y:26.1-12: warning: deprecated directive: '%token_table', use '%token-table' [-Wdeprecated]
|
||||
fix-it:"input.y":{26:1-26:13}:"%token-table"
|
||||
input.y:27.1-14: error: %define variable 'parse.error' redefined
|
||||
input.y:27.1-14: warning: %define variable 'parse.error' redefined [-Wother]
|
||||
input.y:11.1-14: previous definition
|
||||
fix-it:"input.y":{27:1-27:15}:""
|
||||
input.y:29.1-18: warning: duplicate directive: '%name-prefix "bar"' [-Wother]
|
||||
input.y:13.1-20: previous declaration [-Wother]
|
||||
input.y:13.1-20: previous declaration
|
||||
fix-it:"input.y":{29:1-29:19}:""
|
||||
input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
|
||||
]])
|
||||
|
||||
AT_CHECK([cp errors-all experr])
|
||||
AT_BISON_CHECK([[-ffixit input.y]], [[1]], [[]], [experr])
|
||||
AT_BISON_CHECK([[-ffixit input.y]], [], [], [experr])
|
||||
|
||||
AT_CHECK([[sed -e '/^fix-it:/d' errors-all >experr]])
|
||||
AT_BISON_CHECK([[input.y]], [[1]], [[]], [experr])
|
||||
AT_BISON_CHECK([[input.y]], [], [], [experr])
|
||||
|
||||
# Update the input file.
|
||||
|
||||
# Update the input file. Make sure we generated nothing.
|
||||
AT_CHECK([rm -f output.c])
|
||||
AT_CHECK([cp input.y input.y.orig])
|
||||
AT_CHECK([sed -e '/fix-it/d' <errors-all >experr])
|
||||
AT_CHECK([echo "bison: file 'input.y' was updated (backup: 'input.y~')" >>experr])
|
||||
AT_BISON_CHECK([[--update input.y]], [[1]], [[]], [experr])
|
||||
AT_BISON_CHECK([[--update input.y]], [], [[]], [experr])
|
||||
|
||||
# Check the backup.
|
||||
AT_CHECK([diff input.y.orig input.y~])
|
||||
|
||||
# Check we did not generate any file.
|
||||
AT_CHECK([test ! -f output.c])
|
||||
|
||||
# Check the update.
|
||||
AT_CHECK([cat input.y], [],
|
||||
[[%code top {
|
||||
@@ -2591,7 +2593,7 @@ AT_CHECK([cat input.y], [],
|
||||
%no-default-prec
|
||||
%no-default-prec
|
||||
%no-lines
|
||||
%output "foo"
|
||||
%output "output.c"
|
||||
%pure-parser
|
||||
%token-table
|
||||
%glr-parser
|
||||
@@ -2632,10 +2634,11 @@ AT_BISON_CHECK([[input.y]], [[1]], [[]],
|
||||
input.y:11.15-24: warning: deprecated directive: '%expect_rr', use '%expect-rr' [-Wdeprecated]
|
||||
input.y:12.15-24: warning: deprecated directive: '%expect_rr', use '%expect-rr' [-Wdeprecated]
|
||||
input.y:13.1-14: warning: deprecated directive: '%error_verbose', use '%define parse.error verbose' [-Wdeprecated]
|
||||
input.y:13.16-29: error: %define variable 'parse.error' redefined
|
||||
input.y:13.16-29: warning: %define variable 'parse.error' redefined [-Wother]
|
||||
input.y:13.1-14: previous definition
|
||||
input.y:14.16-29: error: %define variable 'parse.error' redefined
|
||||
input.y:14.16-29: warning: %define variable 'parse.error' redefined [-Wother]
|
||||
input.y:13.16-29: previous definition
|
||||
input.y: error: reduce/reduce conflicts: 0 found, 42 expected
|
||||
input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
|
||||
]])
|
||||
|
||||
@@ -2669,7 +2672,7 @@ AT_DATA_GRAMMAR([[input.y]],
|
||||
|
||||
AT_BISON_CHECK([[input.y]], [[0]], [[]],
|
||||
[[input.y:14.1-15.5: warning: duplicate directive: '%file-prefix' [-Wother]
|
||||
input.y:13.1-18: previous declaration [-Wother]
|
||||
input.y:13.1-18: previous declaration
|
||||
input.y: warning: %expect-rr applies only to GLR parsers [-Wother]
|
||||
input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
|
||||
]])
|
||||
|
||||
@@ -199,6 +199,88 @@ AT_CLEANUP
|
||||
|
||||
|
||||
|
||||
## --------------- ##
|
||||
## Useless Parts. ##
|
||||
## --------------- ##
|
||||
|
||||
AT_SETUP([Useless Parts])
|
||||
|
||||
# We used to emit code that used symbol numbers before the useless
|
||||
# symbol elimination, hence before the renumbering of the useful
|
||||
# symbols. As a result, the evaluation of the skeleton failed because
|
||||
# it used non existing symbol numbers. Which is the happy scenario:
|
||||
# we could use numbers of other existing symbols...
|
||||
# http://lists.gnu.org/archive/html/bug-bison/2019-01/msg00044.html
|
||||
|
||||
AT_BISON_OPTION_PUSHDEFS
|
||||
AT_DATA([[input.y]],
|
||||
[[%code {
|
||||
]AT_YYERROR_DECLARE_EXTERN[
|
||||
]AT_YYLEX_DECLARE_EXTERN[
|
||||
}
|
||||
%union { void* ptr; }
|
||||
%type <ptr> used1
|
||||
%type <ptr> used2
|
||||
|
||||
%%
|
||||
start
|
||||
: used1
|
||||
;
|
||||
|
||||
used1
|
||||
: used2 { $$ = $1; }
|
||||
;
|
||||
|
||||
unused
|
||||
: used2
|
||||
;
|
||||
|
||||
used2
|
||||
: { $$ = YY_NULLPTR; }
|
||||
;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[-fcaret -rall -o input.c input.y]], 0, [],
|
||||
[[input.y: warning: 1 nonterminal useless in grammar [-Wother]
|
||||
input.y: warning: 1 rule useless in grammar [-Wother]
|
||||
input.y:18.1-6: warning: nonterminal useless in grammar: unused [-Wother]
|
||||
unused
|
||||
^~~~~~
|
||||
]])
|
||||
|
||||
|
||||
AT_CHECK([[sed -n '/^State 0/q;/^$/!p' input.output]], 0,
|
||||
[[Nonterminals useless in grammar
|
||||
unused
|
||||
Rules useless in grammar
|
||||
4 unused: used2
|
||||
Grammar
|
||||
0 $accept: start $end
|
||||
1 start: used1
|
||||
2 used1: used2
|
||||
3 used2: %empty
|
||||
Terminals, with rules where they appear
|
||||
$end (0) 0
|
||||
error (256)
|
||||
Nonterminals, with rules where they appear
|
||||
$accept (3)
|
||||
on left: 0
|
||||
start (4)
|
||||
on left: 1, on right: 0
|
||||
used1 <ptr> (5)
|
||||
on left: 2, on right: 1
|
||||
used2 <ptr> (6)
|
||||
on left: 3, on right: 2
|
||||
]])
|
||||
|
||||
# Make sure the generated parser is correct.
|
||||
AT_COMPILE([input.o])
|
||||
|
||||
AT_BISON_OPTION_POPDEFS
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
|
||||
## ------------------- ##
|
||||
## Reduced Automaton. ##
|
||||
## ------------------- ##
|
||||
|
||||
Reference in New Issue
Block a user