Compare commits

..
21 Commits
Author SHA1 Message Date
Akim Demaille 2a069f22c6 version 3.6.4
* NEWS: Record release date.
2020-06-15 20:18:50 +02:00
Akim Demaille 3f4ffea6f2 glr.cc: don't leak glr.c/glr.cc scaffolding to the user
Until we have a decent reimplementation of glr.cc, we have to use
tricks to shoehorn C++ symbols to the C engine of glr.c.  Some of them
are done via #define.  Unfortunately in Bison 3.6 some of these we
done in the header file, which broke valid user code.

Reported by Egor Pugin.
https://lists.gnu.org/r/bug-bison/2020-06/msg00003.html

* data/skeletons/glr.cc: Stop playing tricks with b4_pre_epilogue.
(b4_glr_cc_setup, b4_glr_cc_cleanup): New.
Much cleaner way to instal glr.cc's scaffolding around glr.c.
* data/skeletons/glr.c: Adjust to use them.
2020-06-15 20:18:47 +02:00
Akim Demaille 508ac09939 maint: post-release administrivia
* NEWS: Add header line for next release.
* .prev-version: Record previous version.
* cfg.mk (old_NEWS_hash): Auto-update.
2020-06-03 07:52:30 +02:00
Akim Demaille 0535d2a608 version 3.6.3
* NEWS: Record release date.
2020-06-03 07:31:43 +02:00
Akim Demaille 52ce2a008b build: check -Wmissing-prototypes
pstate_clear is lacking a prototype.
Reported by Ryan
https://lists.gnu.org/r/bug-bison/2020-05/msg00101.html

Besides, none of the C examples were compiled with the warning flags.

* configure.ac (warn_c): Add -Wmissing-prototypes.
* data/skeletons/yacc.c (pstate_clear): Make it static.
* examples/local.mk (TEST_CFLAGS): New.
* examples/c/bistromathic/local.mk, examples/c/calc/local.mk,
* examples/c/lexcalc/local.mk, examples/c/mfcalc/local.mk,
* examples/c/pushcalc/local.mk, examples/c/reccalc/local.mk,
* examples/c/rpcalc/local.mk:
Use it.

GCC's warn_unused_result is not silenced by a cast to void, so we have
to "use" scanf's result.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25509
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425

Flex generated code produces too many warnings, including things such
as, with ICC:

    examples/c/lexcalc/scan.c(1088): error #1682: implicit conversion
              of a 64-bit integral type to a smaller integral type (potential portability problem)
    2259                YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
    2260                ^
    2261
    2262

I am tired of trying to fix Flex's output.  The project does not seem
maintained.  We ought to avoid it.  So, for the time being, don't try
to enable warnings with Flex.

* examples/c/bistromathic/parse.y, examples/c/reccalc/scan.l: Fix
warnings.
* doc/bison.texi: Discard scanf's return value to defeat
-Werror=unused-result.
2020-06-01 08:29:53 +02:00
Akim Demaille 12f4091de4 tests: show logs
* examples/c/bistromathic/bistromathic.test, examples/test: here.
2020-05-23 18:02:44 +02:00
Akim Demaille 8ece778cb8 c++: fix printing of state number on streams
Avoid this kind of display:

    LAC: checking lookahead identifier: R4 R3 G^B S5

* data/skeletons/lalr1.cc: Convert state_t to int before printing it.
2020-05-23 18:02:24 +02:00
Akim Demaille f80890c4bb fix generated comments
In Bison 3.6.2, the comments with brackets lose their brackets, for
improper m4 quotation.

* data/skeletons/bison.m4 (b4_gsub): New.
* data/skeletons/c-like.m4 (_b4_comment): Use it.
* tests/m4.at: Check b4_gsub.
2020-05-21 20:14:59 +02:00
Akim Demaille 1ebc2ac55c traces: provide a means to get short m4 traces
Let --trace=m4-early dump all the logs from the start (as --trace=m4
used to do), and have --trace=m4 now start traces only when actually
working of the user's grammar.

Can make a big difference in the case of small inputs.  E.g.

    $ bison -S tests/testsuite.dir/001/input.m4 tests/testsuite.dir/001/input.y --trace=m4 |& wc
       3952   19446  251068
    $ bison -S tests/testsuite.dir/001/input.m4 tests/testsuite.dir/001/input.y --trace=m4-early |& wc
      19491  131904 1830495

* data/skeletons/traceon.m4: New.
* src/getargs.h, src/getargs.c: Introduce --trace=m4-early.
* src/output.c (output_skeleton): Adjust for --trace=m4 and --trace=m4-early.
2020-05-21 20:13:04 +02:00
Akim Demaille 94952779b6 traces: show the full m4 invocation
Unfortunately the effect of -dV is still position independent.

* src/output.c (output_skeleton): here.
2020-05-21 20:13:04 +02:00
Akim Demaille 4d9fa28ba8 maint: post-release administrivia
* NEWS: Add header line for next release.
* .prev-version: Record previous version.
* cfg.mk (old_NEWS_hash): Auto-update.
2020-05-17 08:55:47 +02:00
Akim Demaille a100a3c4c1 version 3.6.2
* NEWS: Record release date.
2020-05-17 08:30:46 +02:00
Akim Demaille b18ceb50f1 tests: improve update-test
* build-aux/update-test: When given a directory, use the testsuite.log
which it contains.
Do not accept empty "from"s, as substituting the empty string with
something is rarely a good idea.
2020-05-17 08:28:12 +02:00
Akim Demaille ff4d67ede8 CI: add GCC 10 and Clang 10
* .travis.yml: Here.
* tests/input.at, tests/regression.at: Beware of clang's -Wdocumentation.
2020-05-17 08:28:12 +02:00
Akim Demaille 465babb635 fix: do not emit nested comments
With input such as

    %token<fl> yVL_CLOCK "/*verilator sc_clock*/"

we generate

    yVL_CLOCK = 610,      /* "/*verilator sc_clock*/"  */

which is invalid since the comment will actually be closed on the
first "*/".  Let's turn "*/" into "*\/" to avoid this.  But GCC will
also warn about "/*" inside a comment, so let's "escape" it too.

Reported by Huang Rui.
https://github.com/akimd/bison/issues/38

* data/skeletons/c-like.m4 (_b4_comment): Escape comment delimiters in
comments.
* tests/input.at (Torturing the Scanner): Check thes cases.
* tests/m4.at: New.
2020-05-17 08:28:12 +02:00
Akim Demaille 6a28e6d412 todo: update 2020-05-15 07:18:15 +02:00
Akim Demaille f4495da337 examples: use markdown hyperlinks
* examples/c++/README.md, examples/c++/calc++/README.md,
* examples/c/README.md: here.
2020-05-14 07:26:55 +02:00
Akim Demaille dbaed0bbf2 tests: don't use == to compare const char *...
Reported by Dagobert Michelsen.
https://lists.gnu.org/r/bug-bison/2020-05/msg00091.html

* tests/c++.at: here.
2020-05-14 07:26:34 +02:00
Akim Demaille 78c7fb6460 gnulib: update 2020-05-14 07:25:09 +02:00
Akim Demaille da29809969 news: update 2020-05-10 17:32:28 +02:00
Akim Demaille 87e4895189 maint: post-release administrivia
* NEWS: Add header line for next release.
* .prev-version: Record previous version.
* cfg.mk (old_NEWS_hash): Auto-update.
2020-05-10 14:47:51 +02:00
46 changed files with 428 additions and 150 deletions
+1 -1
View File
@@ -1 +1 @@
3.6 3.6.3
+57 -39
View File
@@ -69,53 +69,53 @@ jobs:
# Start with three completely different environments, to get errors asap. # Start with three completely different environments, to get errors asap.
- name: "GCC 9 -O3" - name: "GCC 10 -O3"
stage: check stage: check
os: linux os: linux
dist: bionic dist: bionic
addons: &gcc9 addons: &gcc10
apt: apt:
sources: sources:
# See https://github.com/travis-ci/apt-source-safelist/issues/410. # See https://github.com/travis-ci/apt-source-safelist/issues/410.
- sourceline: 'ppa:ubuntu-toolchain-r/test' - sourceline: 'ppa:ubuntu-toolchain-r/test'
packages: g++-9 packages: g++-10
env: env:
- CC=gcc-9 - CC=gcc-10
- CXX=g++-9 - CXX=g++-10
- CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3' - CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'
# ASAN is time consuming, and we timeout the 50min granted by # ASAN is time consuming, and we timeout the 50min granted by
# Travis if we run all the tests in one go. Run in two parts. # Travis if we run all the tests in one go. Run in two parts.
- name: "Clang 9 libc++ and ASAN part 1" - name: "Clang 10 libc++ and ASAN part 1"
stage: check stage: check
os: linux os: linux
dist: bionic dist: bionic
addons: &clang9 addons: &clang10
apt: apt:
sources: sources:
# See https://github.com/travis-ci/apt-source-safelist/issues/410. # See https://github.com/travis-ci/apt-source-safelist/issues/410.
- sourceline: 'ppa:ubuntu-toolchain-r/test' - sourceline: 'ppa:ubuntu-toolchain-r/test'
- sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main' - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main'
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key' key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
packages: packages:
- clang-9 - clang-10
- libc++-9-dev - libc++-10-dev
- libc++abi-9-dev - libc++abi-10-dev
env: env:
# Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379 # Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379
- CC='clang-9 -fsanitize=address' - CC='clang-10 -fsanitize=address'
- CXX='clang++-9 -fsanitize=address -stdlib=libc++' - CXX='clang++-10 -fsanitize=address -stdlib=libc++'
- PART=1 - PART=1
- name: "Clang 9 libc++ and ASAN part 2" - name: "Clang 10 libc++ and ASAN part 2"
stage: check stage: check
os: linux os: linux
dist: bionic dist: bionic
addons: *clang9 addons: *clang10
env: env:
# Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379 # Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379
- CC='clang-9 -fsanitize=address' - CC='clang-10 -fsanitize=address'
- CXX='clang++-9 -fsanitize=address -stdlib=libc++' - CXX='clang++-10 -fsanitize=address -stdlib=libc++'
- PART=2 - PART=2
- name: "ICC" - name: "ICC"
@@ -135,46 +135,41 @@ jobs:
packages: packages:
- intel-oneapi-icc - intel-oneapi-icc
## ------- ## - name: "ARM64: GCC 10 -O3 part 1"
## First. ##
## ------- ##
# Start with three completely different environments, to get
# errors asap.
- name: "ARM64: GCC 9 -O3 part 1"
stage: check stage: check
os: linux os: linux
arch: arm64 arch: arm64
dist: bionic dist: bionic
addons: *gcc9 addons: *gcc10
env: env:
- CC=gcc-9 - CC=gcc-10
- CXX=g++-9 - CXX=g++-10
- CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3' - CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'
- PART=1 - PART=1
# GCC10 on PPC seems to be buggy.
# E.g., https://travis-ci.org/github/akimd/bison/jobs/687812428.
- name: "PPC64le: GCC 9 part 1" - name: "PPC64le: GCC 9 part 1"
stage: check stage: check
os: linux os: linux
arch: ppc64le arch: ppc64le
dist: bionic dist: bionic
addons: *gcc9 addons: *gcc10
env: env:
- CC=gcc-9 - CC=gcc-9
- CXX=g++-9 - CXX=g++-9
- CONFIGUREFLAGS='CFLAGS=-O3 CXXFLAGS=-O3' - CONFIGUREFLAGS='CFLAGS=-O3 CXXFLAGS=-O3'
- PART=1 - PART=1
- name: "s390x: GCC 9 part 1" - name: "s390x: GCC 10 part 1"
stage: check stage: check
os: linux os: linux
arch: s390x arch: s390x
dist: bionic dist: bionic
addons: *gcc9 addons: *gcc10
env: env:
- CC=gcc-9 - CC=gcc-10
- CXX=g++-9 - CXX=g++-10
- CONFIGUREFLAGS='CFLAGS=-O3 CXXFLAGS=-O3' - CONFIGUREFLAGS='CFLAGS=-O3 CXXFLAGS=-O3'
- PART=1 - PART=1
@@ -182,15 +177,19 @@ jobs:
## GCC. ## ## GCC. ##
## ----- ## ## ----- ##
- name: "GCC 8 with sanitizers part 1" - name: "GCC 9 with sanitizers part 1"
stage: check
os: linux os: linux
dist: bionic dist: bionic
addons: addons:
apt: apt:
packages: g++-8 sources:
# See https://github.com/travis-ci/apt-source-safelist/issues/410.
- sourceline: 'ppa:ubuntu-toolchain-r/test'
packages: g++-9
env: env:
- CC='gcc-8 -fsanitize=undefined,address -fno-omit-frame-pointer' - CC='gcc-9 -fsanitize=undefined,address -fno-omit-frame-pointer'
- CXX='g++-8 -fsanitize=undefined,address -fno-omit-frame-pointer' - CXX='g++-9 -fsanitize=undefined,address -fno-omit-frame-pointer'
- CONFIGUREFLAGS='CFLAGS=-O1 CXXFLAGS=-O1' - CONFIGUREFLAGS='CFLAGS=-O1 CXXFLAGS=-O1'
- PART=1 - PART=1
@@ -292,7 +291,27 @@ jobs:
## Clang. ## ## Clang. ##
## ------- ## ## ------- ##
- name: "Clang 8 -O3" - name: "Clang 9 -O3"
stage: check
os: linux
dist: bionic
addons:
apt:
sources:
# See https://github.com/travis-ci/apt-source-safelist/issues/410.
- sourceline: 'ppa:ubuntu-toolchain-r/test'
- sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main'
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
packages:
- clang-9
- libc++-9-dev
- libc++abi-9-dev
env:
- CC='clang-9'
- CXX='clang++-9 -stdlib=libc++'
- CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'
- name: "Clang 8"
stage: check stage: check
os: linux os: linux
dist: bionic dist: bionic
@@ -305,7 +324,6 @@ jobs:
env: env:
- CC=clang-8 - CC=clang-8
- CXX='clang++-8 -stdlib=libc++' - CXX='clang++-8 -stdlib=libc++'
- CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'
- name: "Clang 7" - name: "Clang 7"
stage: check stage: check
+4
View File
@@ -127,3 +127,7 @@ gen-ChangeLog:
--since=$(gen_start_date) > $$cl.tmp && \ --since=$(gen_start_date) > $$cl.tmp && \
mv -f $$cl.tmp $$cl; \ mv -f $$cl.tmp $$cl; \
fi fi
# Useful to debug.
.c.i:
$(CC) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -o $@ -E $<
+31
View File
@@ -1,9 +1,40 @@
GNU Bison NEWS GNU Bison NEWS
* Noteworthy changes in release 3.6.4 (2020-06-15) [stable]
** Bug fixes
In glr.cc some internal macros leaked in the user's code, and could damage
access to the token kinds.
* Noteworthy changes in release 3.6.3 (2020-06-03) [stable]
** Bug fixes
Incorrect comments in the generated parsers.
Warnings in push parsers (yacc.c).
Incorrect display of gotos in LAC traces (lalr1.cc).
* Noteworthy changes in release 3.6.2 (2020-05-17) [stable]
** Bug fixes
Some tests were fixed.
When token aliases contain comment delimiters:
%token FOO "/* foo */"
bison used to emit "nested" comments, which is invalid C.
* Noteworthy changes in release 3.6.1 (2020-05-10) [stable] * Noteworthy changes in release 3.6.1 (2020-05-10) [stable]
** Bug fixes ** Bug fixes
Restored ANSI-C compliance in yacc.c.
GNU readline portability issues. GNU readline portability issues.
In C++, yy::parser::symbol_name is now a public member, as was intended. In C++, yy::parser::symbol_name is now a public member, as was intended.
+1
View File
@@ -162,6 +162,7 @@ Quoc Peyrot [email protected]
R Blake [email protected] R Blake [email protected]
Raja R Harinath [email protected] Raja R Harinath [email protected]
Ralf Wildenhues [email protected] Ralf Wildenhues [email protected]
Ryan [email protected]
Rich Wilson [email protected] Rich Wilson [email protected]
Richard Stallman [email protected] Richard Stallman [email protected]
Rici Lake [email protected] Rici Lake [email protected]
+25
View File
@@ -1,4 +1,7 @@
* Bison 3.7 * Bison 3.7
** glr.cc
Get rid of global_tokens_and_yystype.
** Bistromathic ** Bistromathic
- Hitting tab on a line with a syntax error is ugly - Hitting tab on a line with a syntax error is ugly
@@ -128,7 +131,29 @@ Rici:
> At a minimum, the fact that yyclearin does not invoke the %destructor > At a minimum, the fact that yyclearin does not invoke the %destructor
> should be highlighted in the documentation, since it is not at all obvious. > should be highlighted in the documentation, since it is not at all obvious.
** Issues in i18n
Les catégories d'avertissements incluent :
conflicts-sr conflits S/R (activé par défaut)
conflicts-rr conflits R/R (activé par défaut)
dangling-alias l'alias chaîne n'est pas attaché à un symbole
deprecated construction obsolète
empty-rule règle vide sans %empty
midrule-values valeurs de règle intermédiaire non définies ou inutilisées
precedence priorité et associativité inutiles
yacc incompatibilités avec POSIX Yacc
other tous les autres avertissements (activé par défaut)
all tous les avertissements sauf « dangling-alias » et « yacc »
no-CATEGORY désactiver les avertissements dans CATEGORIE
none désactiver tous les avertissements
error[=CATEGORY] traiter les avertissements comme des erreurs
Line -1 and -3 should mention CATEGORIE, not CATEGORY.
* Bison 3.8 * Bison 3.8
** Rewrite glr.cc
Get rid of scaffolding in glr.c.
** Unit rules / Injection rules (Akim Demaille) ** Unit rules / Injection rules (Akim Demaille)
Maybe we could expand unit rules (or "injections", see Maybe we could expand unit rules (or "injections", see
https://homepages.cwi.nl/~daybuild/daily-books/syntax/2-sdf/sdf.html), i.e., https://homepages.cwi.nl/~daybuild/daily-books/syntax/2-sdf/sdf.html), i.e.,
+7
View File
@@ -73,6 +73,11 @@ def diff_to_re(match):
is_diff = True is_diff = True
to.append(l) to.append(l)
if is_diff: if is_diff:
# Do not run s//SOMETHING/g (with an emty pattern), that won't
# work well...
if frm == []:
trace("no from for", match.group(1))
return
frm = "\n".join(frm) frm = "\n".join(frm)
to = "\n".join(to) to = "\n".join(to)
subst[frm] = to subst[frm] = to
@@ -112,4 +117,6 @@ def process(logfile):
for logfile in args.logs: for logfile in args.logs:
trace("FILE:", logfile) trace("FILE:", logfile)
if os.path.isdir(logfile):
logfile = os.path.join(logfile, 'testsuite.log')
process(logfile) process(logfile)
+3 -1
View File
@@ -135,7 +135,9 @@ if test "$enable_gcc_warnings" = yes; then
-Wpointer-arith -Wshadow -Wpointer-arith -Wshadow
-Wwrite-strings -Wwrite-strings
-wr188 -wr2259 -wr3179' -wr188 -wr2259 -wr3179'
warn_c='-Wbad-function-cast -Wstrict-prototypes' warn_c='-Wbad-function-cast
-Wmissing-prototypes
-Wstrict-prototypes'
warn_cxx='-Wextra-semi -Wnoexcept -Wold-style-cast -Wundefined-func-template warn_cxx='-Wextra-semi -Wnoexcept -Wold-style-cast -Wundefined-func-template
-Wweak-vtables' -Wweak-vtables'
# Warnings for the test suite only. # Warnings for the test suite only.
+1
View File
@@ -34,6 +34,7 @@ dist_skeletons_DATA = \
data/skeletons/lalr1.java \ data/skeletons/lalr1.java \
data/skeletons/location.cc \ data/skeletons/location.cc \
data/skeletons/stack.hh \ data/skeletons/stack.hh \
data/skeletons/traceon.m4 \
data/skeletons/variant.hh \ data/skeletons/variant.hh \
data/skeletons/yacc.c data/skeletons/yacc.c
+21
View File
@@ -19,6 +19,27 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# m4_gsub(STRING, RE1, SUBST1, RE2, SUBST2, ...)
# ----------------------------------------------
# m4 equivalent of
#
# $_ = STRING;
# s/RE1/SUBST1/g;
# s/RE2/SUBST2/g;
# ...
#
# Really similar to m4_bpatsubsts, but behaves properly with quotes.
# See m4.at's "Generating Comments". Super inelegant, but so far, I
# did not find any better solution.
m4_define([b4_gsub],
[m4_bpatsubst(m4_bpatsubst(m4_bpatsubst([[[[$1]]]],
[$2], [$3]),
[$4], [$5]),
[$6], [$7])])
## ---------------- ## ## ---------------- ##
## Identification. ## ## Identification. ##
## ---------------- ## ## ---------------- ##
+7 -1
View File
@@ -17,15 +17,21 @@
# 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 <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# _b4_comment(TEXT, OPEN, CONTINUE, END) # _b4_comment(TEXT, OPEN, CONTINUE, END)
# -------------------------------------- # --------------------------------------
# Put TEXT in comment. Avoid trailing spaces: don't indent empty lines. # Put TEXT in comment. Avoid trailing spaces: don't indent empty lines.
# Avoid adding indentation to the first line, as the indentation comes # Avoid adding indentation to the first line, as the indentation comes
# from OPEN. That's why we don't patsubst([$1], [^\(.\)], [ \1]). # from OPEN. That's why we don't patsubst([$1], [^\(.\)], [ \1]).
# Turn "*/" in TEXT into "* /" so that we don't unexpectedly close
# the comments before its end.
# #
# Prefix all the output lines with PREFIX. # Prefix all the output lines with PREFIX.
m4_define([_b4_comment], m4_define([_b4_comment],
[$2[]m4_bpatsubst(m4_expand([[$1]]), [ [$2[]b4_gsub(m4_expand([$1]),
[[*]/], [*\\/],
[/[*]], [/\\*],
[
\(.\)], [ \(.\)], [
$3\1])$4]) $3\1])$4])
+5 -3
View File
@@ -230,7 +230,9 @@ b4_copyright([Skeleton implementation for Bison GLR parsers in C],
]b4_defines_if([[#include "@basename(]b4_spec_header_file[@)"]], ]b4_defines_if([[#include "@basename(]b4_spec_header_file[@)"]],
[b4_shared_declarations])[ [b4_shared_declarations])[
]b4_declare_symbol_enum[
]b4_glr_cc_if([b4_glr_cc_setup],
[b4_declare_symbol_enum])[
/* Default (constant) value used for initialization for null /* Default (constant) value used for initialization for null
right-hand sides. Unlike the standard yacc.c template, here we set right-hand sides. Unlike the standard yacc.c template, here we set
@@ -2731,7 +2733,7 @@ m4_if(b4_prefix, [yy], [],
#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[ #define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
#define yylloc ]b4_prefix[lloc]])])[ #define yylloc ]b4_prefix[lloc]])])[
]m4_ifdef([b4_pre_epilogue], [b4_pre_epilogue])[]dnl This is a hack for glr.cc. To remove when we have a better glr.cc. ]b4_glr_cc_if([b4_glr_cc_cleanup])[
b4_percent_code_get([[epilogue]])[]dnl ]b4_percent_code_get([[epilogue]])[]dnl
b4_epilogue[]dnl b4_epilogue[]dnl
b4_output_end b4_output_end
+49 -30
View File
@@ -105,12 +105,6 @@ yyerror (]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_
]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param), ]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param),
])[const char* msg);]])[ ])[const char* msg);]])[
]b4_percent_define_flag_if([[global_tokens_and_yystype]], [],
[m4_define([b4_pre_epilogue],
[[/* The user is using the C++ token kind, not the C one. */
#undef ]b4_symbol(0, [id])
])])[
# Hijack the epilogue to define implementations (yyerror, parser member # Hijack the epilogue to define implementations (yyerror, parser member
# functions etc.). # functions etc.).
]m4_append([b4_epilogue], ]m4_append([b4_epilogue],
@@ -222,6 +216,53 @@ b4_namespace_close[]dnl
]) ])
# b4_glr_cc_setup
# ---------------
# Setup redirections for glr.c: Map the names used in c.m4 to the ones used
# in c++.m4.
m4_define([b4_glr_cc_setup],
[[#undef ]b4_symbol(-2, [id])[
#define ]b4_symbol(-2, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(-2, [id])[
#undef ]b4_symbol(0, [id])[
#define ]b4_symbol(0, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(0, [id])[
#undef ]b4_symbol(1, [id])[
#define ]b4_symbol(1, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(1, [id])[
#ifndef ]b4_api_PREFIX[STYPE
# define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class[::semantic_type
#endif
#ifndef ]b4_api_PREFIX[LTYPE
# define ]b4_api_PREFIX[LTYPE ]b4_namespace_ref[::]b4_parser_class[::location_type
#endif
typedef ]b4_namespace_ref[::]b4_parser_class[::symbol_kind_type yysymbol_kind_t;
#define ]b4_symbol_prefix[YYEMPTY ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYEMPTY
#define ]b4_symbol_prefix[YYerror ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYerror
#define ]b4_symbol_prefix[YYEOF ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYEOF
#define ]b4_symbol_prefix[YYUNDEF ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYUNDEF
]])
# b4_glr_cc_cleanup
# -----------------
# Remove redirections for glr.c.
m4_define([b4_glr_cc_cleanup],
[b4_percent_define_flag_if([[global_tokens_and_yystype]], [],
[[#undef ]b4_symbol(-2, [id])[
#undef ]b4_symbol(0, [id])[
#undef ]b4_symbol(1, [id])[
]])[
#undef ]b4_api_PREFIX[STYPE
#undef ]b4_api_PREFIX[LTYPE
#undef ]b4_symbol_prefix[YYEMPTY
#undef ]b4_symbol_prefix[YYerror
#undef ]b4_symbol_prefix[YYEOF
#undef ]b4_symbol_prefix[YYUNDEF
]])
# b4_shared_declarations(hh|cc) # b4_shared_declarations(hh|cc)
# ----------------------------- # -----------------------------
# Declaration that might either go into the header (if --defines, $1 = hh) # Declaration that might either go into the header (if --defines, $1 = hh)
@@ -339,33 +380,11 @@ b4_percent_define_flag_if([[global_tokens_and_yystype]],
])[ ])[
]b4_namespace_close[ ]b4_namespace_close[
]dnl Map the name used in c.m4 to the one used in c++.m4.
[#undef ]b4_symbol(-2, [id])[
#define ]b4_symbol(-2, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(-2, [id])[
#undef ]b4_symbol(0, [id])[
#define ]b4_symbol(0, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(0, [id])[
#undef ]b4_symbol(1, [id])[
#define ]b4_symbol(1, [id])[ ]b4_namespace_ref[::]b4_parser_class[::token::]b4_symbol(1, [id])[
#ifndef ]b4_api_PREFIX[STYPE
# define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class[::semantic_type
#endif
#ifndef ]b4_api_PREFIX[LTYPE
# define ]b4_api_PREFIX[LTYPE ]b4_namespace_ref[::]b4_parser_class[::location_type
#endif
]m4_define([b4_declare_symbol_enum],
[[typedef ]b4_namespace_ref[::]b4_parser_class[::symbol_kind_type yysymbol_kind_t;
#define ]b4_symbol_prefix[YYEMPTY ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYEMPTY
#define ]b4_symbol_prefix[YYerror ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYerror
#define ]b4_symbol_prefix[YYEOF ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYEOF
#define ]b4_symbol_prefix[YYUNDEF ]b4_namespace_ref[::]b4_parser_class[::symbol_kind::]b4_symbol_prefix[YYUNDEF
]])[
]b4_percent_code_get([[provides]])[ ]b4_percent_code_get([[provides]])[
]m4_popdef([b4_parse_param])dnl ]m4_popdef([b4_parse_param])dnl
]) ])[
b4_defines_if( ]b4_defines_if(
[b4_output_begin([b4_spec_header_file]) [b4_output_begin([b4_spec_header_file])
b4_copyright([Skeleton interface for Bison GLR parsers in C++], b4_copyright([Skeleton interface for Bison GLR parsers in C++],
[2002-2015, 2018-2020])[ [2002-2015, 2018-2020])[
+1 -1
View File
@@ -1411,7 +1411,7 @@ b4_dollar_popdef])[]dnl
: yylac_stack_.back ()); : yylac_stack_.back ());
// Push the resulting state of the reduction. // Push the resulting state of the reduction.
state_type state = yy_lr_goto_state_ (top_state, yyr1_[yyrule]); state_type state = yy_lr_goto_state_ (top_state, yyr1_[yyrule]);
YYCDEBUG << " G" << state; YYCDEBUG << " G" << int (state);
yylac_stack_.push_back (state); yylac_stack_.push_back (state);
} }
} }
+2
View File
@@ -0,0 +1,2 @@
dnl GNU M4 treats -dV in a position-independent manner.
m4_debugmode(V)m4_traceon()dnl
+1 -1
View File
@@ -1480,7 +1480,7 @@ yypull_parse (yypstate *yyps]b4_user_formals[)
]b4_parse_state_variable_macros([b4_pstate_macro_define])[ ]b4_parse_state_variable_macros([b4_pstate_macro_define])[
/* Initialize the parser data structure. */ /* Initialize the parser data structure. */
void static void
yypstate_clear (yypstate *yyps) yypstate_clear (yypstate *yyps)
{ {
]b4_initialize_parser_state_variables[ ]b4_initialize_parser_state_variables[
+9 -5
View File
@@ -1879,6 +1879,7 @@ Here is the code for the lexical analyzer:
and tabs, and returns 0 for end-of-input. */ and tabs, and returns 0 for end-of-input. */
#include <ctype.h> #include <ctype.h>
#include <stdlib.h>
@end group @end group
@group @group
@@ -1895,7 +1896,8 @@ yylex (void)
if (c == '.' || isdigit (c)) if (c == '.' || isdigit (c))
@{ @{
ungetc (c, stdin); ungetc (c, stdin);
scanf ("%lf", &yylval); if (scanf ("%lf", &yylval) != 1)
abort ();
return NUM; return NUM;
@} @}
@end group @end group
@@ -2728,7 +2730,8 @@ yylex (void)
if (c == '.' || isdigit (c)) if (c == '.' || isdigit (c))
@{ @{
ungetc (c, stdin); ungetc (c, stdin);
scanf ("%lf", &yylval.NUM); if (scanf ("%lf", &yylval.NUM) != 1)
abort ();
return NUM; return NUM;
@} @}
@end group @end group
@@ -2755,10 +2758,10 @@ Bison generated a definition of @code{YYSTYPE} with a member named
if (bufsize <= i) if (bufsize <= i)
@{ @{
bufsize = 2 * bufsize + 40; bufsize = 2 * bufsize + 40;
symbuf = realloc (symbuf, bufsize); symbuf = realloc (symbuf, (size_t) bufsize);
@} @}
/* Add this character to the buffer. */ /* Add this character to the buffer. */
symbuf[i++] = c; symbuf[i++] = (char) c;
/* Get another character. */ /* Get another character. */
c = getchar (); c = getchar ();
@} @}
@@ -10629,7 +10632,7 @@ when there were errors. No file was generated (except the reports generated
by @option{--verbose}, etc.). In particular, the output files that possibly by @option{--verbose}, etc.). In particular, the output files that possibly
existed were not changed. existed were not changed.
@item 63 (mistmatch) @item 63 (mismatch)
when @command{bison} does not meet the version requirements of the grammar when @command{bison} does not meet the version requirements of the grammar
file. @xref{Require Decl}. No file was generated or changed. file. @xref{Require Decl}. No file was generated or changed.
@end table @end table
@@ -15269,6 +15272,7 @@ London, Department of Computer Science, TR-00-12 (December 2000).
@c LocalWords: YYUNDEF SymbolKind yypcontext YYENOMEM TOKENMAX getBundle @c LocalWords: YYUNDEF SymbolKind yypcontext YYENOMEM TOKENMAX getBundle
@c LocalWords: ResourceBundle myResources getString getName getToken @c LocalWords: ResourceBundle myResources getString getName getToken
@c LocalWords: getLocation getExpectedTokens reportSyntaxError bistromathic @c LocalWords: getLocation getExpectedTokens reportSyntaxError bistromathic
@c LocalWords: TokenKind
@c Local Variables: @c Local Variables:
@c ispell-dictionary: "american" @c ispell-dictionary: "american"
+4 -4
View File
@@ -13,8 +13,8 @@ semantic value.
Run as `./simple`. Run as `./simple`.
Extracted from the documentation: "A Simple C++ Example". Extracted from the documentation: [A Simple C++
https://www.gnu.org/software/bison/manual/html_node/A-Simple-C_002b_002b-Example.html Example](https://www.gnu.org/software/bison/manual/html_node/A-Simple-C_002b_002b-Example.html).
## variant.yy - Self-contained example in C++98 ## variant.yy - Self-contained example in C++98
A variation of simple.yy, in C++98. A variation of simple.yy, in C++98.
@@ -36,8 +36,8 @@ starting point for a clean parser in C++. The previous examples are better
introductory examples, and the C examples are also useful introductory introductory examples, and the C examples are also useful introductory
examples. examples.
Extracted from the documentation: "A Complete C++ Example". Extracted from the documentation: [A Complete C++
https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html Example](https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html).
<!--- <!---
+3 -3
View File
@@ -5,9 +5,9 @@ saw the traditional implementation in C, please first read
examples/c/lexcalc, which can be seen as a C precursor of this example. examples/c/lexcalc, which can be seen as a C precursor of this example.
Read the corresponding chapter in the documentation: "A Complete C++ Read the corresponding chapter in the documentation: "A Complete C++
Example". It is also available on line (maybe with a different version of Example". It is also available [on
Bison): line](https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html)
https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html (maybe with a different version of Bison).
To use it, copy this directory into some work directory, and run `make` to To use it, copy this directory into some work directory, and run `make` to
compile the executable, and try it. It is a simple calculator which accepts compile the executable, and try it. It is a simple calculator which accepts
+4 -4
View File
@@ -10,8 +10,8 @@ The first example is that of a simple double-precision Reverse Polish
Notation calculator (a calculator using postfix operators). This example Notation calculator (a calculator using postfix operators). This example
provides a good starting point, since operator precedence is not an issue. provides a good starting point, since operator precedence is not an issue.
Extracted from the documentation: "Reverse Polish Notation Calculator" Extracted from the documentation: [Reverse Polish Notation
https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html Calculator](https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html).
## calc - Simple Calculator ## calc - Simple Calculator
This example is slightly more complex than rpcalc: it features infix This example is slightly more complex than rpcalc: it features infix
@@ -24,8 +24,8 @@ A more complete C example: a multi-function calculator. More complex than
the previous example. Using precedence directives to support infix the previous example. Using precedence directives to support infix
operators. operators.
Extracted from the documentation: "Multi-Function Calculator: mfcalc". Extracted from the documentation: [Multi-Function Calculator:
https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html mfcalc](https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html).
## lexcalc - calculator with Flex and Bison ## lexcalc - calculator with Flex and Bison
The calculator with precedence directives and location tracking. It uses The calculator with precedence directives and location tracking. It uses
+3 -3
View File
@@ -45,7 +45,7 @@ echo >perfect '> 0
echo >ok '0' echo >ok '0'
echo '0' | prog >effective echo '0' | prog >effective
echo "checking for readline output" echo "checking for readline output..."
if diff perfect effective; then if diff perfect effective; then
# Alles ist gut. # Alles ist gut.
strip_prompt=false strip_prompt=false
@@ -269,8 +269,8 @@ fi
# On Windows10/MSYS2 the ^G coming from <tab> completion is not # On Windows10/MSYS2 the ^G coming from <tab> completion is not
# emitted the same way # emitted the same way
# (https://lists.gnu.org/r/bug-bison/2020-05/msg00076.html). # (https://lists.gnu.org/r/bug-bison/2020-05/msg00076.html).
echo "checking for kernel name" echo "checking for kernel name... $(uname -s)"
case `uname -s` in case $(uname -s) in
(MSYS*) (MSYS*)
echo "SKIP: this is Windows/MSYS" echo "SKIP: this is Windows/MSYS"
exit $status exit $status
+1
View File
@@ -31,6 +31,7 @@ if ENABLE_BISTROMATHIC
-DBISON_LOCALEDIR='"$(localdir)"' \ -DBISON_LOCALEDIR='"$(localdir)"' \
-DLOCALEDIR='"$(localdir)"' \ -DLOCALEDIR='"$(localdir)"' \
-I$(top_srcdir)/%D% -I$(top_builddir)/%D% -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
%C%_bistromathic_CFLAGS = $(TEST_CFLAGS)
%C%_bistromathic_LDADD = -lm $(LIBREADLINE) $(LIBINTL) %C%_bistromathic_LDADD = -lm $(LIBREADLINE) $(LIBINTL)
endif endif
+23 -14
View File
@@ -1,7 +1,6 @@
%require "3.6" %require "3.6"
%code top { %code top {
#include <assert.h>
#include <ctype.h> // isdigit #include <ctype.h> // isdigit
#include <locale.h> // LC_ALL #include <locale.h> // LC_ALL
#include <math.h> // cos, sin, etc. #include <math.h> // cos, sin, etc.
@@ -218,7 +217,7 @@ getsym (char const *name)
} }
// How many symbols are registered. // How many symbols are registered.
int static int
symbol_count (void) symbol_count (void)
{ {
int res = 0; int res = 0;
@@ -312,7 +311,7 @@ yylex (const char **line, YYSTYPE *yylval, YYLTYPE *yylloc)
`---------*/ `---------*/
const char * static const char *
error_format_string (int argc) error_format_string (int argc)
{ {
switch (argc) switch (argc)
@@ -407,7 +406,8 @@ xstrndup (const char *string, size_t n)
const char *end = memchr (string, '\0', n); const char *end = memchr (string, '\0', n);
size_t len = end ? (size_t) (end - string) : n; size_t len = end ? (size_t) (end - string) : n;
char *new = malloc (len + 1); char *new = malloc (len + 1);
assert (new); if (!new)
abort ();
new[len] = '\0'; new[len] = '\0';
return memcpy (new, string, len); return memcpy (new, string, len);
} }
@@ -418,7 +418,8 @@ xstrndup (const char *string, size_t n)
`-----------*/ `-----------*/
// Parse (and execute) this line. // Parse (and execute) this line.
int process_line (YYLTYPE *lloc, const char *line) static int
process_line (YYLTYPE *lloc, const char *line)
{ {
yypstate *ps = yypstate_new (); yypstate *ps = yypstate_new ();
int status = 0; int status = 0;
@@ -433,7 +434,8 @@ int process_line (YYLTYPE *lloc, const char *line)
} }
// Get the list of possible tokens after INPUT was read. // Get the list of possible tokens after INPUT was read.
int // Returns a nonnegative.
static int
expected_tokens (const char *input, expected_tokens (const char *input,
int *tokens, int ntokens) int *tokens, int ntokens)
{ {
@@ -454,6 +456,8 @@ expected_tokens (const char *input,
// Then query for the accepted tokens at this point. // Then query for the accepted tokens at this point.
int res = yypstate_expected_tokens (ps, tokens, ntokens); int res = yypstate_expected_tokens (ps, tokens, ntokens);
if (res < 0)
abort ();
yypstate_delete (ps); yypstate_delete (ps);
return res; return res;
} }
@@ -463,7 +467,7 @@ expected_tokens (const char *input,
// TEXT is the word to complete. We can use the entire contents of // TEXT is the word to complete. We can use the entire contents of
// rl_line_buffer in case we want to do some simple parsing. Return // rl_line_buffer in case we want to do some simple parsing. Return
// the array of matches, or NULL if there aren't any. // the array of matches, or NULL if there aren't any.
char ** static char **
completion (const char *text, int start, int end) completion (const char *text, int start, int end)
{ {
YYDPRINTF ((stderr, "completion (\"%.*s[%.*s]%s\")\n", YYDPRINTF ((stderr, "completion (\"%.*s[%.*s]%s\")\n",
@@ -473,14 +477,17 @@ completion (const char *text, int start, int end)
// Get list of token numbers. // Get list of token numbers.
int tokens[YYNTOKENS]; int tokens[YYNTOKENS];
char *line = xstrndup (rl_line_buffer, start); char *line = xstrndup (rl_line_buffer, (size_t) start);
int ntokens = expected_tokens (line, tokens, YYNTOKENS); int ntokens = expected_tokens (line, tokens, YYNTOKENS);
free (line); free (line);
// Build MATCHES, the list of possible completions. // Build MATCHES, the list of possible completions.
const int len = strlen (text); const size_t len = strlen (text);
// Need initial prefix and final NULL. // Need initial prefix and final NULL.
char **matches = calloc (ntokens + symbol_count () + 2, sizeof *matches); char **matches
= calloc ((size_t) ntokens + (size_t) symbol_count () + 2, sizeof *matches);
if (!matches)
abort ();
int match = 1; int match = 1;
for (int i = 0; i < ntokens; ++i) for (int i = 0; i < ntokens; ++i)
switch (tokens[i]) switch (tokens[i])
@@ -510,9 +517,9 @@ completion (const char *text, int start, int end)
matches[0] = strdup (text); matches[0] = strdup (text);
else else
{ {
int lcplen = strlen (matches[1]); size_t lcplen = strlen (matches[1]);
for (int i = 2; i < match && lcplen; ++i) for (int i = 2; i < match && lcplen; ++i)
for (int j = 0; j < lcplen; ++j) for (size_t j = 0; j < lcplen; ++j)
if (matches[1][j] != matches[i][j]) if (matches[1][j] != matches[i][j])
lcplen = j; lcplen = j;
matches[0] = xstrndup (matches[1], lcplen); matches[0] = xstrndup (matches[1], lcplen);
@@ -536,7 +543,8 @@ completion (const char *text, int start, int end)
return matches; return matches;
} }
void init_readline (void) static void
init_readline (void)
{ {
// Allow conditional parsing of the ~/.inputrc file. // Allow conditional parsing of the ~/.inputrc file.
rl_readline_name = "bistromathic"; rl_readline_name = "bistromathic";
@@ -555,7 +563,8 @@ void init_readline (void)
| Main. | | Main. |
`-------*/ `-------*/
int main (int argc, char const* argv[]) int
main (int argc, char const* argv[])
{ {
#if defined ENABLE_NLS && ENABLE_NLS #if defined ENABLE_NLS && ENABLE_NLS
// Set up internationalization. // Set up internationalization.
+4 -2
View File
@@ -1,6 +1,7 @@
%code top { %code top {
#include <ctype.h> /* isdigit. */ #include <ctype.h> /* isdigit. */
#include <stdio.h> /* For printf, etc. */ #include <stdio.h> /* printf. */
#include <stdlib.h> /* abort. */
#include <string.h> /* strcmp. */ #include <string.h> /* strcmp. */
int yylex (void); int yylex (void);
@@ -73,7 +74,8 @@ yylex (void)
if (c == '.' || isdigit (c)) if (c == '.' || isdigit (c))
{ {
ungetc (c, stdin); ungetc (c, stdin);
scanf ("%lf", &yylval.NUM); if (scanf ("%lf", &yylval.NUM) != 1)
abort ();
return NUM; return NUM;
} }
+1
View File
@@ -27,6 +27,7 @@ nodist_%C%_calc_SOURCES = %D%/calc.y
# Don't use gnulib's system headers. # Don't use gnulib's system headers.
%C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D% %C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
%C%_calc_CFLAGS = $(TEST_CFLAGS)
dist_calc_DATA = %D%/calc.y %D%/Makefile %D%/README.md dist_calc_DATA = %D%/calc.y %D%/Makefile %D%/README.md
CLEANFILES += %D%/calc.[ch] %D%/calc.output %D%/scan.c CLEANFILES += %D%/calc.[ch] %D%/calc.output %D%/scan.c
+2
View File
@@ -25,6 +25,8 @@ if FLEX_WORKS
nodist_%C%_lexcalc_SOURCES = %D%/parse.y %D%/parse.h %D%/scan.l nodist_%C%_lexcalc_SOURCES = %D%/parse.y %D%/parse.h %D%/scan.l
# Don't use gnulib's system headers. # Don't use gnulib's system headers.
%C%_lexcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D% %C%_lexcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
# Fighting warnings triggered by Flex is just too painful.
# %C%_lexcalc_CFLAGS = $(TEST_CFLAGS)
endif FLEX_WORKS endif FLEX_WORKS
%D%/parse.c: $(dependencies) %D%/parse.c: $(dependencies)
+2 -2
View File
@@ -4,7 +4,7 @@
%option nodefault noinput nounput noyywrap %option nodefault noinput nounput noyywrap
%{ %{
#include <errno.h> /* errno, ERANGE */ #include <errno.h> /* errno, ERANGE */
#include <limits.h> /* INT_MIN */ #include <limits.h> /* INT_MIN */
#include <stdlib.h> /* strtol */ #include <stdlib.h> /* strtol */
@@ -12,7 +12,7 @@
// Each time a rule is matched, advance the end cursor/position. // Each time a rule is matched, advance the end cursor/position.
#define YY_USER_ACTION \ #define YY_USER_ACTION \
yylloc->last_column += yyleng; yylloc->last_column += (int) yyleng;
// Move the first position onto the last. // Move the first position onto the last.
#define LOCATION_STEP() \ #define LOCATION_STEP() \
+1
View File
@@ -31,6 +31,7 @@ nodist_%C%_mfcalc_SOURCES = $(mfcalc_sources)
%D%/mfcalc.c: $(dependencies) %D%/mfcalc.c: $(dependencies)
# Don't use gnulib's system headers. # Don't use gnulib's system headers.
%C%_mfcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D% %C%_mfcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
%C%_mfcalc_CFLAGS = $(TEST_CFLAGS)
%C%_mfcalc_LDADD = -lm %C%_mfcalc_LDADD = -lm
dist_TESTS += %D%/mfcalc.test dist_TESTS += %D%/mfcalc.test
+4 -3
View File
@@ -1,7 +1,7 @@
%code top { %code top {
#include <ctype.h> /* isdigit. */ #include <ctype.h> /* isdigit. */
#include <stdbool.h> #include <stdio.h> /* printf. */
#include <stdio.h> /* For printf, etc. */ #include <stdlib.h> /* abort. */
#include <string.h> /* strcmp. */ #include <string.h> /* strcmp. */
} }
@@ -81,7 +81,8 @@ yylex (YYSTYPE *yylval)
if (c == '.' || isdigit (c)) if (c == '.' || isdigit (c))
{ {
ungetc (c, stdin); ungetc (c, stdin);
scanf ("%lf", &yylval->NUM); if (scanf ("%lf", &yylval->NUM) != 1)
abort ();
return NUM; return NUM;
} }
+1
View File
@@ -27,6 +27,7 @@ nodist_%C%_calc_SOURCES = %D%/calc.y
# Don't use gnulib's system headers. # Don't use gnulib's system headers.
%C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D% %C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
%C%_calc_CFLAGS = $(TEST_CFLAGS)
dist_pushcalc_DATA = %D%/calc.y %D%/Makefile %D%/README.md dist_pushcalc_DATA = %D%/calc.y %D%/Makefile %D%/README.md
CLEANFILES += %D%/calc.[ch] %D%/calc.output CLEANFILES += %D%/calc.[ch] %D%/calc.output
+2
View File
@@ -26,6 +26,8 @@ if FLEX_WORKS
BUILT_SOURCES += $(nodist_%C%_reccalc_SOURCES) BUILT_SOURCES += $(nodist_%C%_reccalc_SOURCES)
# Don't use gnulib's system headers. # Don't use gnulib's system headers.
%C%_reccalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D% %C%_reccalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
# Fighting warnings triggered by Flex is just too painful.
# %C%_reccalc_CFLAGS = $(TEST_CFLAGS)
endif FLEX_WORKS endif FLEX_WORKS
%D%/parse.c: $(dependencies) %D%/parse.c: $(dependencies)
+2 -2
View File
@@ -32,9 +32,9 @@
do \ do \
capacity = capacity ? 2 * capacity : 128; \ capacity = capacity ? 2 * capacity : 128; \
while (capacity < size + yyleng + 1); \ while (capacity < size + yyleng + 1); \
str = realloc (str, capacity); \ str = realloc (str, (size_t) capacity); \
} \ } \
memcpy (str + size, yytext, yyleng); \ memcpy (str + size, yytext, (size_t) yyleng); \
size += yyleng; \ size += yyleng; \
assert (size < capacity); \ assert (size < capacity); \
} while (0) } while (0)
+1
View File
@@ -31,6 +31,7 @@ nodist_%C%_rpcalc_SOURCES = $(rpcalc_sources)
%D%/rpcalc.c: $(dependencies) %D%/rpcalc.c: $(dependencies)
# Don't use gnulib's system headers. # Don't use gnulib's system headers.
%C%_rpcalc_CPPFLAGS = -I$(top_builddir)/%D% %C%_rpcalc_CPPFLAGS = -I$(top_builddir)/%D%
%C%_rpcalc_CFLAGS = $(TEST_CFLAGS)
%C%_rpcalc_LDADD = -lm %C%_rpcalc_LDADD = -lm
dist_TESTS += %D%/rpcalc.test dist_TESTS += %D%/rpcalc.test
+3
View File
@@ -35,6 +35,9 @@
dist_noinst_SCRIPTS = %D%/extexi %D%/test dist_noinst_SCRIPTS = %D%/extexi %D%/test
TEST_LOG_COMPILER = $(SHELL) $(top_srcdir)/%D%/test TEST_LOG_COMPILER = $(SHELL) $(top_srcdir)/%D%/test
TEST_CFLAGS = \
$(WARN_CFLAGS) $(WARN_CFLAGS_TEST) $(WERROR_CFLAGS)
AM_CXXFLAGS = \ AM_CXXFLAGS = \
$(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS) $(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS)
+2 -1
View File
@@ -36,10 +36,11 @@ strip_prompt=false
# If diff supports --strip-trailing-cr, use it, to avoid EOL issues # If diff supports --strip-trailing-cr, use it, to avoid EOL issues
# when testing Java programs on Windows. # when testing Java programs on Windows.
echo "checking for diff --strip-trailing-cr" echo "checking for diff --strip-trailing-cr..."
if diff --strip-trailing-cr "$1" "$1"; then if diff --strip-trailing-cr "$1" "$1"; then
diff_opts=--strip-trailing-cr diff_opts=--strip-trailing-cr
fi fi
echo "checking for diff --strip-trailing-cr... $diff_opts"
# The exercised program. # The exercised program.
abs_medir=$cwd/examples/$medir abs_medir=$cwd/examples/$medir
+1 -1
Submodule gnulib updated: 2ac33b29fc...ffbb0ced8b
-1
View File
@@ -56,7 +56,6 @@
/gnulib-comp.m4 /gnulib-comp.m4
/gnulib-tool.m4 /gnulib-tool.m4
/host-cpu-c-abi.m4 /host-cpu-c-abi.m4
/iconv.m4
/include_next.m4 /include_next.m4
/intdiv0.m4 /intdiv0.m4
/intl.m4 /intl.m4
+3 -1
View File
@@ -257,7 +257,8 @@ static const argmatch_trace_doc argmatch_trace_docs[] =
{ "sets", "grammar sets: firsts, nullable etc." }, { "sets", "grammar sets: firsts, nullable etc." },
{ "muscles", "m4 definitions passed to the skeleton" }, { "muscles", "m4 definitions passed to the skeleton" },
{ "tools", "m4 invocation" }, { "tools", "m4 invocation" },
{ "m4", "m4 traces" }, { "m4-early", "m4 traces starting from the start" },
{ "m4", "m4 traces starting from the skeleton evaluation" },
{ "skeleton", "skeleton postprocessing" }, { "skeleton", "skeleton postprocessing" },
{ "time", "time consumption" }, { "time", "time consumption" },
{ "ielr", "IELR conversion" }, { "ielr", "IELR conversion" },
@@ -279,6 +280,7 @@ static const argmatch_trace_arg argmatch_trace_args[] =
{ "sets", trace_sets }, { "sets", trace_sets },
{ "muscles", trace_muscles }, { "muscles", trace_muscles },
{ "tools", trace_tools }, { "tools", trace_tools },
{ "m4-early", trace_m4_early },
{ "m4", trace_m4 }, { "m4", trace_m4 },
{ "skeleton", trace_skeleton }, { "skeleton", trace_skeleton },
{ "time", trace_time }, { "time", trace_time },
+6 -5
View File
@@ -100,11 +100,12 @@ enum trace
trace_grammar = 1 << 7, /**< Reading, reducing the grammar. */ trace_grammar = 1 << 7, /**< Reading, reducing the grammar. */
trace_time = 1 << 8, /**< Time consumption. */ trace_time = 1 << 8, /**< Time consumption. */
trace_skeleton = 1 << 9, /**< Skeleton postprocessing. */ trace_skeleton = 1 << 9, /**< Skeleton postprocessing. */
trace_m4 = 1 << 10, /**< M4 traces. */ trace_m4_early = 1 << 10, /**< M4 early traces. */
trace_muscles = 1 << 11, /**< M4 definitions of the muscles. */ trace_m4 = 1 << 11, /**< M4 traces. */
trace_ielr = 1 << 12, /**< IELR conversion. */ trace_muscles = 1 << 12, /**< M4 definitions of the muscles. */
trace_closure = 1 << 13, /**< Input/output of closure(). */ trace_ielr = 1 << 13, /**< IELR conversion. */
trace_locations = 1 << 14, /**< Full display of locations. */ trace_closure = 1 << 14, /**< Input/output of closure(). */
trace_locations = 1 << 15, /**< Full display of locations. */
trace_all = ~0 /**< All of the above. */ trace_all = ~0 /**< All of the above. */
}; };
/** What debug items bison displays during its run. */ /** What debug items bison displays during its run. */
+18 -13
View File
@@ -687,6 +687,7 @@ output_skeleton (void)
char *skeldir = xpath_join (datadir, "skeletons"); char *skeldir = xpath_join (datadir, "skeletons");
char *m4sugar = xpath_join (datadir, "m4sugar/m4sugar.m4"); char *m4sugar = xpath_join (datadir, "m4sugar/m4sugar.m4");
char *m4bison = xpath_join (skeldir, "bison.m4"); char *m4bison = xpath_join (skeldir, "bison.m4");
char *traceon = xpath_join (skeldir, "traceon.m4");
char *skel = (IS_PATH_WITH_DIR (skeleton) char *skel = (IS_PATH_WITH_DIR (skeleton)
? xstrdup (skeleton) ? xstrdup (skeleton)
: xpath_join (skeldir, skeleton)); : xpath_join (skeldir, skeleton));
@@ -698,21 +699,10 @@ output_skeleton (void)
/* Create an m4 subprocess connected to us via two pipes. */ /* Create an m4 subprocess connected to us via two pipes. */
if (trace_flag & trace_tools)
fprintf (stderr, "running: %s %s - %s %s\n",
m4, m4sugar, m4bison, skel);
/* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a
position-dependent manner. Keep it as the first argument so that all
files are traced.
See the thread starting at
<http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
for details. */
int filter_fd[2]; int filter_fd[2];
pid_t pid; pid_t pid;
{ {
char const *argv[10]; char const *argv[11];
int i = 0; int i = 0;
argv[i++] = m4; argv[i++] = m4;
@@ -730,15 +720,29 @@ output_skeleton (void)
argv[i++] = "-I"; argv[i++] = "-I";
argv[i++] = datadir; argv[i++] = datadir;
if (trace_flag & trace_m4) /* Some future version of GNU M4 (most likely 1.6) may treat the
-dV in a position-dependent manner. See the thread starting at
<http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
for details. */
if (trace_flag & trace_m4_early)
argv[i++] = "-dV"; argv[i++] = "-dV";
argv[i++] = m4sugar; argv[i++] = m4sugar;
argv[i++] = "-"; argv[i++] = "-";
argv[i++] = m4bison; argv[i++] = m4bison;
if (trace_flag & trace_m4)
argv[i++] = traceon;
argv[i++] = skel; argv[i++] = skel;
argv[i++] = NULL; argv[i++] = NULL;
aver (i <= ARRAY_CARDINALITY (argv)); aver (i <= ARRAY_CARDINALITY (argv));
if (trace_flag & trace_tools)
{
fputs ("running:", stderr);
for (int j = 0; argv[j]; ++j)
fprintf (stderr, " %s", argv[j]);
fputc ('\n', stderr);
}
/* The ugly cast is because gnulib gets the const-ness wrong. */ /* The ugly cast is because gnulib gets the const-ness wrong. */
pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true, pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true,
true, filter_fd); true, filter_fd);
@@ -747,6 +751,7 @@ output_skeleton (void)
free (skeldir); free (skeldir);
free (m4sugar); free (m4sugar);
free (m4bison); free (m4bison);
free (traceon);
free (skel); free (skel);
if (trace_flag & trace_muscles) if (trace_flag & trace_muscles)
+2 -2
View File
@@ -161,8 +161,8 @@ int main()
{ {
parser::symbol_type s = parser::make_INT (12); parser::symbol_type s = parser::make_INT (12);
assert_eq (s.kind (), parser::symbol_kind::S_INT); assert_eq (s.kind (), parser::symbol_kind::S_INT);
assert_eq (parser::symbol_name (s.kind ()), "\"int\""); assert_eq (parser::symbol_name (s.kind ()), std::string ("\"int\""));
assert_eq (s.name (), "\"int\""); assert_eq (s.name (), std::string ("\"int\""));
assert_eq (s.value.as<int> (), 12); assert_eq (s.value.as<int> (), 12);
} }
+18 -1
View File
@@ -1352,8 +1352,20 @@ AT_BISON_CHECK([-fcaret input.y], [1], [],
]]) ]])
# Clang chokes on some of our comments, because it tries to "parse"
# some documentation directives in the comments:
#
# input.c:166:50: error: '\a' command does not have a valid word argument [-Werror,-Wdocumentation]
# FAKE = 258 /* "fake [] \a\b\f\n\r\t\v\"'?\\[\\ ??!??'??(??)??-??/??<??=??> \001\001" */
# ~~^
AT_DATA_GRAMMAR([input.y], AT_DATA_GRAMMAR([input.y],
[[%{ [[%code requires {
#if defined __clang__ && 10 <= __clang_major__
# pragma clang diagnostic ignored "-Wdocumentation"
#endif
}
%{
/* This is seen in GCC: a %{ and %} in middle of a comment. */ /* This is seen in GCC: a %{ and %} in middle of a comment. */
const char *foo = "So %{ and %} can be here too."; const char *foo = "So %{ and %} can be here too.";
@@ -1424,6 +1436,11 @@ char quote[] = "@:>@@:>@,";
/* Exercise quotes in strings. */ /* Exercise quotes in strings. */
%token FAKE "fake @<:@@:>@ \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/??<??=??> \x1\1" %token FAKE "fake @<:@@:>@ \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/??<??=??> \x1\1"
/* Beware of the generated comments that embed string aliases that
might close the comment. */
%token COMMENT_CLOSE "*/"
%token COMMENT "/* comment */"
%% %%
/* Exercise M4 quoting: '@:>@@:>@', @<:@, 1. */ /* Exercise M4 quoting: '@:>@@:>@', @<:@, 1. */
exp: '@<:@' '\1' two '$' '@' '{' oline output.or.oline.opt exp: '@<:@' '\1' two '$' '@' '{' oline output.or.oline.opt
+1
View File
@@ -56,6 +56,7 @@ TESTSUITE_AT = \
%D%/java.at \ %D%/java.at \
%D%/javapush.at \ %D%/javapush.at \
%D%/local.at \ %D%/local.at \
%D%/m4.at \
%D%/named-refs.at \ %D%/named-refs.at \
%D%/output.at \ %D%/output.at \
%D%/package.m4 \ %D%/package.m4 \
+72
View File
@@ -0,0 +1,72 @@
# Basic m4 macros. -*- Autotest -*-
# Copyright (C) 2020 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
AT_BANNER([[M4 Macros.]])
AT_SETUP([Generating Comments])
AT_DATA([input.y],
[%%
exp:
])
AT_DATA([input.m4],
[[m4@&t@_include(b4_skeletonsdir/[c.m4])
b4_output_begin([output.txt])
b4_gsub([[abcd]],
[a], [b])
b4_gsub([[abcd]],
[a], [b],
[b], [c],
[c], [d])
_b4_comment([["/* () */"]])
_b4_comment([["/* ( */"]])
_b4_comment([["/* ) */"]])
_b4_comment([["/* [] */"]])
b4_comment([["/* () */"]])
b4_comment([["/* ( */"]])
b4_comment([["/* ) */"]])
b4_comment([["/* [] */"]])
b4_output_end([output.txt])
]])
AT_BISON_CHECK([-S ./input.m4 input.y])
AT_CHECK([cat output.txt], [],
[[
[bbcd]
[dddd]
"/\* () *\/"
"/\* ( *\/"
"/\* ) *\/"
"/\* [] *\/"
/* "/\* () *\/" */
/* "/\* ( *\/" */
/* "/\* ) *\/" */
/* "/\* [] *\/" */
]])
AT_CLEANUP
+17 -6
View File
@@ -372,8 +372,19 @@ m4_pushdef([AT_TEST],
AT_BISON_OPTION_PUSHDEFS([$1]) AT_BISON_OPTION_PUSHDEFS([$1])
# Clang chokes on some of our comments, because it tries to "parse"
# some documentation directives in the comments:
#
# input.c:131:48: error: '\a' command does not have a valid word argument [-Werror,-Wdocumentation]
# SPECIAL = 261 /* "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" */
# ~~^
AT_DATA_GRAMMAR([input.y], AT_DATA_GRAMMAR([input.y],
[%{ [%{
#if defined __clang__ && 10 <= __clang_major__
# pragma clang diagnostic ignored "-Wdocumentation"
#endif
]AT_YYERROR_DECLARE[ ]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[ ]AT_YYLEX_DECLARE[
%} %}
@@ -398,14 +409,14 @@ exp: ]AT_ERROR_VERBOSE_IF(["\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"], ["
# C-string literal. Also notice that unnecessary escaping, such as "\?", from # C-string literal. Also notice that unnecessary escaping, such as "\?", from
# the user specification is eliminated. # the user specification is eliminated.
AT_BISON_CHECK([-fcaret -o input.c input.y], [[0]], [[]], AT_BISON_CHECK([-fcaret -o input.c input.y], [[0]], [[]],
[[input.y:22.8-14: warning: symbol SPECIAL redeclared [-Wother] [[input.y:26.8-14: warning: symbol SPECIAL redeclared [-Wother]
22 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" 26 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
| ^~~~~~~ | ^~~~~~~
input.y:21.8-14: note: previous declaration input.y:25.8-14: note: previous declaration
21 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" 25 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
| ^~~~~~~ | ^~~~~~~
input.y:22.16-63: warning: symbol "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" used more than once as a literal string [-Wother] input.y:26.16-63: warning: symbol "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" used more than once as a literal string [-Wother]
22 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" 26 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
]]) ]])
+2
View File
@@ -16,6 +16,8 @@
# 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 <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# Basic M4 macros.
m4_include([m4.at])
# Resistance to user bugs. # Resistance to user bugs.
m4_include([input.at]) m4_include([input.at])