Compare commits

..
Author SHA1 Message Date
Akim Demaille 52ca964032 m4: optimize.
* data/bison.m4, data/java.m4, data/variant.hh: m4_map_args is reported
to be faster than m4_map.
2012-07-22 12:00:44 +02:00
Akim Demaille 485b319598 autoconf: update.
* submodules/autoconf: here.
No significant changes for our use of m4sugar.m4.
2012-07-22 11:53:31 +02:00
Akim Demaille 1ed94b7c84 fixup! output: use the token list to define the yytokentype 2012-07-22 09:19:55 +02:00
Akim Demaille b119971aef output: no longer use b4_tokens.
* data/glr.c, data/glr.cc, data/lalr1.cc, data/lalr1.java, data/yacc.c:
Since the previous commit, b4_tokens_define and the like no longer need
b4_tokens.
* src/output.c (token_definitions_output): Remove.
2012-07-22 09:13:36 +02:00
Akim Demaille 2a0f5b17b4 output: use the token list to define the yytokentype
There are currently two systems used to pass information about tokens to
m4: the original one, and another, which is used for instance for
printers and destructors, variants etc.  Move to using only the latter.

* data/bison.m4 (b4_symbol_map, b4_token_visible_if)
(b4_token_has_definition, b4_any_token_visible_if, b4_token_format): New.
* data/c++.m4, data/c.m4, data/glr.c, data/java.m4: Adjust to use them.
2012-07-22 09:11:37 +02:00
247 changed files with 15268 additions and 26700 deletions
+2 -11
View File
@@ -1,16 +1,7 @@
*.eps
*.log
*.o
*.pdf
*.png
*.stamp
*.trs
*~
.deps
.dirstamp
/*.cache /*.cache
/*.flc /*.flc
/*.prj /*.prj
/*~
/.tarball-version /.tarball-version
/.version /.version
/ABOUT-NLS /ABOUT-NLS
@@ -20,7 +11,6 @@
/INSTALL /INSTALL
/Makefile /Makefile
/Makefile.in /Makefile.in
/README-release
/_* /_*
/a.exe /a.exe
/a.out /a.out
@@ -41,3 +31,4 @@
/patches /patches
/releases /releases
/stamp-h* /stamp-h*
/README-release
+1 -1
View File
@@ -1 +1 @@
3.2.3 2.6
-317
View File
@@ -1,317 +0,0 @@
# Travis defines and exports CC and CXX *after* we have defined our
# environment variables via 'env'. So, do not use 'env' to define
# them. Instead, put their definitions in MATRIX_EVAL, which we eval
# after the definitions from Travis.
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=
matrix:
include:
## ------- ##
## First. ##
## ------- ##
# Start with three completely different environments, to get
# errors asap.
- name: "GCC 7 -O3"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-7
env:
- MATRIX_EVAL="CC=gcc-7 && CXX=g++-7 && CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'"
# ASAN is time consuming, and we timeout the 50min granted by
# Travis if we run all the tests in on go. Run in two parts.
- name: "Clang 7 libc++ and ASAN part 1"
os: linux
addons:
apt:
sources:
- llvm-toolchain-trusty-7
- ubuntu-toolchain-r-test
packages:
- clang-7
- libc++-7-dev
- libc++abi-7-dev
env:
# Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379
- MATRIX_EVAL="PART=1 CC='clang-7 -fsanitize=address' CXX='clang++-7 -fsanitize=address -stdlib=libc++'"
- name: "Clang 7 libc++ and ASAN part 2"
os: linux
addons:
apt:
sources:
- llvm-toolchain-trusty-7
- ubuntu-toolchain-r-test
packages:
- clang-7
- libc++-7-dev
- libc++abi-7-dev
env:
# Do not use ASAN with ubuntu's libc++: https://bugs.llvm.org/show_bug.cgi?id=17379
- MATRIX_EVAL="PART=2 CC='clang-7 -fsanitize=address' CXX='clang++-7 -fsanitize=address -stdlib=libc++'"
- name: "ICC"
os: linux
env:
# ICC's warnings are often very wrong (e.g., it thinks foo ?
# "bar" : "baz" is char* instead of const char*), so don't try
# to work around the, and obviously, don't die on them.
- MATRIX_EVAL="CC=icc && CXX=icpc"
- MAKE_ARGS='WERROR_CFLAGS= WERROR_CXXFLAGS='
## ----- ##
## GCC. ##
## ----- ##
#- name: "GCC 8 with sanitizers"
# os: linux
# addons:
# apt:
# sources:
# - ubuntu-toolchain-r-test
# packages:
# - g++-8
# env:
# # Can't use UBSAN: I get:
# # configure:4951: gcc-8 -fsanitize=undefined,address -fno-omit-frame-pointer conftest.c
# # /usr/bin/ld: unrecognized option '--push-state'
# - MATRIX_EVAL="CC='gcc-8 -fsanitize=undefined,address -fno-omit-frame-pointer' CXX='g++-8 -fsanitize=undefined,address -fno-omit-frame-pointer'"
- name: "GCC 6"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-6
env:
- MATRIX_EVAL="CC=gcc-6 && CXX=g++-6"
- name: "GCC 5"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-5
env:
- MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"
- name: "GCC 4.9"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.9
env:
- MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"
- name: "GCC 4.8"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
env:
- MATRIX_EVAL="CC=gcc-4.8 && CXX=g++-4.8"
- name: "GCC 4.7"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.7
env:
- MATRIX_EVAL="CC=gcc-4.7 && CXX=g++-4.7"
- name: "GCC 4.6"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.6
env:
- MATRIX_EVAL="CC=gcc-4.6 && CXX=g++-4.6"
## ------- ##
## Clang. ##
## ------- ##
- name: "Clang 6 -O3 and libc++"
os: linux
addons:
apt:
sources:
- llvm-toolchain-trusty-6.0
- ubuntu-toolchain-r-test
packages:
- clang-6.0
- libc++-dev
env:
- MATRIX_EVAL="CC=clang-6.0 && CXX='clang++-6.0 -stdlib=libc++'"
- CONFIGUREFLAGS='CPPFLAGS=-DNDEBUG CFLAGS=-O3 CXXFLAGS=-O3'
- name: "Clang 5"
os: linux
addons:
apt:
sources:
- llvm-toolchain-trusty-5.0
packages:
- clang-5.0
- libc++-dev
env:
- MATRIX_EVAL="CC='clang-5.0' CXX='clang++-5.0'"
- name: "Clang 4"
os: linux
addons:
apt:
sources:
- llvm-toolchain-trusty-4.0
packages:
- clang-4.0
env:
- MATRIX_EVAL="CC=clang-4.0 && CXX=clang++-4.0"
- name: "Clang 3.9"
os: linux
addons:
apt:
sources:
- llvm-toolchain-trusty-3.9
packages:
- clang-3.9
env:
- MATRIX_EVAL="CC=clang-3.9 && CXX=clang++-3.9"
- name: "Clang 3.8"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
packages:
- clang-3.8
env:
- MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"
- name: "CLang 3.7"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.7
packages:
- clang-3.7
env:
- MATRIX_EVAL="CC=clang-3.7 && CXX=clang++-3.7"
- name: "Clang 3.6"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.6
packages:
- clang-3.6
env:
- MATRIX_EVAL="CC=clang-3.6 && CXX=clang++-3.6"
- name: "Clang 3.5"
os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.5
packages:
- clang-3.5
env:
- MATRIX_EVAL="CC=clang-3.5 && CXX=clang++-3.5"
- name: "Clang 3.4"
os: linux
addons:
apt:
packages:
- clang-3.4
env:
# No versioned name installed, but beware that Travis installs
# a more modern clang earlier in the default PATH.
- MATRIX_EVAL='CC=/usr/bin/clang && CXX=/usr/bin/clang++'
- name: "Clang 3.3"
os: linux
addons:
apt:
packages:
- clang-3.3
env:
# See comment for 3.4.
- MATRIX_EVAL='CC=/usr/bin/clang && CXX=/usr/bin/clang++'
before_install:
- eval "$MATRIX_EVAL"
- env
- sudo apt-get update -qq
- sudo apt-get install -qq autoconf automake autopoint doxygen flex gettext graphviz help2man m4 texinfo
- if [[ $CC == "icc" ]]; then build-aux/install-icc.sh; fi
- if [[ -f ~/.bashrc ]]; then source ~/.bashrc; fi
- autoconf --version
- automake --version
- autopoint --version
- $CC --version
- $CXX --version
- doxygen --version
- flex --version
- gettext --version
- dot -V
- help2man --version
- m4 --version
- makeinfo --version
script:
- git show
- git tag -l
# For some reasons, sometimes the checkout does not have any tags,
# so `git describe` fails, so bootstrap fails.
- git describe || git tag v3.0 -m "Fake version 3.0."
- git describe
- ./bootstrap
- if [[ -f ~/.bashrc ]]; then source ~/.bashrc; fi
- ./configure --enable-gcc-warnings CC="$CC" CXX="$CXX" $CONFIGUREFLAGS || { cat config.log && false; }
- make -j2 $MAKE_ARGS
- if test ${PART-1} = 1; then make check VERBOSE=1 TESTSUITEFLAGS=-j2 || { cat tests/testsuite.log && false; }; fi
- if test ${PART-1} = 1; then make maintainer-check-posix VERBOSE=1 TESTSUITEFLAGS=-j2 || { cat tests/testsuite.log && false; }; fi
- if test ${PART-2} = 2; then make maintainer-check-g++ VERBOSE=1 TESTSUITEFLAGS=-j2 || { cat tests/testsuite.log && false; }; fi
after_script:
- if [[ $CC == "icc" ]]; then uninstall_intel_software; fi
+1 -1
View File
@@ -24,7 +24,7 @@ and nasty bugs.
----- -----
Copyright (C) 1998-2015, 2018 Free Software Foundation, Inc. Copyright (C) 1998-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+45 -45
View File
@@ -3671,12 +3671,12 @@
2009-02-25 Akim Demaille <[email protected]> 2009-02-25 Akim Demaille <[email protected]>
Copyright years. Copyright years.
* data/glr.c: Add 2007 and 2008 here, consistently with the comments. * data/glr.c: Add 2007 and 2008 here, consistenly with the comments.
2009-02-25 Akim Demaille <[email protected]> 2009-02-25 Akim Demaille <[email protected]>
Style changes. Style changes.
* etc/bench.pl.in (generate_grammar_list): Consistently use * etc/bench.pl.in (generate_grammar_list): Consitently use
location_type, not yy::location. location_type, not yy::location.
2009-02-25 Akim Demaille <[email protected]> 2009-02-25 Akim Demaille <[email protected]>
@@ -3702,7 +3702,7 @@
Remove trailing blanks. Remove trailing blanks.
The epilogue has its own ending \n, no need to add another. The epilogue has its own ending \n, no need to add another.
* data/glr.c, data/lalr1.java, data/yacc.c: dnl when outputting the * data/glr.c, data/lalr1.java, data/yacc.c: dnl when outputing the
epilogue. epilogue.
* data/glr.cc: dnl when extending the epilogue. * data/glr.cc: dnl when extending the epilogue.
Remove stray "private:". Remove stray "private:".
@@ -3764,7 +3764,7 @@
2008-12-11 Akim Demaille <[email protected]> 2008-12-11 Akim Demaille <[email protected]>
Pass the token type to yysyntax_error. Pass the token type to yysyntax_error.
* data/yacc.c (yysyntax_error): Take the translated token instead * data/yacc.c (yysyntax_error): Take the transated token instead
of the raw number. of the raw number.
Adjust callers. Adjust callers.
* TODO: Update. * TODO: Update.
@@ -5019,7 +5019,7 @@
Now instead of monolithic tables, we define one macro per cell. For Now instead of monolithic tables, we define one macro per cell. For
instance "b4_symbol(0, tag)" is a macro name which contents is instance "b4_symbol(0, tag)" is a macro name which contents is
self-descriptive. The macro "b4_symbol" provides easier access to self-decriptive. The macro "b4_symbol" provides easier access to
these cells. these cells.
* src/output.c (type_names_output): Remove. * src/output.c (type_names_output): Remove.
@@ -5200,7 +5200,7 @@
2008-11-09 Akim Demaille <[email protected]> 2008-11-09 Akim Demaille <[email protected]>
Aggregate yylval and yylloc. Agregate yylval and yylloc.
* data/lalr1.cc (parser::yylval, parser::yylloc): Replace by... * data/lalr1.cc (parser::yylval, parser::yylloc): Replace by...
(parser::yyla): this. (parser::yyla): this.
@@ -5815,7 +5815,7 @@
of members. Document that token names are added as fields. of members. Document that token names are added as fields.
Document constructors accurately. Remove error method. Document constructors accurately. Remove error method.
(Java Scanner Interface): Move note on %pure-parser to Java Bison (Java Scanner Interface): Move note on %pure-parser to Java Bison
Interface. Describe %code lexer and yylex accurately. Interface. Describe %code lexer and yylex accutately.
Remove documentation that does not match the code. Remove documentation that does not match the code.
(Java Action Features): New. (Java Action Features): New.
(Java Differences): Add reference. Add item on semantic values. (Java Differences): Add reference. Add item on semantic values.
@@ -6432,7 +6432,7 @@
* djgpp/config.site: Copyright timestamp adjusted. * djgpp/config.site: Copyright timestamp adjusted.
* djgpp/config_h.sed: Copyright timestamp adjusted. * djgpp/config_h.sed: Copyright timestamp adjusted.
* djgpp/djunpack.bat: Copyright timestamp adjusted. * djgpp/djunpack.bat: Copyright timestamp adjusted.
* djgpp/fnchange.lst: Add filenames that are not 8.3 clean to the * djgpp/fnchnage.lst: Add filenames that are not 8.3 clean to the
filename translation list. filename translation list.
* djgpp/subpipe.c (init_subpipe): Check the environment variables * djgpp/subpipe.c (init_subpipe): Check the environment variables
TMPDIR, TMP and TEMP, in that order, to determinate where the temp TMPDIR, TMP and TEMP, in that order, to determinate where the temp
@@ -7588,7 +7588,7 @@
2007-03-07 Juan Manuel Guerrero <[email protected]> 2007-03-07 Juan Manuel Guerrero <[email protected]>
DJGPP spefic issue. Inhibit the use of disallowed characters for DJGPP spefic issue. Inhibit the use of disallowed characters for
file name generation on Win98, WinXP, etc. These are |<>":?*\ file name genertion on Win98, WinXP, etc. These are |<>":?*\
and concern testsuite case 46. and concern testsuite case 46.
* Makefile.am: djgpp/testsuite.sed added to EXTRA_DIST * Makefile.am: djgpp/testsuite.sed added to EXTRA_DIST
* djgpp/testsuite.sed: Inhibit the use of disallowed characters. * djgpp/testsuite.sed: Inhibit the use of disallowed characters.
@@ -8796,7 +8796,7 @@
2006-12-13 Paul Eggert <[email protected]> 2006-12-13 Paul Eggert <[email protected]>
* TODO: Add pointer to Sylvain Schmitz's work on static detection * TODO: Add pointer to Sylvain Schmitz's work on static detection
of potential ambiguities in GLR grammars. of potential ambiguities in GLR grammers.
2006-12-12 Joel E. Denny <[email protected]> 2006-12-12 Joel E. Denny <[email protected]>
@@ -9059,7 +9059,7 @@
* src/scan-gram.l (<SC_BRACED_CODE>): Use val->code for BRACED_CODE, * src/scan-gram.l (<SC_BRACED_CODE>): Use val->code for BRACED_CODE,
which is "{...}" in the parser. which is "{...}" in the parser.
* tests/Makefile.am (maintainer-check-valgrind): Set * tests/Makefile.am (maintainer-check-valgrind): Set
VALGRIND_OPTS='--leak-check=full --show-reachable=yes' before invoking VALGRIND_OPTS='--leak-check=full --show-reacheable=yes' before invoking
Valgrind. Valgrind.
* tests/calc.at (_AT_DATA_CALC_Y): fclose the FILE* so Valgrind doesn't * tests/calc.at (_AT_DATA_CALC_Y): fclose the FILE* so Valgrind doesn't
complain. complain.
@@ -12349,7 +12349,7 @@
* data/lalr1.cc: here. * data/lalr1.cc: here.
(location.hh): Include it after the user prologue, in case the (location.hh): Include it after the user prologue, in case the
filename type is defined by the user. filename type is defined by the user.
Forward declaration location and position before the pre-prologue. Forward declation location and position before the pre-prologue.
(yyresult_): Rename as... (yyresult_): Rename as...
(yyresult): this, it's a local variable, not an attribute. (yyresult): this, it's a local variable, not an attribute.
* data/Makefile.am (dist_pkgdata_DATA): Adjust. * data/Makefile.am (dist_pkgdata_DATA): Adjust.
@@ -12439,8 +12439,8 @@
(Table of Symbols): Under YYSTACK_USE_ALLOCA, Don't claim that the (Table of Symbols): Under YYSTACK_USE_ALLOCA, Don't claim that the
user must declare alloca. user must declare alloca.
* HACKING (release): Forewarn the Translation Project about * HACKING (release): Forwarn the Translation Project about
stable releases. stable releses.
2005-09-20 Akim Demaille <[email protected]> 2005-09-20 Akim Demaille <[email protected]>
@@ -13165,7 +13165,7 @@
not GNU M4, and that it works with any POSIX-compatible Awk. not GNU M4, and that it works with any POSIX-compatible Awk.
* examples/calc++/Makefile.am (run_extexi): Remove; not used. * examples/calc++/Makefile.am (run_extexi): Remove; not used.
($(calc_extracted)): Renamed from $(calc_sources_extracted), ($(calc_extracted)): Renamed from $(calc_sources_extracted),
so that we also get calc++-parser.yy. Generate it. so that we also get calc++-parser.yy. Geneate it.
Use $(AWK), not gawk, since any conforming Awk will do. Use $(AWK), not gawk, since any conforming Awk will do.
Put comment before action, since older 'make' can't handle comment Put comment before action, since older 'make' can't handle comment
in action. in action.
@@ -13993,7 +13993,7 @@
* src/LR0.c (allocate_itemsets): Use xnmalloc, not xcalloc, * src/LR0.c (allocate_itemsets): Use xnmalloc, not xcalloc,
to allocate kernel_base, kernel_items, kernel_size, since to allocate kernel_base, kernel_items, kernel_size, since
they needn't be initialized to 0. they needn't be initialized to 0.
(allocate_storage): Likewise, for shiftset, redset, shift_symbol. (allocate_storgae): Likewise, for shiftset, redset, shift_symbol.
* src/closure.c (new_closure): Likewise, for itemset. * src/closure.c (new_closure): Likewise, for itemset.
* src/derives.c (derives_compute): Likewise, for delts, derives, q. * src/derives.c (derives_compute): Likewise, for delts, derives, q.
* src/lalr.c (set_goto_map): Likewise, for temp_map. * src/lalr.c (set_goto_map): Likewise, for temp_map.
@@ -14181,7 +14181,7 @@
2004-10-05 Akim Demaille <[email protected]> 2004-10-05 Akim Demaille <[email protected]>
In Bison 1.875's yacc.c, YYLLOC_DEFAULT was called regardless In Bison 1.875's yacc.c, YYLLOC_DEFAULT was called regardless
whether the reduction was empty or not. This leaves room to whether the reducion was empty or not. This leaves room to
improve the use of YYLLOC_DEFAULT in such a case. improve the use of YYLLOC_DEFAULT in such a case.
lalr1.cc is still experimental, so changing this is acceptable. lalr1.cc is still experimental, so changing this is acceptable.
And finally, there are probably not many users who changed the And finally, there are probably not many users who changed the
@@ -16524,7 +16524,7 @@
(struct state): Renamed from struct state_s. (struct state): Renamed from struct state_s.
(state): Renamed from state_t. (state): Renamed from state_t.
(transitions): Renamed from transitions_t. Unused (and (transitions): Renamed from transitions_t. Unused (and
misspelled) transition_s tag removed. misspelled) transtion_s tag removed.
(errs): Renamed from errs_t. Unused errs_s tag removed. (errs): Renamed from errs_t. Unused errs_s tag removed.
(reductions): Renamed from reductions_t. Unused tag (reductions): Renamed from reductions_t. Unused tag
reductions_s removed. reductions_s removed.
@@ -16612,9 +16612,9 @@
Fix misspelling in names. Fix misspelling in names.
* src/vcg.h (enum_alignment_e): Renamed from enum_alignment_e. * src/vcg.h (enum_alignment_e): Renamed from enum_alignement_e.
* src/vcg_defaults.h (G_NODE_ALIGNMENT): Renamed from * src/vcg_defaults.h (G_NODE_ALIGNMENT): Renamed from
G_NODE_ALIGNMENT. G_NODE_ALIGNEMENT.
* lib/timevar.c (timevar_report): Renamed from time_report, * lib/timevar.c (timevar_report): Renamed from time_report,
@@ -16866,7 +16866,7 @@
* src/tables.c (conflict_row, pack_vector): Likewise. * src/tables.c (conflict_row, pack_vector): Likewise.
* src/vcg.c (get_color_str, get_textmode_str, get_shape_str, * src/vcg.c (get_color_str, get_textmode_str, get_shape_str,
get_layoutalgorithm_str, get_decision_str, get_orientation_str, get_layoutalgorithm_str, get_decision_str, get_orientation_str,
get_node_alignment_str, get_arrow_mode_str, get_crossing_type_str, get_node_alignement_str, get_arrow_mode_str, get_crossing_type_str,
get_view_str, get_linestyle_str, get_arrowstyle_str): Likewise. get_view_str, get_linestyle_str, get_arrowstyle_str): Likewise.
* lib/argmatch.h (ARRAY_CARDINALITY): Do not bother to #undef. * lib/argmatch.h (ARRAY_CARDINALITY): Do not bother to #undef.
@@ -17365,7 +17365,7 @@
(scanner_last_string_free): Remove; not used. (scanner_last_string_free): Remove; not used.
(percent_percent_count): Move decl to just before use. (percent_percent_count): Move decl to just before use.
(SC_ESCAPED_CHARACTER): Return ID at unexpected end of file, (SC_ESCAPED_CHARACTER): Return ID at unexpected end of file,
not the (never otherwise-used) CHARACTER. not the (never otherwised-used) CHARACTER.
2002-11-07 Akim Demaille <[email protected]> 2002-11-07 Akim Demaille <[email protected]>
@@ -18052,7 +18052,7 @@
suite using a GLR parser driven by LALR tables. It fails with -O2 suite using a GLR parser driven by LALR tables. It fails with -O2
because `struct stat' gives two different answers on my machine: because `struct stat' gives two different answers on my machine:
88 (definition of an auto var) and later 96 (memset on this var). 88 (definition of an auto var) and later 96 (memset on this var).
Hence the stack is badly corrupted. The headers inclusion is to Hence the stack is badly corrumpted. The headers inclusion is to
blame: if I move the awk.h inclusion before GLR's system header blame: if I move the awk.h inclusion before GLR's system header
inclusion, the two struct stat have the same size. inclusion, the two struct stat have the same size.
@@ -18962,7 +18962,7 @@
2002-07-16 Akim Demaille <[email protected]> 2002-07-16 Akim Demaille <[email protected]>
* src/assoc.c, src/assoc.h (assoc_t, assoc_to_string): New. * src/assoc.c, src/asssoc.h (assoc_t, assoc_to_string): New.
Adjust all former `associativity' dependencies. Adjust all former `associativity' dependencies.
* src/symtab.c (symbol_new): Default associativity is `undef', not * src/symtab.c (symbol_new): Default associativity is `undef', not
`right'. `right'.
@@ -20105,7 +20105,7 @@
* data/bison.c++: Catch up with bison.simple: * data/bison.c++: Catch up with bison.simple:
2002-05-24 Paul Hilfinger <[email protected]> 2002-05-24 Paul Hilfinger <[email protected]>
and Paul Eggert <[email protected]>: `error' handling. and Paul Eggert <[email protected]>: `error' handing.
2002-05-26 Akim Demaille <[email protected]>: stos_, token_number_, 2002-05-26 Akim Demaille <[email protected]>: stos_, token_number_,
and popping traces. and popping traces.
@@ -20455,7 +20455,7 @@
single characters while replacing `[' and `]' with quadrigraphs, to single characters while replacing `[' and `]' with quadrigraphs, to
avoid troubles with M4 quotes. avoid troubles with M4 quotes.
(copy_comment): Output characters with copy_character. (copy_comment): Output characters with copy_character.
(read_additional_code): Likewise. (read_additionnal_code): Likewise.
(copy_string2): Likewise. (copy_string2): Likewise.
(copy_definition): Likewise. (copy_definition): Likewise.
@@ -20638,7 +20638,7 @@
* data/bison.simple, data/bison.c++: Adjust. * data/bison.simple, data/bison.c++: Adjust.
* tests/torture.at (Big triangle): Move the limit from 254 to * tests/torture.at (Big triangle): Move the limit from 254 to
500. 500.
* tests/regression.at (Web2c Actions): Adjust. * tests/regression.at (Web2c Actions): Ajust.
Trying with bigger grammars shows various phenomena: at 3000 (28Mb Trying with bigger grammars shows various phenomena: at 3000 (28Mb
of grammar file) bison is killed by my system, at 2000 (12Mb) bison of grammar file) bison is killed by my system, at 2000 (12Mb) bison
@@ -20949,7 +20949,7 @@
2002-03-05 Robert Anisko <[email protected]> 2002-03-05 Robert Anisko <[email protected]>
* src/reader.c (read_additional_code): `c' should be an integer, not * src/reader.c (read_additionnal_code): `c' should be an integer, not
a character. a character.
Reported by Nicolas Tisserand and Nicolas Burrus. Reported by Nicolas Tisserand and Nicolas Burrus.
@@ -21070,7 +21070,7 @@
* src/L0.c, src/LR0.h (nstates): Be size_t. * src/L0.c, src/LR0.h (nstates): Be size_t.
Adjust comparisons (signed vs unsigned). Adjust comparisons (signed vs unsigned).
* src/conflicts.c, src/lalr.c, src/lalr.h, src/output.c (LA): Now a * src/conflics.c, src/lalr.c, src/lalr.h, src/output.c (LA): Now a
bitset*. bitset*.
Adjust all dependencies. Adjust all dependencies.
@@ -22337,7 +22337,7 @@
* src/bison.simple: Remove #line just before %%epilogue. It * src/bison.simple: Remove #line just before %%epilogue. It
is now handled in ... is now handled in ...
* src/reader.c (read_additional_code): Add the output of a * src/reader.c (read_additionnal_code): Add the output of a
#line for the epilogue. #line for the epilogue.
2001-12-10 Marc Autret <[email protected]> 2001-12-10 Marc Autret <[email protected]>
@@ -22797,7 +22797,7 @@
on user names when possible. on user names when possible.
(YYSTACK_USE_ALLOCA): Do not define; just use any existing defn. (YYSTACK_USE_ALLOCA): Do not define; just use any existing defn.
Simplify test for whether <alloca.h> exists. Simplify test for whather <alloca.h> exists.
(<stdlib.h>): Include if we will use malloc, and if standard C or C++. (<stdlib.h>): Include if we will use malloc, and if standard C or C++.
@@ -23563,7 +23563,7 @@
2001-10-04 Akim Demaille <[email protected]> 2001-10-04 Akim Demaille <[email protected]>
* src/reader.c (parse_union_decl): Push the characters in * src/reader.c (parse_union_decl): Push the caracters in
union_obstack, not attrs_obstack. union_obstack, not attrs_obstack.
2001-10-04 Akim Demaille <[email protected]> 2001-10-04 Akim Demaille <[email protected]>
@@ -23844,7 +23844,7 @@
* src/vcg.h (graph_s): color, textcolor, bordercolor are now * src/vcg.h (graph_s): color, textcolor, bordercolor are now
enum color_e. enum color_e.
* src/print_graph.c (print_graph): Initialize graph.layoutalgorithm * src/print_graph.c (print_graph): Initalize graph.layoutalgorithm
to `normal'. to `normal'.
* src/reader.c (parse_token_decl): Initialize token with tok_eof. * src/reader.c (parse_token_decl): Initialize token with tok_eof.
* src/lex.h: Adjust prototype. * src/lex.h: Adjust prototype.
@@ -23999,7 +23999,7 @@
* src/vcg.c: Remove includes of `complain.h' and `xalloc.h'. * src/vcg.c: Remove includes of `complain.h' and `xalloc.h'.
(get_xxxx_str): Use assert () instead of complain (). (get_xxxx_str): Use assert () instead of complain ().
Remove return invocations in default cases. Remove return invokations in default cases.
(get_decision_str): Modify default behaviour. Remove second argument. (get_decision_str): Modify default behaviour. Remove second argument.
Echo modifications on calls. Echo modifications on calls.
(output_graph): Fix. (output_graph): Fix.
@@ -24030,7 +24030,7 @@
informations about %union. informations about %union.
(parse_union_decl): Copy the union_obstack in the muscle stype. (parse_union_decl): Copy the union_obstack in the muscle stype.
* src/bison.simple: Add new #line directive. * src/bison.simple: Add new #line directive.
Add typedef %%stype YYSTYPE. Add typdef %%stype YYSTYPE.
2001-09-23 Pascal Bart <[email protected]> 2001-09-23 Pascal Bart <[email protected]>
@@ -24115,7 +24115,7 @@
(parse_union_decl): Update. (parse_union_decl): Update.
(parse_macro_decl): Rename parse_muscle_decl. (parse_macro_decl): Rename parse_muscle_decl.
Update to use renamed functions and variable. Update to use renamed functions and variable.
(read_declarations, copy_action, read_additional_code, : Updated (read_declarations, copy_action, read_additionnal_code, : Updated
with correct variables and functions names. with correct variables and functions names.
(packsymbols, reader): Likewise. (packsymbols, reader): Likewise.
@@ -24196,7 +24196,7 @@
2001-08-31 Pascal Bart <[email protected]>, Marc Autret <[email protected]> 2001-08-31 Pascal Bart <[email protected]>, Marc Autret <[email protected]>
* src/reader.c (read_additional_code): Rename %%user_code to * src/reader.c (read_additionnal_code): Rename %%user_code to
%%epilogue. %%epilogue.
* src/output.c (output): Rename %%declarations to %%prologue. * src/output.c (output): Rename %%declarations to %%prologue.
* src/bison.simple: Echo modifications. * src/bison.simple: Echo modifications.
@@ -24240,7 +24240,7 @@
2001-08-29 Marc Autret <[email protected]> 2001-08-29 Marc Autret <[email protected]>
* src/bison.simple: Add %%user_code directive at the end. * src/bison.simple: Add %%user_code directive at the end.
* src/reader.c (read_additional_code): New. * src/reader.c (read_additionnal_code): New.
(reader): Use it. (reader): Use it.
* src/output.c (output_program): Remove. * src/output.c (output_program): Remove.
(output): Update. (output): Update.
@@ -24303,7 +24303,7 @@
(readgram): Disable a piece of code that was writing a default (readgram): Disable a piece of code that was writing a default
definition for 'YYSTYPE'. definition for 'YYSTYPE'.
(reader_output_yylsp): Remove. (reader_output_yylsp): Remove.
(packsymbols): Output token definitions to a macro. (packsymbols): Output token defintions to a macro.
(copy_definition): Disable C output. (copy_definition): Disable C output.
* src/reader.c (parse_macro_decl): New function used to parse macro * src/reader.c (parse_macro_decl): New function used to parse macro
@@ -24641,7 +24641,7 @@
2001-07-08 Pascal Bart <[email protected]> 2001-07-08 Pascal Bart <[email protected]>
* src/bison.simple (yyparse): Suppress warning `comparison * src/bison.simple (yyparse): Suppress warning `comparaison
between signed and unsigned'. between signed and unsigned'.
2001-07-05 Pascal Bart <[email protected]> 2001-07-05 Pascal Bart <[email protected]>
@@ -25128,7 +25128,7 @@
* tests/calc.m4: Test it. * tests/calc.m4: Test it.
For regularity of the names, replace each For regularity of the names, replace each
(nolineflag, toknumflag, rawtoknumflag, noparserflag): with... (nolineflag, toknumflag, rawtokenumflag, noparserflag): with...
(no_lineflag, token_tableflag, rawflag, no_parserflag): this. (no_lineflag, token_tableflag, rawflag, no_parserflag): this.
In addition replace each `flag' with `_flag'. In addition replace each `flag' with `_flag'.
@@ -25731,7 +25731,7 @@
* src/getargs.c, src/Makefile.am, src/reader.c, src/version.c: * src/getargs.c, src/Makefile.am, src/reader.c, src/version.c:
Have configure build version string instead of relying on ANSI string Have configure build version string instead of relying on ANSI string
concatenation. concatentation.
1999-06-14 Jesse Thilo <[email protected]> 1999-06-14 Jesse Thilo <[email protected]>
@@ -25741,7 +25741,7 @@
* acconfig.h, configure.in: * acconfig.h, configure.in:
Have configure build version string instead of relying on ANSI string Have configure build version string instead of relying on ANSI string
concatenation. concatentation.
1999-06-08 Jesse Thilo <[email protected]> 1999-06-08 Jesse Thilo <[email protected]>
@@ -26733,8 +26733,8 @@
----- -----
Copyright (C) 1987-1988, 1991-2015, 2018 Free Software Copyright (C) 1987-1988, 1991-2012 Free Software Foundation,
Foundation, Inc. Inc.
Copying and distribution of this file, with or without Copying and distribution of this file, with or without
modification, are permitted provided the copyright notice and this modification, are permitted provided the copyright notice and this
+11 -17
View File
@@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in. ## Process this file with automake to produce Makefile.in.
# Copyright (C) 2001-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2001-2012 Free Software Foundation, Inc.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -24,26 +24,22 @@ SUBDIRS = po runtime-po .
aclocaldir = @aclocaldir@ aclocaldir = @aclocaldir@
aclocal_DATA = m4/bison-i18n.m4 aclocal_DATA = m4/bison-i18n.m4
EXTRA_DIST = .prev-version .version cfg.mk PACKAGING \ EXTRA_DIST = .prev-version .version \
ChangeLog-1998 ChangeLog-2012 ChangeLog cfg.mk ChangeLog-1998 ChangeLog-2012 PACKAGING
dist_doc_DATA = AUTHORS COPYING NEWS README THANKS TODO
## Running the bison from this tarball. To generate our own parser, ## Running the bison from this tarball. To generate our own parser,
## but also to run the tests. Of course, you ought to keep a sane ## but also to run the tests. Of course, you ought to keep a sane
## version of Bison nearby... ## version of Bison nearby...
BISON = $(top_builddir)/tests/bison BISON = $(top_builddir)/tests/bison
BISON_IN = $(top_srcdir)/tests/bison.in BISON_IN = $(top_srcdir)/tests/bison.in
YACC = $(BISON) -o y.tab.c YACC = $(BISON) -y
AM_YFLAGS = -d -v -Werror -Wall -Wno-yacc --report=all AM_YFLAGS = -d -v --warnings=all,error --report=all
# Initialization before completion by local.mk's. # Initialization before completion by local.mk's.
AM_CFLAGS = $(WARN_CFLAGS) AM_CFLAGS = $(WARN_CFLAGS)
# Find builddir/src/scan-code.c etc. For some reason "-I./lib" # Find builddir/src/scan-code.c etc.
# instead of "-Ilib" avoids infinite recursions on #include_next. AM_CPPFLAGS = -I. -Ilib -I$(top_srcdir) -I$(top_srcdir)/lib
AM_CPPFLAGS = -I. -I./lib -I$(top_srcdir) -I$(top_srcdir)/lib
BUILT_SOURCES = BUILT_SOURCES =
CLEANDIRS =
CLEANFILES = CLEANFILES =
DISTCLEANFILES = DISTCLEANFILES =
EXTRA_DIST += $(dist_TESTS) EXTRA_DIST += $(dist_TESTS)
@@ -65,9 +61,6 @@ include lib/local.mk
include src/local.mk include src/local.mk
include tests/local.mk include tests/local.mk
clean-local:
rm -rf $(CLEANDIRS)
# See comments in build-aux/git-version-gen. However, we make .version depend # See comments in build-aux/git-version-gen. However, we make .version depend
# on configure so that .version and VERSION/PACKAGE_VERSION stay in sync in the # on configure so that .version and VERSION/PACKAGE_VERSION stay in sync in the
# working copy (for example, when you run autoreconf && make). Allowing these # working copy (for example, when you run autoreconf && make). Allowing these
@@ -85,11 +78,12 @@ dist-hook: gen-ChangeLog
.PHONY: update-b4-copyright update-package-copyright-year .PHONY: update-b4-copyright update-package-copyright-year
update-b4-copyright: update-b4-copyright:
$(AM_V_GEN)find $(srcdir)/data -type f \ find data -type f \
| xargs $(srcdir)/build-aux/$@ | grep -v -E '^data/bison.m4$$' \
| xargs $(build_aux)/$@
@echo 'warning: src/parse-gram.[hc] may need to be regenerated.' @echo 'warning: src/parse-gram.[hc] may need to be regenerated.'
update-package-copyright-year: update-package-copyright-year:
$(AM_V_GEN)$(srcdir)/build-aux/$@ $(srcdir)/configure.ac $(build_aux)/$@ configure.ac
gen_start_date = 2012-01-16 gen_start_date = 2012-01-16
.PHONY: gen-ChangeLog .PHONY: gen-ChangeLog
+55 -1284
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -36,7 +36,7 @@ to the bison package.
----- -----
Copyright (C) 2002, 2005, 2009-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2002, 2005, 2009-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+9 -13
View File
@@ -7,10 +7,10 @@ instructions.
Bison requires GNU m4 1.4.6 or later. See: Bison requires GNU m4 1.4.6 or later. See:
https://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz ftp://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz
** Internationalization ** Internationalization
Bison supports two catalogs: one for Bison itself (i.e., for the Bison supports two catalogues: one for Bison itself (i.e., for the
maintainer-side parser generation), and one for the generated parsers maintainer-side parser generation), and one for the generated parsers
(i.e., for the user-side parser execution). The requirements between (i.e., for the user-side parser execution). The requirements between
both differ: bison needs ngettext, the generated parsers do not. To both differ: bison needs ngettext, the generated parsers do not. To
@@ -29,26 +29,25 @@ If you have questions about using Bison and the documentation does
not answer them, please send mail to <[email protected]>. not answer them, please send mail to <[email protected]>.
* Bug reports * Bug reports
Please send bug reports to <[email protected]>. Be sure to include the Please send bug reports to <[email protected]>. Please include the
version number from 'bison --version', and a complete, self-contained test version number from `bison --version', and a complete, self-contained
case in each bug report. test case in each bug report.
* Copyright statements * Copyright statements
For any copyright year range specified as YYYY-ZZZZ in this package, For any copyright year range specified as YYYY-ZZZZ in this package,
note that the range specifies every single year in that closed interval. note that the range specifies every single year in that closed interval.
-----
Local Variables: Local Variables:
mode: outline mode: outline
fill-column: 76
ispell-dictionary: "american"
End: End:
Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2015, 2018 Free Software -----
Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2012 Free Software
Foundation, Inc. Foundation, Inc.
This file is part of GNU bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@@ -62,6 +61,3 @@ GNU General Public License for more details.
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/>.
# LocalWords: parsers ngettext Texinfo pdf html YYYY ZZZZ ispell american
# LocalWords: MERCHANTABILITY
+1 -1
View File
@@ -12,7 +12,7 @@ the problems you encounter.
----- -----
Copyright (C) 2002, 2004, 2009-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2002, 2004, 2009-2012 Free Software Foundation, Inc.
This file is part of GNU Bison. This file is part of GNU Bison.
+112 -156
View File
@@ -9,19 +9,19 @@ Everything related to the development of Bison is on Savannah:
* Administrivia * Administrivia
** If you incorporate a change from somebody on the net: ** If you incorporate a change from somebody on the net:
First, if it is a large change, you must make sure they have signed the First, if it is a large change, you must make sure they have signed
appropriate paperwork. Second, be sure to add their name and email address the appropriate paperwork. Second, be sure to add their name and
to THANKS. email address to THANKS.
** If a change fixes a test, mention the test in the commit message. ** If a change fixes a test, mention the test in the commit message.
** Bug reports ** Bug reports
If somebody reports a new bug, mention his name in the commit message and in If somebody reports a new bug, mention his name in the commit message
the test case you write. Put him into THANKS. and in the test case you write. Put him into THANKS.
The correct response to most actual bugs is to write a new test case which The correct response to most actual bugs is to write a new test case
demonstrates the bug. Then fix the bug, re-run the test suite, and check which demonstrates the bug. Then fix the bug, re-run the test suite,
everything in. and check everything in.
* Hacking * Hacking
@@ -30,17 +30,17 @@ everything in.
Which include serious bug fixes, must be mentioned in NEWS. Which include serious bug fixes, must be mentioned in NEWS.
** Translations ** Translations
Only user visible strings are to be translated: error messages, bits of the Only user visible strings are to be translated: error messages, bits
.output file etc. This excludes impossible error messages (comparable to of the .output file etc. This excludes impossible error messages
assert/abort), and all the --trace output which is meant for the maintainers (comparable to assert/abort), and all the --trace output which is
only. meant for the maintainers only.
** Horizontal tabs ** Horizontal tabs
Do not add horizontal tab characters to any file in Bison's repository Do not add horizontal tab characters to any file in Bison's repository
except where required. For example, do not use tabs to format C code. except where required. For example, do not use tabs to format C code.
However, make files, ChangeLog, and some regular expressions require tabs. However, make files, ChangeLog, and some regular expressions require
Also, test cases might need to contain tabs to check that Bison properly tabs. Also, test cases might need to contain tabs to check that Bison
processes tabs in its input. properly processes tabs in its input.
* Working from the repository * Working from the repository
@@ -50,44 +50,34 @@ These requirements do not apply when building from a distribution tarball.
** Requirements ** Requirements
We've opted to keep only the highest-level sources in the repository. This We've opted to keep only the highest-level sources in the repository.
eases our maintenance burden, (fewer merges etc.), but imposes more This eases our maintenance burden, (fewer merges etc.), but imposes more
requirements on anyone wishing to build from the just-checked-out sources. requirements on anyone wishing to build from the just-checked-out sources.
For example, you have to use the latest stable versions of the maintainer For example, you have to use the latest stable versions of the maintainer
tools we depend upon, including: tools we depend upon, including:
- Autoconf <http://www.gnu.org/software/autoconf/>
- Automake <http://www.gnu.org/software/automake/> - Automake <http://www.gnu.org/software/automake/>
- Autoconf <http://www.gnu.org/software/autoconf/>
- Flex <http://www.gnu.org/software/flex/> - Flex <http://www.gnu.org/software/flex/>
- Gettext <http://www.gnu.org/software/gettext/> - Gettext <http://www.gnu.org/software/gettext/>
- Graphviz <http://www.graphviz.org>
- Gzip <http://www.gnu.org/software/gzip/> - Gzip <http://www.gnu.org/software/gzip/>
- Help2man <http://www.gnu.org/software/help2man/>
- Perl <http://www.cpan.org/> - Perl <http://www.cpan.org/>
- Rsync <http://samba.anu.edu.au/rsync/> - Rsync <http://samba.anu.edu.au/rsync/>
- Tar <http://www.gnu.org/software/tar/> - Tar <http://www.gnu.org/software/tar/>
- Texinfo <http://www.gnu.org/software/texinfo/>
Valgrind <http://valgrind.org/> is also highly recommended, if it supports Valgrind <http://valgrind.org/> is also highly recommended, if it supports
your architecture. your architecture.
If you're using a GNU/Linux distribution, the easiest way to install the Bison is written using Bison grammars, so there are bootstrapping
above packages depends on your system. The following shell command should issues. The bootstrap script attempts to discover when the C code
work for Debian-based systems such as Ubuntu: generated from the grammars is out of date, and to bootstrap with an
out-of-date version of the C code, but the process is not foolproof.
Also, you may run into similar problems yourself if you modify Bison.
sudo apt-get install \ Only building the initial full source tree will be a bit painful.
autoconf automake autopoint flex graphviz help2man texinfo valgrind Later, after synchronizing from the repository a plain 'make' should
be sufficient. Note, however, that when gnulib is updated, running
Bison is written using Bison grammars, so there are bootstrapping issues. './bootstrap' again might be needed.
The bootstrap script attempts to discover when the C code generated from the
grammars is out of date, and to bootstrap with an out-of-date version of the
C code, but the process is not foolproof. Also, you may run into similar
problems yourself if you modify Bison.
Only building the initial full source tree will be a bit painful. Later,
after synchronizing from the repository a plain 'make' should be sufficient.
Note, however, that when gnulib is updated, running './bootstrap' again
might be needed.
** First checkout ** First checkout
@@ -103,19 +93,15 @@ to perform the first checkout of the submodules, run
$ git submodule update --init $ git submodule update --init
Git submodule support is weak before versions 1.6 and later, you
should probably upgrade Git if your version is older.
The next step is to get other files needed to build, which are The next step is to get other files needed to build, which are
extracted from other source packages: extracted from other source packages:
$ ./bootstrap $ ./bootstrap
Bootstrapping updates the submodules to the versions registered in the And there you are! Just
top-level directory. To change gnulib, first check out the version you want
in `gnulib`, then commit this change in Bison's repository, and finally run
bootstrap.
If it fails with missing symbols (e.g., "error: possibly undefined macro:
AC_PROG_GNU_M4"), you are likely to have forgotten the submodule
initialization part. Otherwise, there you are! Just
$ ./configure $ ./configure
$ make $ make
@@ -139,12 +125,13 @@ explicitly by the user.
*** Updating Bison *** Updating Bison
If you pull a newer version of a branch, say via "git pull", you might If you pull a newer version of a branch, say via "git pull", you might
import requests for updated submodules. A simple "git diff" will reveal if import requests for updated submodules. A simple "git diff" will
the current version of the submodule (i.e., the actual contents of the reveal if the current version of the submodule (i.e., the actual
gnulib directory) and the current request from the subscriber (i.e., the contents of the gnulib directory) and the current request from the
reference of the version of gnulib that the Bison repository requests) subscriber (i.e., the reference of the version of gnulib that the
differ. To upgrade the submodules (i.e., to check out the version that is Bison repository requests) differ. To upgrade the submodules (i.e.,
actually requested by the subscriber, run "git submodule update". to check out the version that is actually requested by the subscriber,
run "git submodule update".
$ git pull $ git pull
$ git submodule update $ git submodule update
@@ -168,8 +155,8 @@ Register your changes.
$ git checkin ... $ git checkin ...
For a suggestion of what gnulib commit might be stable enough for a formal For a suggestion of what gnulib commit might be stable enough for a
release, see the ChangeLog in the latest gnulib snapshot at: formal release, see the ChangeLog in the latest gnulib snapshot at:
http://erislabs.net/ianb/projects/gnulib/ http://erislabs.net/ianb/projects/gnulib/
@@ -179,53 +166,15 @@ The Autoconf files we use are currently:
lib/m4sugar/m4sugar.m4 lib/m4sugar/m4sugar.m4
lib/m4sugar/foreach.m4 lib/m4sugar/foreach.m4
These files don't change very often in Autoconf, so it should be relatively These files don't change very often in Autoconf, so it should be
straight-forward to examine the differences in order to decide whether to relatively straight-forward to examine the differences in order to
update. decide whether to update.
* Test suite * Test suite
** make check ** make check
Use liberally. Use liberally.
** TESTSUITEFLAGS
To run just the testsuite (not the tests related to the examples), run `make
check-local`.
The default is for make check-local to run all tests sequentially. This can
be very time consuming when checking repeatedly or on slower setups. This
can be sped up in two ways:
Using -j, in a make-like fashion, for example:
$ make check-local TESTSUITEFLAGS='-j8'
Running only the tests of a certain category, as specified in the AT files
with AT_KEYWORDS([[category]]). Categories include:
- c++, for c++ parsers
- deprec, for tests concerning deprecated constructs.
- glr, for glr parsers
- java, for java parsers
- report, for automaton dumps
To run a specific set of tests, use -k (for "keyword"). For example:
$ make check-local TESTSUITEFLAGS='-k c++'
Both can be combined.
** Typical errors
If the test suite shows failures such as the following one
.../bison/lib/getopt.h:196:8: error: redefinition of 'struct option'
/usr/include/getopt.h:54:8: error: previous definition of 'struct option'
it probably means that some file was compiled without
AT_DATA_SOURCE_PROLOGUE. This error is due to the fact that our -I options
pick up gnulib's replacement headers, such as getopt.h, and this will go
wrong if config.h was not included first.
See tests/local.at for details.
** make maintainer-check-valgrind ** make maintainer-check-valgrind
This target uses valgrind both to check bison, and the generated parsers. This target uses valgrind both to check bison, and the generated parsers.
@@ -247,96 +196,102 @@ suite. So currently, do not try to run valgrind on Mac OS X.
Try to run the test suite with more severe conditions before a Try to run the test suite with more severe conditions before a
release: release:
- Configure the package with --enable-gcc-warnings, so that one checks that - Configure the package with --enable-gcc-warnings, so that one checks
1. Bison compiles cleanly, 2. the parsers it produces compile cleanly too. that 1. Bison compiles cleanly, 2. the parsers it produces compile
cleanly too.
- Maybe build with -DGNULIB_POSIXCHECK, which suggests gnulib modules that - Maybe build with -DGNULIB_POSIXCHECK, which suggests gnulib modules
can fix portability issues. See if you really want to pay attention to that can fix portability issues. See if you really want to pay
its warnings; there's no need to obey blindly to it attention to its warnings; there's no need to obey blindly to it
(<http://lists.gnu.org/archive/html/bison-patches/2012-05/msg00057.html>). (<http://lists.gnu.org/archive/html/bison-patches/2012-05/msg00057.html>).
- Check with "make syntax-check" if there are issues diagnosed by gnulib. - Check with "make syntax-check" if there are issues diagnosed by
gnulib.
- run "make maintainer-check" which: - run "make maintainer-check" which:
- runs "valgrind -q bison" to run Bison under Valgrind. - runs "valgrind -q bison" to run Bison under Valgrind.
- runs the parsers under Valgrind. - runs the parsers under Valgrind.
- runs the test suite with G++ as C compiler... - runs the test suite with G++ as C compiler...
- run "make maintainer-check-push", which runs "make maintainer-check" while - run "make maintainer-push-check", which runs "make maintainer-check"
activating the push implementation and its pull interface wrappers in many while activating the push implementation and its pull interface wrappers
test cases that were originally written to exercise only the pull in many test cases that were originally written to exercise only the
implementation. This makes certain the push implementation can perform pull implementation. This makes certain the push implementation can
every task the pull implementation can. perform every task the pull implementation can.
- run "make maintainer-check-xml", which runs "make maintainer-check" while - run "make maintainer-xml-check", which runs "make maintainer-check"
checking Bison's XML automaton report for every working grammar passed to while checking Bison's XML automaton report for every working grammar
Bison in the test suite. The check just diffs the output of Bison's passed to Bison in the test suite. The check just diffs the output of
included XSLT style sheets with the output of --report=all and --graph. Bison's included XSLT style sheets with the output of --report=all and
--graph.
- running "make maintainer-check-release" takes care of running - running "make maintainer-release-check" takes care of running
maintainer-check, maintainer-check-push and maintainer-check-xml. maintainer-check, maintainer-push-check and maintainer-xml-check.
- Change tests/atlocal/CFLAGS to add your preferred options. - Change tests/atlocal/CFLAGS to add your preferred options. For
instance, "-traditional" to check that the parsers are K&R. Note
that it does not make sense for glr.c, which should be ANSI, but
currently is actually GNU C, nor for lalr1.cc.
- Test with a very recent version of GCC for both C and C++. Testing with - Test with a very recent version of GCC for both C and C++. Testing
older versions that are still in use is nice too. with older versions that are still in use is nice too.
* Release Procedure * Release Procedure
This section needs to be updated to take into account features from gnulib. This section needs to be updated to take into account features from
In particular, be sure to read README-release. gnulib. In particular, be sure to read README-release.
** Update the submodules. See above. ** Update the submodules. See above.
** Update maintainer tools, such as Autoconf. See above. ** Update maintainer tools, such as Autoconf. See above.
** Try to get the *.pot files to the Translation Project at least one ** Try to get the *.pot files to the Translation Project at least one
week before a stable release, to give them time to translate them. Before week before a stable release, to give them time to translate them.
generating the *.pot files, make sure that po/POTFILES.in and Before generating the *.pot files, make sure that po/POTFILES.in and
runtime-po/POTFILES.in list all files with translatable strings. This runtime-po/POTFILES.in list all files with translatable strings.
helps: grep -l '\<_(' *. This helps: grep -l '\<_(' *
** Tests ** Tests
See above. See above.
** Update the foreign files ** Update the foreign files
Running "./bootstrap" in the top level should update them all for you. This Running "./bootstrap" in the top level should update them all for you.
covers PO files too. Sometimes a PO file contains problems that causes it This covers PO files too. Sometimes a PO file contains problems that
to be rejected by recent Gettext releases; please report these to the causes it to be rejected by recent Gettext releases; please report
Translation Project. these to the Translation Project.
** Update README ** Update README
Make sure the information in README is current. Most notably, make sure it Make sure the information in README is current. Most notably, make sure
recommends a version of GNU M4 that is compatible with the latest Bison it recommends a version of GNU M4 that is compatible with the latest
sources. Bison sources.
** Check copyright years. ** Check copyright years.
We update years in copyright statements throughout Bison once at the start We update years in copyright statements throughout Bison once at the
of every year by running "make update-copyright". However, before a start of every year by running "make update-copyright". However, before
release, it's good to verify that it's actually been run. Besides the a release, it's good to verify that it's actually been run. Besides the
copyright statement for each Bison file, check the copyright statements that copyright statement for each Bison file, check the copyright statements
the skeletons insert into generated parsers, and check all occurrences of that the skeletons insert into generated parsers, and check all
PACKAGE_COPYRIGHT_YEAR in configure.ac. occurrences of PACKAGE_COPYRIGHT_YEAR in configure.ac.
** Update NEWS, commit and tag. ** Update NEWS, commit and tag.
See do-release-commit-and-tag in README-release. For a while, we used beta See do-release-commit-and-tag in README-release. For a while, we used
names such as "2.6_rc1". Now that we use gnulib in the release procedure, beta names such as "2.6_rc1". Now that we use gnulib in the release
we must use "2.5.90", which has the additional benefit of being properly procedure, we must use "2.5.90", which has the additional benefit of
sorted in "git tag -l". being properly sorted in "git tag -l".
** make alpha, beta, or stable ** make alpha, beta, or stable
See README-release. See README-release.
** Upload ** Upload
There are two ways to upload the tarballs to the GNU servers: using gnupload There are two ways to upload the tarballs to the GNU servers: using
(from gnulib), or by hand. Obviously prefer the former. But in either gnupload (from gnulib), or by hand. Obviously prefer the former. But
case, be sure to read the following paragraph. in either case, be sure to read the following paragraph.
*** Setup *** Setup
You need "gnupg". You need "gnupg".
Make sure your public key has been uploaded at least to keys.gnupg.net. You Make sure your public key has been uploaded at least to
can upload it with: keys.gnupg.net. You can upload it with:
gpg --keyserver keys.gnupg.net --send-keys F125BDF3 gpg --keyserver keys.gnupg.net --send-keys F125BDF3
@@ -345,8 +300,8 @@ where F125BDF3 should be replaced with your key ID.
*** Using gnupload *** Using gnupload
You need "ncftp". You need "ncftp".
At the end "make stable" (or alpha/beta) will display the procedure to run. At the end "make stable" (or alpha/beta) will display the procedure to
Just copy and paste it in your shell. run. Just copy and paste it in your shell.
*** By hand *** By hand
@@ -408,9 +363,9 @@ sections that have been removed or renamed):
$ ls -lt $ ls -lt
Remove these files and commit their removal to CVS. For each of these Remove these files and commit their removal to CVS. For each of these
files, add a line to the file .symlinks. This will ensure that hyperlinks files, add a line to the file .symlinks. This will ensure that
to the removed files will redirect to the entire manual; this is better than hyperlinks to the removed files will redirect to the entire manual; this
a 404 error. is better than a 404 error.
There is a problem with 'index.html' being written twice (once for POSIX There is a problem with 'index.html' being written twice (once for POSIX
function 'index', once for the table of contents); you can ignore this function 'index', once for the table of contents); you can ignore this
@@ -429,18 +384,19 @@ Complete/fix the announcement file. The generated list of recipients
([email protected], [email protected], [email protected], ([email protected], [email protected], [email protected],
[email protected], and [email protected]) is [email protected], and [email protected]) is
appropriate for a stable release or a "serious beta". For any other appropriate for a stable release or a "serious beta". For any other
release, drop at least [email protected]. For an example of how to fill out release, drop at least [email protected]. For an example of how to
the rest of the template, search the mailing list archives for the most fill out the rest of the template, search the mailing list archives
recent release announcement. for the most recent release announcement.
For a stable release, send the same announcement on the comp.compilers For a stable release, send the same announcement on the comp.compilers
newsgroup by sending email to [email protected]. Do not make any Cc as the newsgroup by sending email to [email protected]. Do not make any Cc as
moderator will throw away anything cross-posted or Cc'ed. It really needs the moderator will throw away anything cross-posted or Cc'ed. It really
to be a separate message. needs to be a separate message.
** Prepare NEWS ** Prepare NEWS
So that developers don't accidentally add new items to the old NEWS entry, So that developers don't accidentally add new items to the old NEWS
create a new empty entry in line 3 (without the two leading spaces): entry, create a new empty entry in line 3 (without the two leading
spaces):
* Noteworthy changes in release ?.? (????-??-??) [?] * Noteworthy changes in release ?.? (????-??-??) [?]
@@ -448,7 +404,7 @@ Push these changes.
----- -----
Copyright (C) 2002-2005, 2007-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc.
This file is part of GNU Bison. This file is part of GNU Bison.
+1 -1
View File
@@ -9,7 +9,7 @@ Bison supports the @N construction, which gives you access to
the starting and ending line number and character number associated the starting and ending line number and character number associated
with any of the symbols in the current rule. with any of the symbols in the current rule.
Also, Bison supports the command '%expect N' which says not to mention Also, Bison supports the command `%expect N' which says not to mention
the conflicts if there are N shift/reduce conflicts and no reduce/reduce the conflicts if there are N shift/reduce conflicts and no reduce/reduce
conflicts. conflicts.
+5 -71
View File
@@ -1,202 +1,136 @@
Bison was originally written by Robert Corbett. It would not be what Bison was originally written by Robert Corbett. It would not be what
it is today without the invaluable help of these people: it is today without the invaluable help of these people:
Aaro Koskinen [email protected]
Аскар Сафин [email protected]
Adam Sampson [email protected]
Airy Andre [email protected] Airy Andre [email protected]
Akim Demaille akim@lrde.epita.fr Akim Demaille akim@freefriends.org
Albert Chin-A-Young [email protected] Albert Chin-A-Young [email protected]
Alexander Belopolsky [email protected] Alexander Belopolsky [email protected]
Alexandre Duret-Lutz adl@lrde.epita.fr Alexandre Duret-Lutz adl@src.lip6.fr
Andre da Costa Barros [email protected]
Andreas Schwab [email protected] Andreas Schwab [email protected]
Andrew Suffield [email protected] Andrew Suffield [email protected]
Angelo Borsotti [email protected] Angelo Borsotti [email protected]
Anthony Heading [email protected] Anthony Heading [email protected]
Antonio Silva Correia [email protected]
Arnold Robbins [email protected] Arnold Robbins [email protected]
Art Haas [email protected] Art Haas [email protected]
Askar Safin [email protected]
Baron Schwartz [email protected] Baron Schwartz [email protected]
Ben Pfaff [email protected]
Benoit Perrot [email protected] Benoit Perrot [email protected]
Bernd Edlinger [email protected]
Bernd Kiefer [email protected] Bernd Kiefer [email protected]
Bert Deknuydt [email protected] Bert Deknuydt [email protected]
Bill Allombert [email protected] Bill Allombert [email protected]
Bob Rossi [email protected] Bob Rossi [email protected]
Brandon Lucia [email protected] Brandon Lucia [email protected]
Brooks Moses [email protected]
Bruce Lilly [email protected] Bruce Lilly [email protected]
Bruno Haible [email protected] Bruno Haible [email protected]
Charles-Henri de Boysson [email protected] Charles-Henri de Boysson [email protected]
Christian Burger [email protected] Christian Burger [email protected]
Colin Daley [email protected]
Cris Bailiff [email protected] Cris Bailiff [email protected]
Cris van Pelt [email protected] Cris van Pelt [email protected]
Csaba Raduly [email protected] Csaba Raduly [email protected]
Dagobert Michelsen [email protected] Dagobert Michelsen [email protected]
Daniel Frużyński [email protected]
Daniel Galloway [email protected]
Daniel Hagerty [email protected] Daniel Hagerty [email protected]
David J. MacKenzie [email protected] David J. MacKenzie [email protected]
David Kastrup [email protected] David Kastrup [email protected]
David Michael [email protected]
Dengke Du [email protected]
Denis Excoffier [email protected]
Dennis Clarke [email protected]
Derek Clegg [email protected]
Derek M. Jones [email protected] Derek M. Jones [email protected]
Di-an Jan [email protected] Di-an Jan [email protected]
Dick Streefland [email protected] Dick Streefland [email protected]
Didier Godefroy [email protected] Didier Godefroy [email protected]
Efi Fogel [email protected]
Enrico Scholz [email protected] Enrico Scholz [email protected]
Eric Blake [email protected] Eric Blake [email protected]
Étienne Renault [email protected]
Evgeny Stambulchik [email protected] Evgeny Stambulchik [email protected]
Fabrice Bauzac [email protected] Fabrice Bauzac [email protected]
Ferdinand Thiessen [email protected]
Florian Krohm [email protected] Florian Krohm [email protected]
Frank Heckenbach [email protected] Frank Heckenbach [email protected]
Frans Englich [email protected] Frans Englich [email protected]
Gabriel Rassoul [email protected]
Gary L Peskin [email protected]
Georg Sauthoff [email protected] Georg Sauthoff [email protected]
George Neuner [email protected] George Neuner [email protected]
Gilles Espinasse [email protected] Gilles Espinasse [email protected]
Goran Uddeborg [email protected] Goran Uddeborg [email protected]
Guido Trentalancia [email protected] Guido Trentalancia [email protected]
H. Merijn Brand [email protected] H. Merijn Brand [email protected]
Hans Åberg haberg[email protected] Hans Aberg haberg@matematik.su.se
Horst Von Brand [email protected]
Jan Nieuwenhuizen [email protected] Jan Nieuwenhuizen [email protected]
Jannick [email protected]
Jerry Quinn [email protected] Jerry Quinn [email protected]
Jesse Thilo [email protected] Jesse Thilo [email protected]
Jim Kent [email protected] Jim Kent [email protected]
Jim Meyering [email protected] Jim Meyering [email protected]
Joel E. Denny [email protected] Joel E. Denny [email protected]
Johan van Selst [email protected] Johan van Selst [email protected]
John Horigan [email protected]
Jonathan Fabrizio [email protected]
Jonathan Nieder [email protected] Jonathan Nieder [email protected]
Josh Soref [email protected]
Juan Manuel Guerrero [email protected] Juan Manuel Guerrero [email protected]
Kees Zeelenberg [email protected] Kees Zeelenberg [email protected]
Keith Browne [email protected] Keith Browne [email protected]
Ken Moffat [email protected]
Kiyoshi Kanazawa [email protected]
Laurent Mascherpa [email protected] Laurent Mascherpa [email protected]
Lie Yan [email protected] Lie Yan [email protected]
Magnus Fromreide [email protected] Magnus Fromreide [email protected]
Marc Autret [email protected] Marc Autret [email protected]
Marc Mendiola [email protected]
Mark Boyall [email protected]
Martin Jacobs [email protected] Martin Jacobs [email protected]
Martin Mokrejs [email protected] Martin Mokrejs [email protected]
Martin Nylin [email protected] Martin Nylin [email protected]
Matt Kraai [email protected] Matt Kraai [email protected]
Matt Rosing [email protected] Matt Rosing [email protected]
Maxim Prohorenko [email protected]
Michael Catanzaro [email protected]
Michael Felt [email protected]
Michael Hayes [email protected] Michael Hayes [email protected]
Michael Raskin [email protected] Michael Raskin [email protected]
Michel d'Hooge [email protected]
Michiel De Wilde [email protected] Michiel De Wilde [email protected]
Mickael Labau [email protected] Mickael Labau [email protected]
Mike Castle [email protected] Mike Castle [email protected]
Mike Frysinger [email protected]
Mike Sullivan [email protected]
Nate Guerin [email protected]
Neil Booth [email protected] Neil Booth [email protected]
Nelson H. F. Beebe [email protected] Nelson H. F. Beebe [email protected]
Nick Bowler [email protected]
Nicolas Bedon [email protected]
Nicolas Burrus [email protected] Nicolas Burrus [email protected]
Nicolas Tisserand [email protected] Nicolas Tisserand [email protected]
Noah Friedman [email protected] Noah Friedman [email protected]
Odd Arild Olsen [email protected] Odd Arild Olsen [email protected]
Oleg Smolsky [email protected] Oleg Smolsky [email protected]
Oleksii Taran [email protected]
Paolo Bonzini [email protected] Paolo Bonzini [email protected]
Paolo Simone Gasparello [email protected]
Pascal Bart [email protected] Pascal Bart [email protected]
Paul Eggert [email protected] Paul Eggert [email protected]
Paul Hilfinger [email protected] Paul Hilfinger [email protected]
Per Allansson [email protected] Per Allansson [email protected]
Peter Eisentraut [email protected]
Peter Fales [email protected] Peter Fales [email protected]
Peter Hamorsky [email protected] Peter Hamorsky [email protected]
Peter Simons [email protected]
Petr Machata [email protected]
Pho [email protected]
Piotr Gackiewicz [email protected] Piotr Gackiewicz [email protected]
Piotr Marcińczyk [email protected]
Quentin Hocquet [email protected] Quentin Hocquet [email protected]
Quoc Peyrot [email protected] 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]
Rich Wilson [email protected]
Richard Stallman [email protected] Richard Stallman [email protected]
Rici Lake [email protected]
Rob Conde [email protected]
Rob Vermaas [email protected]
Robert Anisko [email protected] Robert Anisko [email protected]
Robert Yang [email protected]
Roland Levillain [email protected]
Satya Kiran Popuri [email protected] Satya Kiran Popuri [email protected]
Sebastian Setzer [email protected] Sebastian Setzer [email protected]
Sebastien Fricker [email protected] Sebastien Fricker [email protected]
Sébastien Villemot [email protected]
Sergei Steshenko [email protected] Sergei Steshenko [email protected]
Shura [email protected] Shura [email protected]
Simon Sobisch [email protected]
Stefano Lattarini [email protected] Stefano Lattarini [email protected]
Stephen Cameron [email protected]
Steve Murphy [email protected] Steve Murphy [email protected]
Sum Wu [email protected] Summum Bonum [email protected]
Théophile Ranquet [email protected]
Thiru Ramakrishnan [email protected] Thiru Ramakrishnan [email protected]
Thomas Jahns [email protected]
Tim Josling [email protected] Tim Josling [email protected]
Tim Landscheidt [email protected] Tim Landscheidt [email protected]
Tim Van Holder [email protected] Tim Van Holder [email protected]
Tobias Frost [email protected]
Tom Lane [email protected] Tom Lane [email protected]
Tom Tromey [email protected] Tom Tromey [email protected]
Tommy Nordgren [email protected] Tommy Nordgren [email protected]
Troy A. Johnson [email protected] Troy A. Johnson [email protected]
Tys Lefering [email protected] Tys Lefering [email protected]
Valentin Tolmer [email protected]
Victor Khomenko [email protected]
Vin Shelton [email protected] Vin Shelton [email protected]
W.C.A. Wijngaards [email protected] W.C.A. Wijngaards [email protected]
Wayne Green [email protected] Wayne Green [email protected]
Wei Song [email protected] Wei Song [email protected]
Wojciech Polak [email protected]
Wolfgang S. Kechel [email protected] Wolfgang S. Kechel [email protected]
Wolfgang Thaller [email protected]
Wolfram Wagner [email protected] Wolfram Wagner [email protected]
Wwp [email protected] Wwp [email protected]
xolodho [email protected]
Zack Weinberg [email protected] Zack Weinberg [email protected]
長田偉伸 [email protected]
Many people are not named here because we lost track of them. We Many people are not named here because we lost track of them. We
thank them! Please, help us keeping this list up to date. thank them! Please, help us keeping this list up to date.
Local Variables: Local Variables:
mode: text mode: text
coding: utf-8
End: End:
----- -----
Copyright (C) 2000-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2000-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Parser Generator. This file is part of Bison, the GNU Parser Generator.
+28 -111
View File
@@ -1,79 +1,8 @@
* Short term * Short term
** yacc.c ** Variable names.
Now that ylwrap is fixed, we should include foo.tab.h from foo.tab.c rather What should we name `variant' and `lex_symbol'?
than duplicating it.
** C++ ** Update the documentation on gnu.org
Move to int everywhere instead of unsigned? stack_size, etc. The parser
itself uses int (for yylen for instance), yet stack is based on size_t.
Maybe locations should also move to ints.
** C
Introduce state_type rather than spreading yytype_int16 everywhere?
** glr.c
yyspaceLeft should probably be a pointer diff.
** Graphviz display code thoughts
The code for the --graph option is over two files: print_graph, and
graphviz. This is because Bison used to also produce VCG graphs, but since
this is no longer true, maybe we could consider these files for fusion.
An other consideration worth noting is that print_graph.c (correct me if I
am wrong) should contain generic functions, whereas graphviz.c and other
potential files should contain just the specific code for that output
format. It will probably prove difficult to tell if the implementation is
actually generic whilst only having support for a single format, but it
would be nice to keep stuff a bit tidier: right now, the construction of the
bitset used to show reductions is in the graphviz-specific code, and on the
opposite side we have some use of \l, which is graphviz-specific, in what
should be generic code.
Little effort seems to have been given to factoring these files and their
rint{,-xml} counterpart. We would very much like to re-use the pretty format
of states from .output for the graphs, etc.
Also, the underscore in print_graph.[ch] isn't very fitting considering the
dashes in the other filenames.
Since graphviz dies on medium-to-big grammars, maybe consider an other tool?
** push-parser
Check it too when checking the different kinds of parsers. And be
sure to check that the initial-action is performed once per parsing.
** m4 names
b4_shared_declarations is no longer what it is. Make it
b4_parser_declaration for instance.
** yychar in lalr1.cc
There is a large difference bw maint and master on the handling of
yychar (which was removed in lalr1.cc). See what needs to be
back-ported.
/* User semantic actions sometimes alter yychar, and that requires
that yytoken be updated with the new translation. We take the
approach of translating immediately before every use of yytoken.
One alternative is translating here after every semantic action,
but that translation would be missed if the semantic action
invokes YYABORT, YYACCEPT, or YYERROR immediately after altering
yychar. In the case of YYABORT or YYACCEPT, an incorrect
destructor might then be invoked immediately. In the case of
YYERROR, subsequent parser actions might lead to an incorrect
destructor call or verbose syntax error message before the
lookahead is translated. */
/* Make sure we have latest lookahead translation. See comments at
user semantic actions for why this is necessary. */
yytoken = yytranslate_ (yychar);
** stack.hh
Get rid of it. The original idea is nice, but actually it makes
the code harder to follow, and uselessly different from the other
skeletons.
** Get rid of fake #lines [Bison: ...] ** Get rid of fake #lines [Bison: ...]
Possibly as simple as checking whether the column number is nonnegative. Possibly as simple as checking whether the column number is nonnegative.
@@ -101,7 +30,14 @@ since it is no longer bound to a particular parser, it's just a
** Rename LR0.cc ** Rename LR0.cc
as lr0.cc, why upper case? as lr0.cc, why upper case?
** bench several bisons.
Enhance bench.pl with %b to run different bisons.
* Various * Various
** Warnings
Warnings about type tags that are used in printer and dtors, but not
for symbols?
** YYERRCODE ** YYERRCODE
Defined to 256, but not used, not documented. Probably the token Defined to 256, but not used, not documented. Probably the token
number for the error token, which POSIX wants to be 256, but which number for the error token, which POSIX wants to be 256, but which
@@ -128,7 +64,7 @@ We could (should?) also treat the case of the undef_token, which is
numbered 257 for yylex, and 2 internal. Both appear for instance in numbered 257 for yylex, and 2 internal. Both appear for instance in
toknum: toknum:
const unsigned short const unsigned short int
parser::yytoken_number_[] = parser::yytoken_number_[] =
{ {
0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
@@ -147,6 +83,9 @@ so both 256 and 257 are "mysterious".
"\"end of command\"", "error", "$undefined", "\"=\"", "\"break\"", "\"end of command\"", "error", "$undefined", "\"=\"", "\"break\"",
** YYFAIL
It is seems to be *really* obsolete now, shall we remove it?
** yychar == yyempty_ ** yychar == yyempty_
The code in yyerrlab reads: The code in yyerrlab reads:
@@ -164,6 +103,12 @@ really possible? The test suite does not exercise this case.
This shows that it would be interesting to manage to install skeleton This shows that it would be interesting to manage to install skeleton
coverage analysis to the test suite. coverage analysis to the test suite.
** Table definitions
It should be very easy to factor the definition of the various tables,
including the separation bw declaration and definition. See for
instance b4_table_define in lalr1.cc. This way, we could even factor
C vs. C++ definitions.
* From lalr1.cc to yacc.c * From lalr1.cc to yacc.c
** Single stack ** Single stack
Merging the three stacks in lalr1.cc simplified the code, prompted for Merging the three stacks in lalr1.cc simplified the code, prompted for
@@ -192,13 +137,13 @@ part of $default. Should we make the two reductions explicit, or just
keep $default? See the following point. keep $default? See the following point.
** Disabled Reductions ** Disabled Reductions
See 'tests/conflicts.at (Defaulted Conflicted Reduction)', and decide See `tests/conflicts.at (Defaulted Conflicted Reduction)', and decide
what we want to do. what we want to do.
** Documentation ** Documentation
Extend with error productions. The hard part will probably be finding Extend with error productions. The hard part will probably be finding
the right rule so that a single state does not exhibit too many yet the right rule so that a single state does not exhibit too many yet
undocumented ''features''. Maybe an empty action ought to be undocumented ``features''. Maybe an empty action ought to be
presented too. Shall we try to make a single grammar with all these presented too. Shall we try to make a single grammar with all these
features, or should we have several very small grammars? features, or should we have several very small grammars?
@@ -212,31 +157,6 @@ DeRemer and Penello: they already provide the algorithm.
* Extensions * Extensions
** Multiple start symbols
Would be very useful when parsing closely related languages.
** Better error messages
The users are not provided with enough tools to forge their error messages.
See for instance "Is there an option to change the message produced by
YYERROR_VERBOSE?" by Simon Sobisch, on bison-help.
See also
https://www.cs.tufts.edu/~nr/cs257/archive/clinton-jefferey/lr-error-messages.pdf
and https://research.swtch.com/yyerror.
** %include
This is a popular demand. We already made many changes in the parser that
should make this reasonably easy to implement.
Bruce Mardle <[email protected]>
https://lists.gnu.org/archive/html/bison-patches/2015-09/msg00000.html
** Push parsers
There is demand for push parsers in Java and C++. And GLR I guess.
** Generate code instead of tables
This is certainly quite a lot of work. See
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.4539.
** $-1 ** $-1
We should find a means to provide an access to values deep in the We should find a means to provide an access to values deep in the
@@ -272,10 +192,6 @@ XML output for GNU Bison and gcc
XML output for GNU Bison XML output for GNU Bison
http://yaxx.sourceforge.net/ http://yaxx.sourceforge.net/
** Counterexample generation
https://lists.gnu.org/archive/html/bug-bison/2016-06/msg00000.html
http://www.cs.cornell.edu/andru/papers/cupex/
* Unit rules * Unit rules
Maybe we could expand unit rules, i.e., transform Maybe we could expand unit rules, i.e., transform
@@ -288,9 +204,9 @@ into
exp: exp '+' exp | exp '&' exp; exp: exp '+' exp | exp '&' exp;
when there are no actions. This can significantly speed up some when there are no actions. This can significantly speed up some
grammars. I can't find the papers. In particular the book 'LR grammars. I can't find the papers. In particular the book `LR
parsing: Theory and Practice' is impossible to find, but according to parsing: Theory and Practice' is impossible to find, but according to
'Parsing Techniques: a Practical Guide', it includes information about `Parsing Techniques: a Practical Guide', it includes information about
this issue. Does anybody have it? this issue. Does anybody have it?
@@ -318,6 +234,9 @@ Paul notes:
tokens, either via escapes (e.g., "x\0y") or via a NUL byte in tokens, either via escapes (e.g., "x\0y") or via a NUL byte in
the source code. This should get fixed. the source code. This should get fixed.
* --graph
Show reductions.
* Broken options ? * Broken options ?
** %token-table ** %token-table
** Skeleton strategy ** Skeleton strategy
@@ -410,13 +329,11 @@ Here's a proposal for how a new implementation might look:
Local Variables: Local Variables:
mode: outline mode: outline
coding: utf-8 coding: utf-8
fill-column: 76
End: End:
----- -----
Copyright (C) 2001-2004, 2006, 2008-2015, 2018 Free Software Foundation, Copyright (C) 2001-2004, 2006, 2008-2012 Free Software Foundation, Inc.
Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+196 -283
View File
@@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# Print a version string. # Print a version string.
scriptversion=2018-10-13.05; # UTC scriptversion=2012-07-19.14; # UTC
# Bootstrap this package from checked-out sources. # Bootstrap this package from checked-out sources.
# Copyright (C) 2003-2018 Free Software Foundation, Inc. # Copyright (C) 2003-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -17,7 +17,7 @@ scriptversion=2018-10-13.05; # UTC
# GNU General Public License for more details. # GNU General Public License for more details.
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# Originally written by Paul Eggert. The canonical version of this # Originally written by Paul Eggert. The canonical version of this
# script is maintained as build-aux/bootstrap in gnulib, however, to # script is maintained as build-aux/bootstrap in gnulib, however, to
@@ -42,13 +42,8 @@ export LC_ALL
local_gl_dir=gl local_gl_dir=gl
# Honor $PERL, but work even if there is none.
PERL="${PERL-perl}"
me=$0 me=$0
default_gnulib_url=git://git.sv.gnu.org/gnulib
usage() { usage() {
cat <<EOF cat <<EOF
Usage: $me [OPTION]... Usage: $me [OPTION]...
@@ -78,37 +73,6 @@ contents are read as shell variables to configure the bootstrap.
For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
are honored. are honored.
Gnulib sources can be fetched in various ways:
* If this package is in a git repository with a 'gnulib' submodule
configured, then that submodule is initialized and updated and sources
are fetched from there. If \$GNULIB_SRCDIR is set (directly or via
--gnulib-srcdir) and is a git repository, then it is used as a reference.
* Otherwise, if \$GNULIB_SRCDIR is set (directly or via --gnulib-srcdir),
then sources are fetched from that local directory. If it is a git
repository and \$GNULIB_REVISION is set, then that revision is checked
out.
* Otherwise, if this package is in a git repository with a 'gnulib'
submodule configured, then that submodule is initialized and updated and
sources are fetched from there.
* Otherwise, if the 'gnulib' directory does not exist, Gnulib sources are
cloned into that directory using git from \$GNULIB_URL, defaulting to
$default_gnulib_url.
If \$GNULIB_REVISION is set, then that revision is checked out.
* Otherwise, the existing Gnulib sources in the 'gnulib' directory are
used. If it is a git repository and \$GNULIB_REVISION is set, then that
revision is checked out.
If you maintain a package and want to pin a particular revision of the
Gnulib sources that has been tested with your package, then there are two
possible approaches: either configure a 'gnulib' submodule with the
appropriate revision, or set \$GNULIB_REVISION (and if necessary
\$GNULIB_URL) in $me.conf.
Running without arguments will suffice in most cases. Running without arguments will suffice in most cases.
EOF EOF
} }
@@ -162,28 +126,34 @@ bootstrap_post_import_hook() { :; }
# Override it via your own definition in bootstrap.conf. # Override it via your own definition in bootstrap.conf.
bootstrap_epilogue() { :; } bootstrap_epilogue() { :; }
# The command to download all .po files for a specified domain into a # The command to download all .po files for a specified domain into
# specified directory. Fill in the first %s with the destination # a specified directory. Fill in the first %s is the domain name, and
# directory and the second with the domain name. # the second with the destination directory. Use rsync's -L and -r
# options because the latest/%s directory and the .po files within are
# all symlinks.
po_download_command_format=\ po_download_command_format=\
"wget --mirror --level=1 -nd -q -A.po -P '%s' \ "rsync --delete --exclude '*.s1' -Lrtvz \
https://translationproject.org/latest/%s/" 'translationproject.org::tp/latest/%s/' '%s'"
# Fallback for downloading .po files (if rsync fails).
po_download_command_format2=\
"wget --mirror -nd -q -np -A.po -P '%s' \
http://translationproject.org/latest/%s/"
# Prefer a non-empty tarname (4th argument of AC_INIT if given), else
# fall back to the package name (1st argument with munging)
extract_package_name=' extract_package_name='
/^AC_INIT(\[*/{ /^AC_INIT(/{
s/// /.*,.*,.*, */{
/^[^,]*,[^,]*,[^,]*,[ []*\([^][ ,)]\)/{ s///
s//\1/ s/[][]//g
s/[],)].*// s/)$//
p p
q q
} }
s/[],)].*// s/AC_INIT(\[*//
s/]*,.*//
s/^GNU // s/^GNU //
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
s/[^abcdefghijklmnopqrstuvwxyz0123456789_]/-/g s/[^A-Za-z0-9_]/-/g
p p
} }
' '
@@ -196,15 +166,7 @@ source_base=lib
m4_base=m4 m4_base=m4
doc_base=doc doc_base=doc
tests_base=tests tests_base=tests
gnulib_extra_files=" gnulib_extra_files=''
build-aux/install-sh
build-aux/mdate-sh
build-aux/texinfo.tex
build-aux/depcomp
build-aux/config.guess
build-aux/config.sub
doc/INSTALL
"
# Additional gnulib-tool options to use. Use "\newline" to break lines. # Additional gnulib-tool options to use. Use "\newline" to break lines.
gnulib_tool_option_extras= gnulib_tool_option_extras=
@@ -246,26 +208,12 @@ bootstrap_sync=false
# Use git to update gnulib sources # Use git to update gnulib sources
use_git=true use_git=true
check_exists() {
if test "$1" = "--verbose"; then
($2 --version </dev/null) >/dev/null 2>&1
if test $? -ge 126; then
# If not found, run with diagnostics as one may be
# presented with env variables to set to find the right version
($2 --version </dev/null)
fi
else
($1 --version </dev/null) >/dev/null 2>&1
fi
test $? -lt 126
}
# find_tool ENVVAR NAMES... # find_tool ENVVAR NAMES...
# ------------------------- # -------------------------
# Search for a required program. Use the value of ENVVAR, if set, # Search for a required program. Use the value of ENVVAR, if set,
# otherwise find the first of the NAMES that can be run. # otherwise find the first of the NAMES that can be run (i.e.,
# If found, set ENVVAR to the program name, die otherwise. # supports --version). If found, set ENVVAR to the program name,
# die otherwise.
# #
# FIXME: code duplication, see also gnu-web-doc-update. # FIXME: code duplication, see also gnu-web-doc-update.
find_tool () find_tool ()
@@ -275,21 +223,27 @@ find_tool ()
find_tool_names=$@ find_tool_names=$@
eval "find_tool_res=\$$find_tool_envvar" eval "find_tool_res=\$$find_tool_envvar"
if test x"$find_tool_res" = x; then if test x"$find_tool_res" = x; then
for i; do for i
if check_exists $i; then do
find_tool_res=$i if ($i --version </dev/null) >/dev/null 2>&1; then
break find_tool_res=$i
break
fi fi
done done
else
find_tool_error_prefix="\$$find_tool_envvar: "
fi fi
if test x"$find_tool_res" = x; then test x"$find_tool_res" != x \
warn_ "one of these is required: $find_tool_names;" || die "one of these is required: $find_tool_names"
die "alternatively set $find_tool_envvar to a compatible tool" ($find_tool_res --version </dev/null) >/dev/null 2>&1 \
fi || die "${find_tool_error_prefix}cannot run $find_tool_res --version"
eval "$find_tool_envvar=\$find_tool_res" eval "$find_tool_envvar=\$find_tool_res"
eval "export $find_tool_envvar" eval "export $find_tool_envvar"
} }
# Find sha1sum, named gsha1sum on MacPorts, and shasum on Mac OS X 10.6.
find_tool SHA1SUM sha1sum gsha1sum shasum
# Override the default configuration, if necessary. # Override the default configuration, if necessary.
# Make sure that bootstrap.conf is sourced from the current directory # Make sure that bootstrap.conf is sourced from the current directory
# if we were invoked as "sh bootstrap". # if we were invoked as "sh bootstrap".
@@ -298,18 +252,24 @@ case "$0" in
*) test -r "$0.conf" && . ./"$0.conf" ;; *) test -r "$0.conf" && . ./"$0.conf" ;;
esac esac
# Extra files from gnulib, which override files from other sources.
test -z "${gnulib_extra_files}" && \
gnulib_extra_files="
$build_aux/install-sh
$build_aux/mdate-sh
$build_aux/texinfo.tex
$build_aux/depcomp
$build_aux/config.guess
$build_aux/config.sub
doc/INSTALL
"
if test "$vc_ignore" = auto; then if test "$vc_ignore" = auto; then
vc_ignore= vc_ignore=
test -d .git && vc_ignore=.gitignore test -d .git && vc_ignore=.gitignore
test -d CVS && vc_ignore="$vc_ignore .cvsignore" test -d CVS && vc_ignore="$vc_ignore .cvsignore"
fi fi
if test x"$gnulib_modules$gnulib_files$gnulib_extra_files" = x; then
use_gnulib=false
else
use_gnulib=true
fi
# Translate configuration into internal form. # Translate configuration into internal form.
# Parse options. # Parse options.
@@ -346,34 +306,34 @@ if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
die "Bootstrapping from a non-checked-out distribution is risky." die "Bootstrapping from a non-checked-out distribution is risky."
fi fi
# Strip blank and comment lines to leave significant entries. # Ensure that lines starting with ! sort last, per gitignore conventions
gitignore_entries() { # for whitelisting exceptions after a more generic blacklist pattern.
sed '/^#/d; /^$/d' "$@" sort_patterns() {
sort -u "$@" | sed '/^!/ {
H
d
}
$ {
P
x
s/^\n//
}' | sed '/^$/d'
} }
# If $STR is not already on a line by itself in $FILE, insert it at the start. # If $STR is not already on a line by itself in $FILE, insert it,
# Entries are inserted at the start of the ignore list to ensure existing # sorting the new contents of the file and replacing $FILE with the result.
# entries starting with ! are not overridden. Such entries support insert_sorted_if_absent() {
# whitelisting exceptions after a more generic blacklist pattern.
insert_if_absent() {
file=$1 file=$1
str=$2 str=$2
test -f $file || touch $file test -f $file || touch $file
test -r $file || die "Error: failed to read ignore file: $file" echo "$str" | sort_patterns - $file | cmp -s - $file > /dev/null \
duplicate_entries=$(gitignore_entries $file | sort | uniq -d) || { echo "$str" | sort_patterns - $file > $file.bak \
if [ "$duplicate_entries" ] ; then && mv $file.bak $file; } \
die "Error: Duplicate entries in $file: " $duplicate_entries || die "insert_sorted_if_absent $file $str: failed"
fi
linesold=$(gitignore_entries $file | wc -l)
linesnew=$( { echo "$str"; cat $file; } | gitignore_entries | sort -u | wc -l)
if [ $linesold != $linesnew ] ; then
{ echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \
|| die "insert_if_absent $file $str: failed"
fi
} }
# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with # Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
# insert_if_absent. # insert_sorted_if_absent.
insert_vc_ignore() { insert_vc_ignore() {
vc_ignore_file="$1" vc_ignore_file="$1"
pattern="$2" pattern="$2"
@@ -384,7 +344,7 @@ insert_vc_ignore() {
# .gitignore entry. # .gitignore entry.
pattern=$(echo "$pattern" | sed s,^,/,);; pattern=$(echo "$pattern" | sed s,^,/,);;
esac esac
insert_if_absent "$vc_ignore_file" "$pattern" insert_sorted_if_absent "$vc_ignore_file" "$pattern"
} }
# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac. # Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
@@ -446,30 +406,28 @@ sort_ver() { # sort -V is not generally available
done done
} }
get_version_sed='
# Move version to start of line.
s/.*[v ]\([0-9]\)/\1/
# Skip lines that do not start with version.
/^[0-9]/!d
# Remove characters after the version.
s/[^.a-z0-9-].*//
# The first component must be digits only.
s/^\([0-9]*\)[a-z-].*/\1/
#the following essentially does s/5.005/5.5/
s/\.0*\([1-9]\)/.\1/g
p
q'
get_version() { get_version() {
app=$1 app=$1
$app --version >/dev/null 2>&1 || { $app --version; return 1; } $app --version >/dev/null 2>&1 || return 1
$app --version 2>&1 | sed -n "$get_version_sed" $app --version 2>&1 |
sed -n '# Move version to start of line.
s/.*[v ]\([0-9]\)/\1/
# Skip lines that do not start with version.
/^[0-9]/!d
# Remove characters after the version.
s/[^.a-z0-9-].*//
# The first component must be digits only.
s/^\([0-9]*\)[a-z-].*/\1/
#the following essentially does s/5.005/5.5/
s/\.0*\([1-9]\)/.\1/g
p
q'
} }
check_versions() { check_versions() {
@@ -489,7 +447,6 @@ check_versions() {
test "$appvar" = TAR && appvar=AMTAR test "$appvar" = TAR && appvar=AMTAR
case $appvar in case $appvar in
GZIP) ;; # Do not use $GZIP: it contains gzip options. GZIP) ;; # Do not use $GZIP: it contains gzip options.
PERL::*) ;; # Keep perl modules as-is
*) eval "app=\${$appvar-$app}" ;; *) eval "app=\${$appvar-$app}" ;;
esac esac
@@ -507,22 +464,12 @@ check_versions() {
ret=1 ret=1
continue continue
} ;; } ;;
# Another check is for perl modules. These can be written as
# e.g. perl::XML::XPath in case of XML::XPath module, etc.
perl::*)
# Extract module name
app="${app#perl::}"
if ! $PERL -m"$app" -e 'exit 0' >/dev/null 2>&1; then
warn_ "Error: perl module '$app' not found"
ret=1
fi
continue
;;
esac esac
if [ "$req_ver" = "-" ]; then if [ "$req_ver" = "-" ]; then
# Merely require app to exist; not all prereq apps are well-behaved # Merely require app to exist; not all prereq apps are well-behaved
# so we have to rely on $? rather than get_version. # so we have to rely on $? rather than get_version.
if ! check_exists --verbose $app; then $app --version >/dev/null 2>&1
if [ 126 -le $? ]; then
warn_ "Error: '$app' not found" warn_ "Error: '$app' not found"
ret=1 ret=1
fi fi
@@ -555,12 +502,6 @@ print_versions() {
# can't depend on column -t # can't depend on column -t
} }
# Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6.
# Also find the compatible sha1 utility on the BSDs
if test x"$SKIP_PO" = x; then
find_tool SHA1SUM sha1sum gsha1sum shasum sha1
fi
use_libtool=0 use_libtool=0
# We'd like to use grep -E, to see if any of LT_INIT, # We'd like to use grep -E, to see if any of LT_INIT,
# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac, # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
@@ -606,21 +547,13 @@ if ! printf "$buildreq" | check_versions; then
fi fi
fi fi
# Warn the user if autom4te appears to be broken; this causes known
# issues with at least gettext 0.18.3.
probe=$(echo 'm4_quote([hi])' | autom4te -l M4sugar -t 'm4_quote:$%' -)
if test "x$probe" != xhi; then
warn_ "WARNING: your autom4te wrapper eats stdin;"
warn_ "if bootstrap fails, consider upgrading your autotools"
fi
echo "$0: Bootstrapping from checked-out $package sources..." echo "$0: Bootstrapping from checked-out $package sources..."
# See if we can use gnulib's git-merge-changelog merge driver. # See if we can use gnulib's git-merge-changelog merge driver.
if $use_git && test -d .git && check_exists git; then if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
if git config merge.merge-changelog.driver >/dev/null ; then if git config merge.merge-changelog.driver >/dev/null ; then
: :
elif check_exists git-merge-changelog; then elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
echo "$0: initializing git-merge-changelog driver" echo "$0: initializing git-merge-changelog driver"
git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
@@ -640,101 +573,83 @@ git_modules_config () {
test -f .gitmodules && git config --file .gitmodules "$@" test -f .gitmodules && git config --file .gitmodules "$@"
} }
if $use_gnulib; then gnulib_path=$(git_modules_config submodule.gnulib.path)
if $use_git; then test -z "$gnulib_path" && gnulib_path=gnulib
gnulib_path=$(git_modules_config submodule.gnulib.path)
test -z "$gnulib_path" && gnulib_path=gnulib # Get gnulib files.
case ${GNULIB_SRCDIR--} in
-)
if git_modules_config submodule.gnulib.url >/dev/null; then
echo "$0: getting gnulib files..."
git submodule init || exit $?
git submodule update || exit $?
elif [ ! -d "$gnulib_path" ]; then
echo "$0: getting gnulib files..."
trap cleanup_gnulib 1 2 13 15
shallow=
git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
git clone $shallow git://git.sv.gnu.org/gnulib "$gnulib_path" ||
cleanup_gnulib
trap - 1 2 13 15
fi fi
GNULIB_SRCDIR=$gnulib_path
# Get gnulib files. Populate $GNULIB_SRCDIR, possibly updating a ;;
# submodule, for use in the rest of the script. *)
# Use GNULIB_SRCDIR as a reference.
case ${GNULIB_SRCDIR--} in if test -d "$GNULIB_SRCDIR"/.git && \
-) git_modules_config submodule.gnulib.url >/dev/null; then
# Note that $use_git is necessarily true in this case. echo "$0: getting gnulib files..."
if git_modules_config submodule.gnulib.url >/dev/null; then if git submodule -h|grep -- --reference > /dev/null; then
echo "$0: getting gnulib files..." # Prefer the one-liner available in git 1.6.4 or newer.
git submodule init -- "$gnulib_path" || exit $? git submodule update --init --reference "$GNULIB_SRCDIR" \
git submodule update -- "$gnulib_path" || exit $? "$gnulib_path" || exit $?
else
elif [ ! -d "$gnulib_path" ]; then # This fallback allows at least git 1.5.5.
echo "$0: getting gnulib files..." if test -f "$gnulib_path"/gnulib-tool; then
# Since file already exists, assume submodule init already complete.
trap cleanup_gnulib 1 2 13 15 git submodule update || exit $?
else
shallow= # Older git can't clone into an empty directory.
if test -z "$GNULIB_REVISION"; then rmdir "$gnulib_path" 2>/dev/null
git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2' git clone --reference "$GNULIB_SRCDIR" \
"$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
&& git submodule init && git submodule update \
|| exit $?
fi fi
git clone $shallow ${GNULIB_URL:-$default_gnulib_url} "$gnulib_path" \
|| cleanup_gnulib
trap - 1 2 13 15
fi fi
GNULIB_SRCDIR=$gnulib_path GNULIB_SRCDIR=$gnulib_path
;;
*)
# Use GNULIB_SRCDIR directly or as a reference.
if $use_git && test -d "$GNULIB_SRCDIR"/.git && \
git_modules_config submodule.gnulib.url >/dev/null; then
echo "$0: getting gnulib files..."
if git submodule -h|grep -- --reference > /dev/null; then
# Prefer the one-liner available in git 1.6.4 or newer.
git submodule update --init --reference "$GNULIB_SRCDIR" \
"$gnulib_path" || exit $?
else
# This fallback allows at least git 1.5.5.
if test -f "$gnulib_path"/gnulib-tool; then
# Since file already exists, assume submodule init already complete.
git submodule update -- "$gnulib_path" || exit $?
else
# Older git can't clone into an empty directory.
rmdir "$gnulib_path" 2>/dev/null
git clone --reference "$GNULIB_SRCDIR" \
"$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
&& git submodule init -- "$gnulib_path" \
&& git submodule update -- "$gnulib_path" \
|| exit $?
fi
fi
GNULIB_SRCDIR=$gnulib_path
fi
;;
esac
if test -d "$GNULIB_SRCDIR"/.git && test -n "$GNULIB_REVISION" \
&& ! git_modules_config submodule.gnulib.url >/dev/null; then
(cd "$GNULIB_SRCDIR" && git checkout "$GNULIB_REVISION") || cleanup_gnulib
fi fi
;;
esac
# $GNULIB_SRCDIR now points to the version of gnulib to use, and if $bootstrap_sync; then
# we no longer need to use git or $gnulib_path below here. cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
echo "$0: updating bootstrap and restarting..."
if $bootstrap_sync; then exec sh -c \
cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || { 'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \
echo "$0: updating bootstrap and restarting..." -- "$GNULIB_SRCDIR/build-aux/bootstrap" \
case $(sh -c 'echo "$1"' -- a) in "$0" "$@" --no-bootstrap-sync
a) ignored=--;; }
*) ignored=ignored;;
esac
exec sh -c \
'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \
$ignored "$GNULIB_SRCDIR/build-aux/bootstrap" \
"$0" "$@" --no-bootstrap-sync
}
fi
gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
<$gnulib_tool || exit $?
fi fi
gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
<$gnulib_tool || exit $?
# Get translations. # Get translations.
download_po_files() { download_po_files() {
subdir=$1 subdir=$1
domain=$2 domain=$2
echo "$me: getting translations into $subdir for $domain..." echo "$me: getting translations into $subdir for $domain..."
cmd=$(printf "$po_download_command_format" "$subdir" "$domain") cmd=$(printf "$po_download_command_format" "$domain" "$subdir")
eval "$cmd" && return
# Fallback to HTTP.
cmd=$(printf "$po_download_command_format2" "$subdir" "$domain")
eval "$cmd" eval "$cmd"
} }
@@ -765,10 +680,11 @@ update_po_files() {
cksum_file="$ref_po_dir/$po.s1" cksum_file="$ref_po_dir/$po.s1"
if ! test -f "$cksum_file" || if ! test -f "$cksum_file" ||
! test -f "$po_dir/$po.po" || ! test -f "$po_dir/$po.po" ||
! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then ! $SHA1SUM -c --status "$cksum_file" \
< "$new_po" > /dev/null; then
echo "$me: updated $po_dir/$po.po..." echo "$me: updated $po_dir/$po.po..."
cp "$new_po" "$po_dir/$po.po" \ cp "$new_po" "$po_dir/$po.po" \
&& $SHA1SUM < "$new_po" > "$cksum_file" || return && $SHA1SUM < "$new_po" > "$cksum_file"
fi fi
done done
} }
@@ -824,9 +740,9 @@ symlink_to_dir()
# Leave any existing symlink alone, if it already points to the source, # Leave any existing symlink alone, if it already points to the source,
# so that broken build tools that care about symlink times # so that broken build tools that care about symlink times
# aren't confused into doing unnecessary builds. Conversely, if the # aren't confused into doing unnecessary builds. Conversely, if the
# existing symlink's timestamp is older than the source, make it afresh, # existing symlink's time stamp is older than the source, make it afresh,
# so that broken tools aren't confused into skipping needed builds. See # so that broken tools aren't confused into skipping needed builds. See
# <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00326.html>. # <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00326.html>.
test -h "$dst" && test -h "$dst" &&
src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 && src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 && dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
@@ -932,33 +848,31 @@ fi
# Import from gnulib. # Import from gnulib.
if $use_gnulib; then gnulib_tool_options="\
gnulib_tool_options="\ --import\
--no-changelog\ --no-changelog\
--aux-dir=$build_aux\ --aux-dir $build_aux\
--doc-base=$doc_base\ --doc-base $doc_base\
--lib=$gnulib_name\ --lib $gnulib_name\
--m4-base=$m4_base/\ --m4-base $m4_base/\
--source-base=$source_base/\ --source-base $source_base/\
--tests-base=$tests_base\ --tests-base $tests_base\
--local-dir=$local_gl_dir\ --local-dir $local_gl_dir\
$gnulib_tool_option_extras\ $gnulib_tool_option_extras\
" "
if test $use_libtool = 1; then if test $use_libtool = 1; then
case "$gnulib_tool_options " in case "$gnulib_tool_options " in
*' --libtool '*) ;; *' --libtool '*) ;;
*) gnulib_tool_options="$gnulib_tool_options --libtool" ;; *) gnulib_tool_options="$gnulib_tool_options --libtool" ;;
esac esac
fi
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
$gnulib_tool $gnulib_tool_options --import $gnulib_modules \
|| die "gnulib-tool failed"
for file in $gnulib_files; do
symlink_to_dir "$GNULIB_SRCDIR" $file \
|| die "failed to symlink $file"
done
fi fi
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
for file in $gnulib_files; do
symlink_to_dir "$GNULIB_SRCDIR" $file \
|| die "failed to symlink $file"
done
bootstrap_post_import_hook \ bootstrap_post_import_hook \
|| die "bootstrap_post_import_hook failed" || die "bootstrap_post_import_hook failed"
@@ -975,21 +889,20 @@ find "$m4_base" "$source_base" \
-depth \( -name '*.m4' -o -name '*.[ch]' \) \ -depth \( -name '*.m4' -o -name '*.[ch]' \) \
-type l -xtype l -delete > /dev/null 2>&1 -type l -xtype l -delete > /dev/null 2>&1
# Invoke autoreconf with --force --install to ensure upgrades of tools
# such as ylwrap.
AUTORECONFFLAGS="--verbose --install --force -I $m4_base $ACLOCAL_FLAGS"
# Some systems (RHEL 5) are using ancient autotools, for which the # Some systems (RHEL 5) are using ancient autotools, for which the
# --no-recursive option had not been invented. Detect that lack and # --no-recursive option had not been invented. Detect that lack and
# omit the option when it's not supported. FIXME in 2017: remove this # omit the option when it's not supported. FIXME in 2017: remove this
# hack when RHEL 5 autotools are updated, or when they become irrelevant. # hack when RHEL 5 autotools are updated, or when they become irrelevant.
no_recursive=
case $($AUTORECONF --help) in case $($AUTORECONF --help) in
*--no-recursive*) AUTORECONFFLAGS="$AUTORECONFFLAGS --no-recursive";; *--no-recursive*) no_recursive=--no-recursive;;
esac esac
# Tell autoreconf not to invoke autopoint or libtoolize; they were run above. # Tell autoreconf not to invoke autopoint or libtoolize; they were run above.
echo "running: AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS" echo "running: AUTOPOINT=true LIBTOOLIZE=true " \
AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS \ "$AUTORECONF --verbose --install $no_recursive -I $m4_base $ACLOCAL_FLAGS"
AUTOPOINT=true LIBTOOLIZE=true \
$AUTORECONF --verbose --install $no_recursive -I $m4_base $ACLOCAL_FLAGS \
|| die "autoreconf failed" || die "autoreconf failed"
# Get some extra files from gnulib, overriding existing files. # Get some extra files from gnulib, overriding existing files.
@@ -1055,9 +968,9 @@ bootstrap_epilogue
echo "$0: done. Now you can run './configure'." echo "$0: done. Now you can run './configure'."
# Local variables: # Local variables:
# eval: (add-hook 'before-save-hook 'time-stamp) # eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion=" # time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC0" # time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC" # time-stamp-end: "; # UTC"
# End: # End:
+10 -17
View File
@@ -1,6 +1,6 @@
# Bootstrap configuration. # Bootstrap configuration.
# Copyright (C) 2006-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2006-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -17,27 +17,19 @@
# gnulib modules used by this package. # gnulib modules used by this package.
gnulib_modules=' gnulib_modules='
argmatch assert argmatch assert calloc-posix close closeout config-h c-strcase
calloc-posix close closeout config-h c-strcase
configmake configmake
dirname dirname
error extensions fdl fopen-safer error extensions fdl fopen-safer getopt-gnu
getopt-gnu
gettext git-version-gen gitlog-to-changelog gettext git-version-gen gitlog-to-changelog
gpl-3.0 hash inttypes isnan javacomp-script gpl-3.0 hash inttypes isnan javacomp-script
javaexec-script ldexpl malloc-gnu javaexec-script ldexpl malloc-gnu
mbswidth mbswidth obstack perror progname
non-recursive-gnulib-prefix-hack
obstack
obstack-printf
perror progname
quote quotearg quote quotearg
readme-release readme-release
realloc-posix realloc-posix
spawn-pipe stdbool stpcpy strdup-posix strerror strverscmp spawn-pipe stdbool stpcpy strdup-posix strerror strtoul strverscmp
timevar unistd unistd-safer unlocked-io update-copyright unsetenv verify
unistd unistd-safer unlink unlocked-io
update-copyright unsetenv verify
warnings warnings
xalloc xalloc
xalloc-die xalloc-die
@@ -53,8 +45,9 @@ gnulib_modules='
XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
--from-code=UTF-8\\\ --from-code=UTF-8\\\
--flag=asprintf:2:c-format\\\ --flag=asprintf:2:c-format\\\
--flag=complain:3:c-format\\\ --flag=complain:2:c-format\\\
--flag=complain_indent:4:c-format\\\ --flag=complain_at:3:c-format\\\
--flag=complain_at_indent:4:c-format\\\
--flag=unexpected_end:2:c-format\\\ --flag=unexpected_end:2:c-format\\\
' '
XGETTEXT_OPTIONS_RUNTIME=$XGETTEXT_OPTIONS'\\\ XGETTEXT_OPTIONS_RUNTIME=$XGETTEXT_OPTIONS'\\\
@@ -83,7 +76,7 @@ gnulib_tool_option_extras='--symlink --makefile-name=gnulib.mk'
bootstrap_post_import_hook() bootstrap_post_import_hook()
{ {
# Massage lib/gnulib.mk before using it later in the bootstrapping process. # Massage lib/gnulib.mk before using it later in the bootstrapping process.
build-aux/prefix-gnulib-mk --lib-name="$gnulib_name" "lib/$gnulib_mk" etc/prefix-gnulib-mk --lib-name=$gnulib_name lib/$gnulib_mk
# Ensure that ChangeLog exists, for automake. # Ensure that ChangeLog exists, for automake.
test -f ChangeLog || touch ChangeLog test -f ChangeLog || touch ChangeLog
+4 -1
View File
@@ -1,4 +1,6 @@
/announce-gen /announce-gen
/arg-nonnull.h
/c++defs.h
/compile /compile
/config.guess /config.guess
/config.rpath /config.rpath
@@ -14,12 +16,13 @@
/install-sh /install-sh
/javacomp.sh.in /javacomp.sh.in
/javaexec.sh.in /javaexec.sh.in
/link-warning.h
/mdate-sh /mdate-sh
/missing /missing
/prefix-gnulib-mk
/test-driver /test-driver
/texinfo.tex /texinfo.tex
/update-copyright /update-copyright
/useless-if-before-free /useless-if-before-free
/vc-list-files /vc-list-files
/warn-on-use.h
/ylwrap /ylwrap
-61
View File
@@ -1,61 +0,0 @@
# Copyright (C) 2012-2015, 2018 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/>.
# Valgrind suppression file for Bison.
# Travis Trusty, 2018-09-07.
{
libstdcxx_init
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
obj:/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
fun:call_init.part.0
fun:call_init
fun:_dl_init
obj:/lib/x86_64-linux-gnu/ld-2.19.so
}
# Linux prague 4.1.2-2-ARCH #1 SMP PREEMPT Wed Jul 15 08:30:32 UTC 2015
# x86_64 GNU/Linux
{
Probably exception handling from G++ 5.1.
Memcheck:Leak
match-leak-kinds: reachable
fun:malloc
fun:pool
fun:__static_initialization_and_destruction_0
fun:_GLOBAL__sub_I_eh_alloc.cc
fun:call_init.part.0
fun:_dl_init
obj:/usr/lib/ld-2.21.so
}
# Linux seattle 2.6.32-5-amd64 #1 SMP Thu Mar 22 17:26:33 UTC 2012
# x86_64 GNU/Linux
{
index
Memcheck:Cond
fun:index
fun:expand_dynamic_string_token
fun:_dl_map_object
fun:map_doit
fun:_dl_catch_error
fun:do_preload
fun:dl_main
fun:_dl_sysdep_start
fun:_dl_start
obj:/lib/ld-2.11.3.so
}
+1 -1
View File
@@ -35,7 +35,7 @@ while (<STDIN>)
$arg =~ s/^=//; $arg =~ s/^=//;
$arg = lc ($arg); $arg = lc ($arg);
my $dir_arg = $arg; my $dir_arg = $arg;
# If the argument is complete (e.g., for --define[=NAME[=VALUE]]), # If the argument is compite (e.g., for --define[=NAME[=VALUE]]),
# put each word in @var, to build @var{name}[=@var{value}], not # put each word in @var, to build @var{name}[=@var{value}], not
# @var{name[=value]}]. # @var{name[=value]}].
$arg =~ s/(\w+)/\@var{$1}/g; $arg =~ s/(\w+)/\@var{$1}/g;
@@ -1,4 +1,4 @@
# Copyright (C) 2012-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
-8
View File
@@ -1,11 +1,3 @@
# This file is expected to be used via gitlog-to-changelog's --amend=FILE # This file is expected to be used via gitlog-to-changelog's --amend=FILE
# option. It specifies what changes to make to each given SHA1's commit # option. It specifies what changes to make to each given SHA1's commit
# log and metadata, using Perl-eval'able expressions. # log and metadata, using Perl-eval'able expressions.
975bb564319aa4f4204c48aba265757ba207a80f
s/Edligner/Edlinger/;
0db2648930e3b6c376a539aabe368aade83ee29a
s/--flags/--feature/;
s/flag_flag/feature_flag/;
s/\bflag\b/feature/;
-234
View File
@@ -1,234 +0,0 @@
#!/bin/sh
# Install Intel Parallel Studio on Travis CI
# https://github.com/nemequ/icc-travis
#
# Originally written for Squash <https://github.com/quixdb/squash> by
# Evan Nemerson. For documentation, bug reports, support requests,
# etc. please use <https://github.com/nemequ/icc-travis>.
#
# To the extent possible under law, the author(s) of this script have
# waived all copyright and related or neighboring rights to this work.
# See <https://creativecommons.org/publicdomain/zero/1.0/> for
# details.
# Tools - Not very useful in non-interactive mode.
COMPONENTS_VTUNE="intel-vtune-amplifier-xe-2016-cli__x86_64;intel-vtune-amplifier-xe-2016-common__noarch;intel-vtune-amplifier-xe-2016-cli-common__noarch;intel-vtune-amplifier-xe-2016-collector-64linux__x86_64;intel-vtune-amplifier-xe-2016-sep__noarch;intel-vtune-amplifier-xe-2016-gui-common__noarch;intel-vtune-amplifier-xe-2016-gui__x86_64;intel-vtune-amplifier-xe-2016-common-pset__noarch"
COMPONENTS_INSPECTOR="intel-inspector-xe-2016-cli__x86_64;intel-inspector-xe-2016-cli-common__noarch;intel-inspector-xe-2016-gui-common__noarch;intel-inspector-xe-2016-gui__x86_64;intel-inspector-xe-2016-cli-pset__noarch"
COMPONENTS_ADVISOR="intel-advisor-xe-2016-cli__x86_64;intel-advisor-xe-2016-cli-common__noarch;intel-advisor-xe-2016-gui-common__noarch;intel-advisor-xe-2016-gui__x86_64;intel-advisor-xe-2016-cli-pset__noarch"
COMPONENTS_GDB="intel-gdb-gt__x86_64;intel-gdb-gt-src__noarch;intel-gdb-gt-libelfdwarf__x86_64;intel-gdb-gt-devel__x86_64;intel-gdb-gt-common__noarch;intel-gdb-ps-cdt__x86_64;intel-gdb-ps-cdt-source__x86_64;intel-gdb-ps-mic__x86_64;intel-gdb-ps-mpm__x86_64;intel-gdb__x86_64;intel-gdb-source__noarch;intel-gdb-python-source__noarch;intel-gdb-common__noarch;intel-gdb-ps-common__noarch"
# Parallel libraries
COMPONENTS_MPI="intel-mpi-rt-core__x86_64;intel-mpi-rt-mic__x86_64;intel-mpi-sdk-core__x86_64;intel-mpi-sdk-mic__x86_64;intel-mpi-psxe__x86_64;intel-mpi-rt-psxe__x86_64"
COMPONENTS_TBB="intel-tbb-libs__noarch;intel-mkl-ps-tbb__x86_64;intel-mkl-ps-tbb-devel__x86_64;intel-mkl-ps-tbb-mic__x86_64;intel-mkl-ps-tbb-mic-devel__x86_64;intel-tbb-source__noarch;intel-tbb-devel__noarch;intel-tbb-common__noarch;intel-tbb-ps-common__noarch;intel-tbb-psxe__noarch"
COMPONENTS_MKL="intel-mkl__x86_64;intel-mkl-ps__x86_64;intel-mkl-common__noarch;intel-mkl-ps-common__noarch;intel-mkl-devel__x86_64;intel-mkl-ps-mic-devel__x86_64;intel-mkl-ps-f95-devel__x86_64;intel-mkl-gnu-devel__x86_64;intel-mkl-ps-gnu-devel__x86_64;intel-mkl-ps-pgi-devel__x86_64;intel-mkl-sp2dp-devel__x86_64;intel-mkl-ps-cluster-devel__x86_64;intel-mkl-ps-cluster-common__noarch;intel-mkl-ps-f95-common__noarch;intel-mkl-ps-cluster__x86_64;intel-mkl-gnu__x86_64;intel-mkl-ps-gnu__x86_64;intel-mkl-ps-pgi__x86_64;intel-mkl-sp2dp__x86_64;intel-mkl-ps-mic__x86_64;intel-mkl-ps-tbb__x86_64;intel-mkl-ps-tbb-devel__x86_64;intel-mkl-ps-tbb-mic__x86_64;intel-mkl-ps-tbb-mic-devel__x86_64;intel-mkl-psxe__noarch"
COMPONENTS_IPP="intel-ipp-l-common__noarch;intel-ipp-l-ps-common__noarch;intel-ipp-l-st__x86_64;intel-ipp-l-mt__x86_64;intel-ipp-l-st-devel__x86_64;intel-ipp-l-ps-st-devel__x86_64;intel-ipp-l-mt-devel__x86_64;intel-ipp-psxe__noarch"
COMPONENTS_IPP_CRYPTO="intel-crypto-ipp-st-devel__x86_64;intel-crypto-ipp-ps-st-devel__x86_64;intel-crypto-ipp-st__x86_64;intel-crypto-ipp-mt-devel__x86_64;intel-crypto-ipp-mt__x86_64;intel-crypto-ipp-ss-st-devel__x86_64;intel-crypto-ipp-common__noarch"
COMPONENTS_DAAL="intel-daal__x86_64;intel-daal-common__noarch"
# Compilers
COMPONENTS_OPENMP="intel-openmp-l-all__x86_64;intel-openmp-l-ps-mic__x86_64;intel-openmp-l-ps__x86_64;intel-openmp-l-ps-ss__x86_64;intel-openmp-l-all-devel__x86_64;intel-openmp-l-ps-mic-devel__x86_64;intel-openmp-l-ps-devel__x86_64;intel-openmp-l-ps-ss-devel__x86_64"
COMPONENTS_COMPILER_COMMON="intel-comp-l-all-vars__noarch;intel-comp-l-all-common;intel-comp-l-ps-common;intel-comp-l-all-devel;intel-comp-l-ps-ss-devel;intel-comp-l-ps-ss-wrapper;intel-comp-l-all-devel;intel-comp-l-ps-devel__x86_64;intel-comp-l-ps-ss-devel__x86_64;intel-psf-intel__x86_64;intel-icsxe-pset;intel-ipsf__noarch;intel-ccompxe__noarch;${COMPONENTS_OPENMP}"
COMPONENTS_IFORT="intel-ifort-l-ps__x86_64;intel-ifort-l-ps-vars__noarch;intel-ifort-l-ps-common__noarch;intel-ifort-l-ps-devel__x86_64;${COMPONENTS_COMPILER_COMMON}"
COMPONENTS_ICC="intel-icc-l-all__x86_64;intel-icc-l-ps-ss__x86_64;intel-icc-l-all-vars__noarch;intel-icc-l-all-common__noarch;intel-icc-l-ps-common__noarch;intel-icc-l-all-devel__x86_64;intel-icc-l-ps-devel__x86_64;intel-icc-l-ps-ss-devel__x86_64;${COMPONENTS_COMPILER_COMMON}"
DESTINATION="${HOME}/intel"
TEMPORARY_FILES="/tmp"
PHONE_INTEL="no"
COMPONENTS=""
add_components() {
if [ ! -z "${COMPONENTS}" ]; then
COMPONENTS="${COMPONENTS};$1"
else
COMPONENTS="$1"
fi
}
while [ $# != 0 ]; do
case "$1" in
"--dest")
DESTINATION="$(realpath "$2")"; shift
;;
"--tmpdir")
TEMPORARY_FILES="$2"; shift
;;
"--components")
shift
OLD_IFS="${IFS}"
IFS=","
for component in $1; do
case "$component" in
"icc")
add_components "${COMPONENTS_ICC}"
;;
"mpi")
add_components "${COMPONENTS_MPI}"
;;
"vtune")
add_components "${COMPONENTS_VTUNE}"
;;
"inspector")
add_components "${COMPONENTS_INSPECTOR}"
;;
"advisor")
add_components "${COMPONENTS_ADVISOR}"
;;
"tbb")
add_components "${COMPONENTS_TBB}"
;;
"ifort")
add_components "${COMPONENTS_IFORT}"
;;
"mkl")
add_components "${COMPONENTS_MKL}"
;;
"openmp")
# Noop, here for compatability. OpenMP is installed with icc and ifort now.
;;
"ipp")
add_components "${COMPONENTS_IPP}"
;;
"ipp-crypto")
add_components "${COMPONENTS_IPP_CRYPTO}"
;;
"gdb")
add_components "${COMPONENTS_GDB}"
;;
"daal")
add_components "${COMPONENTS_DAAL}"
;;
*)
echo "Unknown component '$component'"
exit 1
;;
esac
done
IFS="${OLD_IFS}"
;;
*)
echo "Unrecognized argument '$1'"
exit 1
;;
esac
shift
done
if [ -z "${COMPONENTS}" ]; then
COMPONENTS="${COMPONENTS_ICC}"
fi
INSTALLER_SCRIPT="parallel_studio_xe_2016_update3_online.sh"
INSTALLER="${TEMPORARY_FILES}/${INSTALLER_SCRIPT}"
INSTALLER_URL="http://registrationcenter-download.intel.com/akdlm/irc_nas/9061/${INSTALLER_SCRIPT}"
SILENT_CFG="${TEMPORARY_FILES}/silent.cfg"
SUCCESS_INDICATOR="${TEMPORARY_FILES}/icc-travis-success"
if [ ! -e "${TEMPORARY_FILES}" ]; then
echo "${TEMPORARY_FILES} does not exist, creating..."
mkdir -p "${TEMPORARY_FILES}" || (sudo mkdir -p "${TEMPORARY_FILES}" && sudo chown -R "${USER}:${USER}" "${TEMPORARY_FILES}")
fi
if [ ! -e "${DESTINATION}" ]; then
echo "${DESTINATION} does not exist, creating..."
mkdir -p "${DESTINATION}" || (sudo mkdir -p "${DESTINATION}" && sudo chown -R "${USER}:${USER}" "${DESTINATION}")
fi
if [ ! -e "${INSTALLER}" ]; then
wget -O "${INSTALLER}" "${INSTALLER_URL}" || exit 1
fi
chmod u+x "${INSTALLER}"
# See https://software.intel.com/en-us/articles/intel-composer-xe-2015-silent-installation-guide
echo "# Generated silent configuration file" > "${SILENT_CFG}"
echo "ACCEPT_EULA=accept" >> "${SILENT_CFG}"
echo "INSTALL_MODE=NONRPM" >> "${SILENT_CFG}"
echo "CONTINUE_WITH_OPTIONAL_ERROR=yes" >> "${SILENT_CFG}"
echo "PSET_INSTALL_DIR=${DESTINATION}" >> "${SILENT_CFG}"
echo "CONTINUE_WITH_INSTALLDIR_OVERWRITE=yes" >> "${SILENT_CFG}"
echo "COMPONENTS=${COMPONENTS}" >> "${SILENT_CFG}"
echo "PSET_MODE=install" >> "${SILENT_CFG}"
echo "PHONEHOME_SEND_USAGE_DATA=${PHONE_INTEL}" >> "${SILENT_CFG}"
if [ "x" != "x${INTEL_SERIAL_NUMBER}" ]; then
echo "ACTIVATION_SERIAL_NUMBER=${INTEL_SERIAL_NUMBER}" >> "${SILENT_CFG}"
echo "ACTIVATION_TYPE=serial_number" >> "${SILENT_CFG}"
else
echo "ACTIVATION_TYPE=trial_lic" >> "${SILENT_CFG}"
fi
attempt=1;
while [ $attempt -le 3 ]; do
if [ ! -e "${TEMPORARY_FILES}/parallel-studio-install-data" ]; then
mkdir -p "${TEMPORARY_FILES}/parallel-studio-install-data" || (sudo mkdir -p "${TEMPORARY_FILES}/parallel-studio-install-data" && sudo chown -R "${USER}:${USER}" "${TEMPORARY_FILES}")
fi
("${INSTALLER}" \
-t "${TEMPORARY_FILES}/parallel-studio-install-data" \
-s "${SILENT_CFG}" \
--cli-mode \
--user-mode && \
touch "${SUCCESS_INDICATOR}") &
# So Travis doesn't die in case of a long download/installation.
#
# NOTE: a watched script never terminates.
elapsed=0;
while kill -0 $! 2>/dev/null; do
sleep 1
elapsed=$(expr $elapsed + 1)
if [ $(expr $elapsed % 60) -eq 0 ]; then
mins_elapsed=$(expr $elapsed / 60)
if [ $mins_elapsed = 1 ]; then
minute_string="minute"
else
minute_string="minutes"
fi
echo "Still running... (about $(expr $elapsed / 60) ${minute_string} so far)."
fi
done
if [ ! -e "${SUCCESS_INDICATOR}" ]; then
echo "Installation failed."
exit 1
fi
if [ ! -e "${DESTINATION}/bin/compilervars.sh" ]; then
# Sometimes the installer returns successfully without actually
# installing anything. Let's try again…
echo "Installation attempt #${attempt} completed, but unable to find compilervars.sh."
find "${DESTINATION}"
else
break
fi
rm -vrf "${TEMPORARY_FILES}/parallel-studio-install-data"
echo "Trying again..."
attempt=$(expr $attempt + 1)
done
if [ ! -e "${DESTINATION}/bin/compilervars.sh" ]; then
echo "Installation failed."
exit 1
fi
# Apparently the installer drops the license file in a location it
# doesn't know to check.
ln -s "${DESTINATION}"/licenses ~/Licenses
# Add configuration information to ~/.bashrc. Unfortunately this will
# not be picked up automatically by Travis, so you'll still need to
# source ~/.bashrc in your .travis.yml
#
# Container-based builds include a `[ -z "$PS1" ] && return` near the
# beginning of the file, so appending won't work, we'll need to
# prepend.
echo "export INTEL_INSTALL_PATH=\"${DESTINATION}\"" >> ~/.bashrc-intel
echo ". \"\${INTEL_INSTALL_PATH}/bin/compilervars.sh\" intel64" >> ~/.bashrc-intel
echo "export LD_LIBRARY_PATH=\"\${INTEL_INSTALL_PATH}/ism/bin/intel64:\${INTEL_INSTALL_PATH}/lib/intel64_lin:\$LD_LIBRARY_PATH\"" >> ~/.bashrc-intel
echo "export PATH=\"\${INTEL_INSTALL_PATH}/bin:\$PATH\"" >> ~/.bashrc-intel
echo "function uninstall_intel_software {" >> ~/.bashrc-intel
echo " find \"\${INTEL_INSTALL_PATH}\" -name 'uninstall.sh' -not -path '*/ism/uninstall.sh' -exec {} -s \;" >> ~/.bashrc-intel
echo "}" >> ~/.bashrc-intel
cat ~/.bashrc >> ~/.bashrc-intel
mv ~/.bashrc-intel ~/.bashrc
+21 -20
View File
@@ -1,22 +1,23 @@
## Copyright (C) 2000-2015, 2018 Free Software Foundation, Inc. ## Makefile for Bison testsuite.
##
## 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/>.
EXTRA_DIST += \ # Copyright (C) 2000-2012 Free Software Foundation, Inc.
build-aux/Darwin.valgrind \ #
build-aux/Linux.valgrind \ # This program is free software: you can redistribute it and/or modify
build-aux/cross-options.pl \ # it under the terms of the GNU General Public License as published by
build-aux/move-if-change \ # the Free Software Foundation, either version 3 of the License, or
build-aux/prev-version.txt \ # (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/>.
EXTRA_DIST += \
build-aux/cross-options.pl \
build-aux/darwin11.4.0.valgrind \
build-aux/move-if-change \
build-aux/prev-version.txt \
build-aux/update-b4-copyright build-aux/update-b4-copyright
+4
View File
@@ -0,0 +1,4 @@
/_Noreturn.h
/arg-nonnull.h
/c++defs.h
/warn-on-use.h
+1 -1
View File
@@ -3,7 +3,7 @@
# Update b4_copyright invocations or b4_copyright_years definitions to # Update b4_copyright invocations or b4_copyright_years definitions to
# include the current year. # include the current year.
# Copyright (C) 2009-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2009-2012 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -2,7 +2,7 @@
# In configure.ac, update PACKAGE_COPYRIGHT_YEAR to the current year. # In configure.ac, update PACKAGE_COPYRIGHT_YEAR to the current year.
# Copyright (C) 2010-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2010-2012 Free Software Foundation, Inc.
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+29 -135
View File
@@ -1,18 +1,18 @@
## Customize maint.mk -*- makefile -*- # Customize maint.mk -*- makefile -*-
## Copyright (C) 2008-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2008-2012 Free Software Foundation, Inc.
## This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version. # (at your option) any later version.
## This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details. # GNU General Public License for more details.
## 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/>.
# Update version, then recompile so that tests/bison --version be # Update version, then recompile so that tests/bison --version be
# up-to-date, then compile our parser again with our up-to-date bison. # up-to-date, then compile our parser again with our up-to-date bison.
@@ -24,17 +24,16 @@ regen: _version
# Used in maint.mk's web-manual rule # Used in maint.mk's web-manual rule
manual_title = The Yacc-compatible Parser Generator manual_title = The Yacc-compatible Parser Generator
gendocs_options_ = -I $(abs_top_srcdir)/doc -I $(abs_top_builddir)/doc
# It's useful to run maintainer-check* targets during development, but we # It's useful to run maintainer-*check* targets during development, but we
# don't want to wait on a recompile because of an update to $(VERSION). Thus, # don't want to wait on a recompile because of an update to $(VERSION). Thus,
# override the _is-dist-target from GNUmakefile so that maintainer-check* # override the _is-dist-target from GNUmakefile so that maintainer-*check*
# targets are filtered out. # targets are filtered out.
_is-dist-target = $(filter-out %clean maintainer-check%, \ _is-dist-target = $(filter-out %clean maintainer-check% maintainer-%-check, \
$(filter maintainer-% dist% alpha beta major,$(MAKECMDGOALS))) $(filter maintainer-% dist% alpha beta major,$(MAKECMDGOALS)))
url_dir_list = \ url_dir_list = \
https://$(gnu_rel_host)/gnu/bison ftp://$(gnu_rel_host)/gnu/bison
# Tests not to run as part of "make distcheck". # Tests not to run as part of "make distcheck".
local-checks-to-skip = \ local-checks-to-skip = \
@@ -55,124 +54,19 @@ update-copyright: update-b4-copyright update-package-copyright-year
update-copyright-env = \ update-copyright-env = \
UPDATE_COPYRIGHT_FORCE=1 UPDATE_COPYRIGHT_USE_INTERVALS=1 UPDATE_COPYRIGHT_FORCE=1 UPDATE_COPYRIGHT_USE_INTERVALS=1
## -------------------- ##
## More syntax-checks. ##
## -------------------- ##
# At least for Mac OS X's grep, the order between . and [ in "[^.[]"
# matters:
# $ LC_ALL=fr_FR grep -nE '[^[.]' /dev/null
# $ LC_ALL=C grep -nE '[^[.]' /dev/null
# grep: invalid collating element or class
# $ LC_ALL=fr_FR grep -nE '[^.[]' /dev/null
# $ LC_ALL=C grep -nE '[^.[]' /dev/null
sc_at_parser_check:
@prohibit='AT_PARSER_CHECK\(\[+[^.[]|AT_CHECK\(\[+\./' \
halt='use AT_PARSER_CHECK for and only for generated parsers' \
$(_sc_search_regexp)
# Indent only with spaces.
# Taken from Coreutils.
sc_prohibit_tab_based_indentation:
@prohibit='^ * ' \
halt='TAB in indentation; use only spaces' \
$(_sc_search_regexp)
# Prohibit the use of `...` in tests/. Use $(...) instead.
# Taken from Coreutils.
# Not ready for Bison yet.
#sc_prohibit_test_backticks:
# @prohibit='`' in_vc_files='^tests/' \
# halt='use $$(...), not `...` in tests/' \
# $(_sc_search_regexp)
# Enforce recommended preprocessor indentation style.
# Taken from Coreutils.
sc_preprocessor_indentation:
@if cppi --version >/dev/null 2>&1; then \
$(VC_LIST_EXCEPT) | grep '\.[ch]$$' | xargs cppi -a -c \
|| { echo '$(ME): incorrect preprocessor indentation' 1>&2; \
exit 1; }; \
else \
echo '$(ME): skipping test $@: cppi not installed' 1>&2; \
fi
###########################################################
# Taken from Coreutils.
_p0 = \([^"'/]\|"\([^\"]\|[\].\)*"\|'\([^\']\|[\].\)*'
_pre = $(_p0)\|[/][^"'/*]\|[/]"\([^\"]\|[\].\)*"\|[/]'\([^\']\|[\].\)*'\)*
_pre_anchored = ^\($(_pre)\)
_comment_and_close = [^*]\|[*][^/*]\)*[*][*]*/
# help font-lock mode: '
# A sed expression that removes ANSI C and ISO C99 comments.
# Derived from the one in GNU gettext's 'moopp' preprocessor.
_sed_remove_comments = \
/[/][/*]/{ \
ta; \
:a; \
s,$(_pre_anchored)//.*,\1,; \
te; \
s,$(_pre_anchored)/[*]\($(_comment_and_close),\1 ,; \
ta; \
/^$(_pre)[/][*]/{ \
s,$(_pre_anchored)/[*].*,\1 ,; \
tu; \
:u; \
n; \
s,^\($(_comment_and_close),,; \
tv; \
s,^.*$$,,; \
bu; \
:v; \
}; \
:e; \
}
# Quote all single quotes.
_sed_rm_comments_q = $(subst ','\'',$(_sed_remove_comments))
# help font-lock mode: '
_space_before_paren_exempt =? \\n\\$$
_space_before_paren_exempt = \
(^ *\#|(LA)?LR\([01]\)|percent_(code|define)|b4_syncline|m4_(define|init)|symbol)
# Ensure that there is a space before each open parenthesis in C code.
sc_space_before_open_paren:
@if $(VC_LIST_EXCEPT) | grep -l '\.[ch]$$' > /dev/null; then \
fail=0; \
for c in $$($(VC_LIST_EXCEPT) | grep '\.[ch]$$'); do \
sed '$(_sed_rm_comments_q)' $$c 2>/dev/null \
| grep -i '[[:alnum:]](' \
| grep -vE '$(_space_before_paren_exempt)' \
| grep . && { fail=1; echo "*** $$c"; }; \
done; \
test $$fail = 1 && \
{ echo '$(ME): the above files lack a space-before-open-paren' \
1>&2; exit 1; } || :; \
else :; \
fi
## -------------------------- ##
## syntax-checks exceptions. ##
## -------------------------- ##
exclude = \ exclude = \
$(foreach a,$(1),$(eval $(subst $$,$$$$,exclude_file_name_regexp--sc_$(a)))) $(foreach a,$(1),$(eval $(subst $$,$$$$,exclude_file_name_regexp--sc_$(a))))
$(call exclude, \ $(call exclude, \
bindtextdomain=^lib/main.c$$ \ bindtextdomain=^lib/main.c$$ \
preprocessor_indentation=^data/|^lib/|^src/parse-gram.[ch]$$ \ program_name=^lib/main.c$$ \
program_name=^lib/main.c$$ \ prohibit_always-defined_macros=^data/yacc.c|^djgpp/ \
prohibit_always-defined_macros=^data/yacc.c$$|^djgpp/ \ prohibit_always-defined_macros+=?|^lib/timevar.c$$ \
prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$ \ prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$ \
prohibit_always-defined_macros+=?|^tests/regression.at$$ \ prohibit_always-defined_macros+=?|^tests/regression.at$$ \
prohibit_always_true_header_tests=^djgpp/subpipe.h$$ \ prohibit_defined_have_decl_tests=?|^lib/timevar.c$$ \
prohibit_doubled_word=^tests/named-refs.at$$ \ prohibit_empty_lines_at_EOF=^src/parse-gram.h$$ \
prohibit_magic_number_exit=^doc/bison.texi$$ \ prohibit_strcmp=^doc/bison\.texi$$ \
prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$ \ require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$ \
prohibit_strcmp=^doc/bison\.texi|tests/local\.at$$ \ space_tab=^tests/(input|c\+\+)\.at$$ \
prohibit_tab_based_indentation=install-icc.sh|\.(am|mk)$$|^djgpp/|^\.git|Makefile$$ \ unmarked_diagnostics=^(djgpp/|doc/bison.texi$$) \
require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$ \
space_before_open_paren=^(data/|djgpp/) \
two_space_separator_in_usage=^(bootstrap|build-aux/install-icc.sh) \
unmarked_diagnostics=^(djgpp/|doc/bison.texi$$|tests/c\+\+\.at$$) \
) )
+48 -117
View File
@@ -1,6 +1,6 @@
# Configure template for GNU Bison. -*-Autoconf-*- # Configure template for GNU Bison. -*-Autoconf-*-
# #
# Copyright (C) 2001-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2001-2012 Free Software Foundation, Inc.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -18,23 +18,26 @@
# In order for some versions of Sun Studio to compile our C++ test cases # In order for some versions of Sun Studio to compile our C++ test cases
# correctly, we need Autoconf 2.64 or better to handle the restrict # correctly, we need Autoconf 2.64 or better to handle the restrict
# keyword in at least string.h from gnulib. We need Autoconf 2.68 or # keyword in at least string.h from gnulib. We need Autoconf 2.68 or
# better to avoid a typo in the 'configure --help' entry for the YACC # better to avoid a typo in the `configure --help' entry for the YACC
# environment variable. # environment variable.
AC_PREREQ([2.68]) AC_PREREQ([2.68])
m4_pattern_forbid([^_?(gl_[A-Z]|AX_|BISON_)]) m4_pattern_forbid([^gl_[A-Z]])
m4_pattern_allow([^BISON_USE_NLS$])
AC_INIT([GNU Bison], AC_INIT([GNU Bison],
m4_esyscmd([build-aux/git-version-gen .tarball-version]), m4_esyscmd([build-aux/git-version-gen .tarball-version]),
[[email protected]]) [[email protected]])
AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2018]) AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2012])
AC_DEFINE_UNQUOTED([PACKAGE_COPYRIGHT_YEAR], [$PACKAGE_COPYRIGHT_YEAR], AC_DEFINE_UNQUOTED([PACKAGE_COPYRIGHT_YEAR], [$PACKAGE_COPYRIGHT_YEAR],
[The copyright year for this package]) [The copyright year for this package])
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
# We use Automake 1.14's %D% and %C%. # Automake 1.10.3 and 1.11.1 fix a security flaw discussed here:
#
# http://thread.gmane.org/gmane.comp.sysutils.autotools.announce/131
#
# To avoid 1.11, we make 1.11.1 the minimum version.
# #
# We want gnits strictness only when rolling a stable release. For # We want gnits strictness only when rolling a stable release. For
# release candidates, we use version strings like 2.4.3_rc1, but gnits # release candidates, we use version strings like 2.4.3_rc1, but gnits
@@ -42,7 +45,7 @@ AC_CONFIG_MACRO_DIR([m4])
# releases, we want to be able run make dist without being required to # releases, we want to be able run make dist without being required to
# add a bogus NEWS entry. In that case, the version string # add a bogus NEWS entry. In that case, the version string
# automatically contains a dash, which we also let disable gnits. # automatically contains a dash, which we also let disable gnits.
AM_INIT_AUTOMAKE([1.14 dist-xz nostdinc AM_INIT_AUTOMAKE([1.11.1 dist-xz nostdinc
color-tests parallel-tests color-tests parallel-tests
silent-rules] silent-rules]
m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]], m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]],
@@ -57,99 +60,32 @@ AC_PROG_CXX
# Gnulib (early checks). # Gnulib (early checks).
gl_EARLY gl_EARLY
# Gnulib uses '#pragma GCC diagnostic push' to silence some
# warnings, but older gcc doesn't support this.
AC_CACHE_CHECK([whether pragma GCC diagnostic push works],
[lv_cv_gcc_pragma_push_works], [
save_CFLAGS=$CFLAGS
CFLAGS='-Wunknown-pragmas -Werror'
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#pragma GCC diagnostic push
#pragma GCC diagnostic pop
]])],
[lv_cv_gcc_pragma_push_works=yes],
[lv_cv_gcc_pragma_push_works=no])
CFLAGS=$save_CFLAGS])
AC_LANG_PUSH([C++])
gl_WARN_ADD([-fno-exceptions], [NO_EXCEPTIONS_CXXFLAGS])
BISON_CXXSTD([98])
BISON_CXXSTD([03])
BISON_CXXSTD([11])
BISON_CXXSTD([14])
BISON_CXXSTD([17])
BISON_CXXSTD([2a])
AM_CONDITIONAL([ENABLE_CXX11], [test x"$CXX11_CXXFLAGS" != x])
AM_CONDITIONAL([ENABLE_CXX14], [test x"$CXX14_CXXFLAGS" != x])
AC_LANG_POP([C++])
AC_ARG_ENABLE([gcc-warnings], AC_ARG_ENABLE([gcc-warnings],
[ --enable-gcc-warnings turn on lots of GCC warnings (not recommended). [ --enable-gcc-warnings turn on lots of GCC warnings (not recommended)],
Also, issue synclines from the examples/ to
the corresponding source in the Texinfo doc.],
[case $enable_gcc_warnings in [case $enable_gcc_warnings in
yes|no) ;; yes|no) ;;
*) AC_MSG_ERROR([invalid value for --gcc-warnings: $enable_gcc_warnings]);; *) AC_MSG_ERROR([invalid value for --gcc-warnings: $enable_gcc_warnings]);;
esac], esac],
[enable_gcc_warnings=no]) [enable_gcc_warnings=no])
AM_CONDITIONAL([ENABLE_GCC_WARNINGS], [test "$enable_gcc_warnings" = yes])
if test "$enable_gcc_warnings" = yes; then if test "$enable_gcc_warnings" = yes; then
warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align
-fparse-all-comments -Wdocumentation -Wcast-qual -Wformat -Wpointer-arith -Wwrite-strings'
-Wformat -Wnull-dereference -Wpointer-arith -Wwrite-strings' warn_c='-Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes
warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes' -Wshadow -Wstrict-prototypes'
warn_cxx='-Wnoexcept' warn_cxx='-Wnoexcept'
# Warnings for the test suite only.
#
# -fno-color-diagnostics: Clang's use of colors in the error
# messages is confusing the tests looking at the compiler's output
# (e.g., synclines.at).
#
# -Wno-keyword-macro: We use the "#define private public" dirty
# trick in the test suite to check some private implementation
# details for lalr1.cc.
warn_tests='-Wundef -pedantic -Wconversion
-Wdeprecated -Wsign-compare -Wsign-conversion
-fno-color-diagnostics
-Wno-keyword-macro'
AC_LANG_PUSH([C]) AC_LANG_PUSH([C])
# Clang supports many of GCC's -W options, but only issues warnings
# on the ones it does not recognize. In that case, gl_WARN_ADD
# thinks the option is supported, and unknown options are then added
# to CFLAGS. But then, when -Werror is added in the test suite for
# instance, the warning about the unknown option turns into an
# error.
#
# This should be addressed by gnulib's gl_WARN_ADD, but in the
# meanwhile, turn warnings about unknown options into errors in
# CFLAGS, and restore CFLAGS after the tests.
save_CFLAGS=$CFLAGS
gl_WARN_ADD([-Werror=unknown-warning-option], [CFLAGS])
for i in $warn_common $warn_c; for i in $warn_common $warn_c;
do do
gl_WARN_ADD([$i], [WARN_CFLAGS]) gl_WARN_ADD([$i], [WARN_CFLAGS])
done done
gl_WARN_ADD([-Werror], [WERROR_CFLAGS]) gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
# Warnings for the test suite, and maybe for bison if GCC is modern
# enough.
gl_WARN_ADD([-Wmissing-declarations], [WARN_CFLAGS_TEST])
gl_WARN_ADD([-Wmissing-prototypes], [WARN_CFLAGS_TEST])
test $lv_cv_gcc_pragma_push_works = yes &&
AS_VAR_APPEND([WARN_CFLAGS], [" $WARN_CFLAGS_TEST"])
# Warnings for the test suite only. # Warnings for the test suite only.
for i in $warn_tests -Wincompatible-pointer-types; gl_WARN_ADD([-Wundef], [WARN_CFLAGS_TEST])
do gl_WARN_ADD([-pedantic], [WARN_CFLAGS_TEST])
gl_WARN_ADD([$i], [WARN_CFLAGS_TEST])
done
CFLAGS=$save_CFLAGS
AC_LANG_POP([C]) AC_LANG_POP([C])
AC_LANG_PUSH([C++]) AC_LANG_PUSH([C++])
save_CXXFLAGS=$CXXFLAGS
gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS])
for i in $warn_common $warn_cxx; for i in $warn_common $warn_cxx;
do do
gl_WARN_ADD([$i], [WARN_CXXFLAGS]) gl_WARN_ADD([$i], [WARN_CXXFLAGS])
@@ -158,39 +94,32 @@ if test "$enable_gcc_warnings" = yes; then
[AC_LANG_PROGRAM([], [nullptr])]) [AC_LANG_PROGRAM([], [nullptr])])
gl_WARN_ADD([-Werror], [WERROR_CXXFLAGS]) gl_WARN_ADD([-Werror], [WERROR_CXXFLAGS])
# Warnings for the test suite only. # Warnings for the test suite only.
for i in $warn_tests; gl_WARN_ADD([-Wundef], [WARN_CXXFLAGS_TEST])
do gl_WARN_ADD([-pedantic], [WARN_CXXFLAGS_TEST])
gl_WARN_ADD([$i], [WARN_CXXFLAGS_TEST])
done
# Too many compilers complain about Flex generated code.
gl_WARN_ADD([-Wno-error], [FLEX_SCANNER_CXXFLAGS])
# Clang++ deprecates compiling C.
gl_WARN_ADD([-Wno-deprecated], [WNO_DEPRECATED_CXXFLAGS])
CXXFLAGS=$save_CXXFLAGS
AC_LANG_POP([C++]) AC_LANG_POP([C++])
fi fi
BISON_TEST_FOR_WORKING_C_COMPILER BISON_TEST_FOR_WORKING_C_COMPILER
BISON_C_COMPILER_POSIXLY_CORRECT
BISON_TEST_FOR_WORKING_CXX_COMPILER BISON_TEST_FOR_WORKING_CXX_COMPILER
BISON_CXX_COMPILER_POSIXLY_CORRECT
AC_ARG_ENABLE([yacc], AC_ARG_ENABLE([yacc],
[AC_HELP_STRING([--disable-yacc], [AC_HELP_STRING([--disable-yacc],
[do not build a yacc command or an -ly library])], [do not build a yacc command or an -ly library])],
, [enable_yacc=yes]) , [enable_yacc=yes])
AM_CONDITIONAL([ENABLE_YACC], [test "$enable_yacc" = yes]) case $enable_yacc in
yes)
YACC_SCRIPT=src/yacc
YACC_LIBRARY=lib/liby.a;;
*)
YACC_SCRIPT=
YACC_LIBRARY=;;
esac
AC_SUBST([YACC_SCRIPT])
AC_SUBST([YACC_LIBRARY])
# Checks for programs. # Checks for programs.
AM_MISSING_PROG([DOT], [dot])
AC_PROG_LEX AC_PROG_LEX
$LEX_IS_FLEX || test "X$LEX" = X: || { $LEX_IS_FLEX || AC_MSG_ERROR([Flex is required])
AC_MSG_WARN([bypassing lex because flex is required])
LEX=:
}
AM_CONDITIONAL([FLEX_CXX_WORKS],
[$LEX_IS_FLEX && test $bison_cv_cxx_works = yes])
AC_PROG_YACC AC_PROG_YACC
AC_PROG_RANLIB AC_PROG_RANLIB
AC_PROG_GNU_M4 AC_PROG_GNU_M4
@@ -218,6 +147,7 @@ gl_INIT
# Checks for library functions. # Checks for library functions.
AC_CHECK_FUNCS_ONCE([setlocale]) AC_CHECK_FUNCS_ONCE([setlocale])
AM_WITH_DMALLOC AM_WITH_DMALLOC
BISON_PREREQ_TIMEVAR
# Gettext. # Gettext.
# We use gnulib, which is only guaranteed to work properly with the # We use gnulib, which is only guaranteed to work properly with the
@@ -239,36 +169,37 @@ AC_CONFIG_FILES([etc/bench.pl], [chmod +x etc/bench.pl])
AC_CONFIG_TESTDIR(tests) AC_CONFIG_TESTDIR(tests)
AC_CONFIG_FILES([tests/atlocal]) AC_CONFIG_FILES([tests/atlocal])
AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison]) AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison])
AC_CHECK_PROGS([VALGRIND], [valgrind]) AC_CHECK_PROGS([VALGRIND], [valgrind])
# Use something simpler that $host_os to select our suppression file. case $VALGRIND:$host_os in
uname=`uname`
case $VALGRIND:$uname in
'':*) ;; '':*) ;;
*:Darwin) *:darwin*)
# See README-hacking. # See README-hacking.
# VALGRIND+=' --suppressions=$(abs_top_srcdir)/build-aux/darwin11.4.0.valgrind'
VALGRIND=;; VALGRIND=;;
*:*) *:*)
suppfile=build-aux/$uname.valgrind AC_SUBST([VALGRIND_PREBISON], [$VALGRIND -q]);;
if test -f "$srcdir/$suppfile"; then
AC_SUBST([VALGRIND_OPTS_SUPPRESSION],
["--suppressions=\$(abs_top_srcdir)/$suppfile"])
fi
;;
esac esac
AC_MSG_CHECKING([Valgrind suppression file])
AC_MSG_RESULT([$suppfile])
# Whether we cannot run the compiled bison.
AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
AM_MISSING_PROG([AUTOM4TE], [autom4te]) AM_MISSING_PROG([AUTOM4TE], [autom4te])
# Needed by tests/atlocal.in. # Needed by tests/atlocal.in.
AC_SUBST([GCC]) AC_SUBST([GCC])
gt_JAVACOMP([1.7], [1.7]) gt_JAVACOMP([1.3], [1.4])
gt_JAVAEXEC gt_JAVAEXEC
# We use gnulib, but from lib/local.mk instead of lib/Makefile.am.
# So prefix paths with lib/. See also etc/prefix-gnulib-mk.
gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, , lib/,g'`
# Listing the names of the variables to prefix is error-prone.
# Rather, adjust all the AC_SUBST variables whose name ends in '_H',
# and whose content ends in '.h'.
for ac_var in $ac_subst_vars
do
eval "ac_val=\$$ac_var"
case $ac_var=$ac_val in
(*_H=*.h) eval "$ac_var=lib/\$$ac_var";;
esac
done
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile
po/Makefile.in po/Makefile.in
doc/yacc.1]) doc/yacc.1])
+4 -6
View File
@@ -1,3 +1,5 @@
-*- outline -*-
This directory contains data needed by Bison. This directory contains data needed by Bison.
* Skeletons * Skeletons
@@ -25,7 +27,7 @@ Currently, the supported skeletons are:
These skeletons are the only ones supported by the Bison team. These skeletons are the only ones supported by the Bison team.
Because the interface between skeletons and the bison program is not Because the interface between skeletons and the bison program is not
finished, *we are not bound to it*. In particular, Bison is not finished, *we are not bound to it*. In particular, Bison is not
mature enough for us to consider that "foreign skeletons" are mature enough for us to consider that ``foreign skeletons'' are
supported. supported.
* m4sugar * m4sugar
@@ -50,11 +52,7 @@ into various formats.
----- -----
Local Variables: Copyright (C) 2002, 2008-2012 Free Software Foundation, Inc.
mode: outline
End:
Copyright (C) 2002, 2008-2015, 2018 Free Software Foundation, Inc.
This file is part of GNU Bison. This file is part of GNU Bison.
+130 -378
View File
@@ -2,7 +2,7 @@
# Language-independent M4 Macros for Bison. # Language-independent M4 Macros for Bison.
# Copyright (C) 2002, 2004-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2002, 2004-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -22,17 +22,12 @@
## Identification. ## ## Identification. ##
## ---------------- ## ## ---------------- ##
# b4_generated_by
# ---------------
m4_define([b4_generated_by],
[b4_comment([A Bison parser, made by GNU Bison b4_version.])
])
# b4_copyright(TITLE, [YEARS]) # b4_copyright(TITLE, [YEARS])
# ---------------------------- # ----------------------------
# If YEARS are not defined, use b4_copyright_years. # If YEARS are not defined, use b4_copyright_years.
m4_define([b4_copyright], m4_define([b4_copyright],
[b4_generated_by [b4_comment([A Bison parser, made by GNU Bison b4_version.])
b4_comment([$1 b4_comment([$1
]m4_dquote(m4_text_wrap([Copyright (C) ]m4_dquote(m4_text_wrap([Copyright (C)
@@ -63,68 +58,7 @@ Bison output files to be licensed under the GNU General Public
License without this special exception. License without this special exception.
This special exception was added by the Free Software Foundation in This special exception was added by the Free Software Foundation in
version 2.2 of Bison.]) version 2.2 of Bison.])])
])
# b4_disclaimer
# -------------
# Issue a warning about private implementation details.
m4_define([b4_disclaimer],
[b4_comment([Undocumented macros, especially those whose name start with YY_,
are private implementation details. Do not rely on them.])
])
# b4_required_version_if(VERSION, IF_NEWER, IF_OLDER)
# ---------------------------------------------------
# If the version %require'd by the user is VERSION (or newer) expand
# IF_NEWER, otherwise IF_OLDER. VERSION should be an integer, e.g.,
# 302 for 3.2.
m4_define([b4_required_version_if],
[m4_if(m4_eval($1 <= b4_required_version),
[1], [$2], [$3])])
## -------- ##
## Output. ##
## -------- ##
# b4_output_begin(FILE1, FILE2)
# -----------------------------
# Enable output, i.e., send to diversion 0, expand after "#", and
# generate the tag to output into FILE. Must be followed by EOL.
# FILE is FILE1 concatenated to FILE2. FILE2 can be empty, or be
# absolute: do the right thing.
m4_define([b4_output_begin],
[m4_changecom()
m4_divert_push(0)dnl
@output(m4_unquote([$1])@,m4_unquote([$2])@)@dnl
])
# b4_output_end
# -------------
# Output nothing, restore # as comment character (no expansions after #).
m4_define([b4_output_end],
[m4_divert_pop(0)
m4_changecom([#])
])
# b4_divert_kill(CODE)
# --------------------
# Expand CODE for its side effects, discard its output.
m4_define([b4_divert_kill],
[m4_divert_text([KILL], [$1])])
# b4_define_silent(MACRO, CODE)
# -----------------------------
# Same as m4_define, but throw away the expansion of CODE.
m4_define([b4_define_silent],
[m4_define([$1], [b4_divert_kill([$2])])])
## ---------------- ## ## ---------------- ##
@@ -148,16 +82,30 @@ _m4eof
])dnl ])dnl
m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])]) m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])])
# b4_error(KIND, START, END, FORMAT, [ARG1], [ARG2], ...) # b4_error(KIND, FORMAT, [ARG1], [ARG2], ...)
# ------------------------------------------------------- # -------------------------------------------
# Write @KIND(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout. # Write @KIND(FORMAT@,ARG1@,ARG2@,...@) to stdout.
# #
# For example: # For example:
# #
# b4_error([[complain]], [[input.y:2.3]], [[input.y:5.4]], # b4_error([[warn]], [[invalid value for '%s': %s]], [[foo]], [[3]])
# [[invalid %s]], [[foo]])
m4_define([b4_error], m4_define([b4_error],
[b4_cat([[@complain][(]$1[@,]$2[@,]$3[@,]$4[]]dnl [b4_cat([[@]$1[(]$2[]]dnl
[m4_if([$#], [2], [],
[m4_foreach([b4_arg],
m4_dquote(m4_shift(m4_shift($@))),
[[@,]b4_arg])])[@)]])])
# b4_error_at(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
# ----------------------------------------------------------
# Write @KIND_at(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
#
# For example:
#
# b4_error_at([[complain]], [[input.y:2.3]], [[input.y:5.4]],
# [[invalid %s]], [[foo]])
m4_define([b4_error_at],
[b4_cat([[@]$1[_at(]$2[@,]$3[@,]$4[]]dnl
[m4_if([$#], [4], [], [m4_if([$#], [4], [],
[m4_foreach([b4_arg], [m4_foreach([b4_arg],
m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))), m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))),
@@ -177,21 +125,21 @@ m4_define([b4_error],
# m4_define([asdf], [ASDF]) # m4_define([asdf], [ASDF])
# m4_define([fsa], [FSA]) # m4_define([fsa], [FSA])
# m4_define([fdsa], [FDSA]) # m4_define([fdsa], [FDSA])
# b4_warn_at([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]]) # b4_warn([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
# b4_warn_at([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]]) # b4_warn([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
# b4_warn_at() # b4_warn()
# b4_warn_at(1) # b4_warn(1)
# b4_warn_at(1, 2) # b4_warn(1, 2)
# #
# Should produce this without newlines: # Should produce this without newlines:
# #
# @warn_at([asdf), asdf]@,@,@,[fsa), fsa]@,[fdsa), fdsa]@) # @warn([asdf), asdf]@,[fsa), fsa]@,[fdsa), fdsa]@)
# @warn(asdf), asdf@,@,@,fsa), fsa@,fdsa), fdsa@) # @warn(asdf), asdf@,fsa), fsa@,fdsa), fdsa@)
# @warn(@) # @warn(@)
# @warn(1@) # @warn(1@)
# @warn(1@,2@) # @warn(1@,2@)
m4_define([b4_warn], m4_define([b4_warn],
[b4_error([[warn]], [], [], $@)]) [b4_error([[warn]], $@)])
# b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...) # b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...)
# --------------------------------------------------- # ---------------------------------------------------
@@ -201,15 +149,15 @@ m4_define([b4_warn],
# #
# b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]]) # b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]])
m4_define([b4_warn_at], m4_define([b4_warn_at],
[b4_error([[warn]], $@)]) [b4_error_at([[warn]], $@)])
# b4_complain(FORMAT, [ARG1], [ARG2], ...) # b4_complain(FORMAT, [ARG1], [ARG2], ...)
# ---------------------------------------- # ----------------------------------------
# Bounce to b4_complain_at. # Write @complain(FORMAT@,ARG1@,ARG2@,...@) to stdout.
# #
# See b4_warn example. # See b4_warn example.
m4_define([b4_complain], m4_define([b4_complain],
[b4_error([[complain]], [], [], $@)]) [b4_error([[complain]], $@)])
# b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...) # b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...)
# ------------------------------------------------------- # -------------------------------------------------------
@@ -217,15 +165,15 @@ m4_define([b4_complain],
# #
# See b4_warn_at example. # See b4_warn_at example.
m4_define([b4_complain_at], m4_define([b4_complain_at],
[b4_error([[complain]], $@)]) [b4_error_at([[complain]], $@)])
# b4_fatal(FORMAT, [ARG1], [ARG2], ...) # b4_fatal(FORMAT, [ARG1], [ARG2], ...)
# ------------------------------------- # -------------------------------------
# Bounce to b4_fatal_at. # Write @fatal(FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
# #
# See b4_warn example. # See b4_warn example.
m4_define([b4_fatal], m4_define([b4_fatal],
[b4_error([[fatal]], [], [], $@)dnl [b4_error([[fatal]], $@)dnl
m4_exit(1)]) m4_exit(1)])
# b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...) # b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...)
@@ -234,7 +182,7 @@ m4_exit(1)])
# #
# See b4_warn_at example. # See b4_warn_at example.
m4_define([b4_fatal_at], m4_define([b4_fatal_at],
[b4_error([[fatal]], $@)dnl [b4_error_at([[fatal]], $@)dnl
m4_exit(1)]) m4_exit(1)])
@@ -258,23 +206,23 @@ m4_define([b4_subtract],
[m4_eval([$1 - $2])], [m4_eval([$1 - $2])],
[($1) - ($2)])]) [($1) - ($2)])])
# b4_join(ARG1, ...) # b4_args(ARG1, ...)
# _b4_join(ARG1, ...) # _b4_args(ARG1, ...)
# ------------------- # -------------------
# Join with comma, skipping empty arguments. # Join with comma, skipping empty arguments.
# b4_join calls itself recursively until it sees the first non-empty # b4_args calls itself recursively until it sees the first non-empty
# argument, then calls _b4_join which prepends each non-empty argument # argument, then calls _b4_args which prepends each non-empty argument
# with a comma. # with a comma.
m4_define([b4_join], m4_define([b4_args],
[m4_if([$#$1], [m4_if([$#$1],
[1], [], [1], [],
[m4_ifval([$1], [m4_ifval([$1],
[$1[]_$0(m4_shift($@))], [$1[]_$0(m4_shift($@))],
[$0(m4_shift($@))])])]) [$0(m4_shift($@))])])])
# _b4_join(ARGS1, ...) # _b4_args(ARGS1, ...)
# -------------------- # --------------------
m4_define([_b4_join], m4_define([_b4_args],
[m4_if([$#$1], [m4_if([$#$1],
[1], [], [1], [],
[m4_ifval([$1], [, $1])[]$0(m4_shift($@))])]) [m4_ifval([$1], [, $1])[]$0(m4_shift($@))])])
@@ -292,30 +240,30 @@ m4_define([b4_integral_parser_tables_map],
STATE-NUM.]]) STATE-NUM.]])
$1([defact], [b4_defact], $1([defact], [b4_defact],
[[YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. [[YYDEFACT[S] -- default reduction number in state S. Performed when
Performed when YYTABLE does not specify something else to do. Zero YYTABLE does not specify something else to do. Zero means the default
means the default is an error.]]) is an error.]])
$1([pgoto], [b4_pgoto], [[YYPGOTO[NTERM-NUM].]]) $1([pgoto], [b4_pgoto], [[YYPGOTO[NTERM-NUM].]])
$1([defgoto], [b4_defgoto], [[YYDEFGOTO[NTERM-NUM].]]) $1([defgoto], [b4_defgoto], [[YYDEFGOTO[NTERM-NUM].]])
$1([table], [b4_table], $1([table], [b4_table],
[[YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If [[YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule whose positive, shift that token. If negative, reduce the rule which
number is the opposite. If YYTABLE_NINF, syntax error.]]) number is the opposite. If YYTABLE_NINF, syntax error.]])
$1([check], [b4_check]) $1([check], [b4_check])
$1([stos], [b4_stos], $1([stos], [b4_stos],
[[YYSTOS[STATE-NUM] -- The (internal number of the) accessing [[STOS_[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM.]]) symbol of state STATE-NUM.]])
$1([r1], [b4_r1], $1([r1], [b4_r1],
[[YYR1[YYN] -- Symbol number of symbol that rule YYN derives.]]) [[YYR1[YYN] -- Symbol number of symbol that rule YYN derives.]])
$1([r2], [b4_r2], $1([r2], [b4_r2],
[[YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.]]) [[YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.]])
]) ])
@@ -342,7 +290,7 @@ m4_define([b4_flag_if],
[m4_case(b4_$1_flag, [m4_case(b4_$1_flag,
[0], [$3], [0], [$3],
[1], [$2], [1], [$2],
[m4_fatal([invalid $1 value: ]b4_$1_flag)])]) [m4_fatal([invalid $1 value: ]$1)])])
# b4_define_flag_if(FLAG) # b4_define_flag_if(FLAG)
@@ -355,7 +303,7 @@ m4_define([b4_define_flag_if],
# _b4_define_flag_if($1, $2, FLAG) # _b4_define_flag_if($1, $2, FLAG)
# -------------------------------- # --------------------------------
# Work around the impossibility to define macros inside macros, # Work around the impossibility to define macros inside macros,
# because issuing '[$1]' is not possible in M4. GNU M4 should provide # because issuing `[$1]' is not possible in M4. GNU M4 should provide
# $$1 a la M5/TeX. # $$1 a la M5/TeX.
m4_define([_b4_define_flag_if], m4_define([_b4_define_flag_if],
[m4_if([$1$2], $[1]$[2], [], [m4_if([$1$2], $[1]$[2], [],
@@ -383,57 +331,25 @@ b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated.
# macro per (token, field), where field can has_id, id, etc.: see # macro per (token, field), where field can has_id, id, etc.: see
# src/output.c:prepare_symbols_definitions(). # src/output.c:prepare_symbols_definitions().
# #
# The various FIELDS are:
#
# - 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.
# A representat of the symbol. Can be 'foo', 'foo.id', '"foo"' etc.
# - user_number: integer
# The assigned (external) number as used by yylex.
# - is_token: 0 or 1
# Whether this is a terminal symbol.
# - number: integer
# The internalized number (used after yytranslate).
# - has_type: 0, 1
# Whether has a semantic value.
# - 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
# 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
# If the symbol has a printer, everything about it.
# - has_destructor, destructor, destructor_file, destructor_line
# Likewise.
#
# The following macros provide access to these values. # The following macros provide access to these values.
# _b4_symbol(NUM, FIELD) # b4_symbol_(NUM, FIELD)
# ---------------------- # ----------------------
# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if # Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if
# undefined. # undefined.
m4_define([_b4_symbol], m4_define([b4_symbol_],
[m4_indir([b4_symbol($1, $2)])]) [m4_indir([b4_symbol($1, $2)])])
# b4_symbol(NUM, FIELD) # b4_symbol(NUM, FIELD)
# --------------------- # ---------------------
# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if # Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if
# undefined. If FIELD = id, prepend the token prefix. # undefined. If FIELD = id, prepend the prefix.
m4_define([b4_symbol], m4_define([b4_symbol],
[m4_case([$2], [m4_case([$2],
[id], [m4_do([b4_percent_define_get([api.token.prefix])], [id], [m4_do([b4_percent_define_get([api.tokens.prefix])],
[_b4_symbol([$1], [id])])], [b4_symbol_([$1], [id])])],
[_b4_symbol($@)])]) [b4_symbol_($@)])])
# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE) # b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
@@ -447,14 +363,6 @@ m4_define([b4_symbol_if],
[m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])]) [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
# b4_symbol_tag_comment(SYMBOL-NUM)
# ---------------------------------
# Issue a comment giving the tag of symbol NUM.
m4_define([b4_symbol_tag_comment],
[b4_comment([b4_symbol([$1], [tag])])
])
# b4_symbol_action_location(SYMBOL-NUM, KIND) # b4_symbol_action_location(SYMBOL-NUM, KIND)
# ------------------------------------------- # -------------------------------------------
# Report the location of the KIND action as FILE:LINE. # Report the location of the KIND action as FILE:LINE.
@@ -465,19 +373,22 @@ m4_define([b4_symbol_action_location],
# b4_symbol_action(SYMBOL-NUM, KIND) # b4_symbol_action(SYMBOL-NUM, KIND)
# ---------------------------------- # ----------------------------------
# Run the action KIND (destructor or printer) for SYMBOL-NUM. # Run the action KIND (destructor or printer) for SYMBOL-NUM.
# Same as in C, but using references instead of pointers.
m4_define([b4_symbol_action], m4_define([b4_symbol_action],
[b4_symbol_if([$1], [has_$2], [b4_symbol_if([$1], [has_$2],
[b4_dollar_pushdef([(*yyvaluep)], [m4_pushdef([b4_dollar_dollar],
b4_symbol_if([$1], [has_type], [b4_symbol_value([(*yyvaluep)],
[m4_dquote(b4_symbol([$1], [type]))]), b4_symbol_if([$1], [has_type],
[(*yylocationp)])dnl [b4_symbol([$1], [type])]))])dnl
_b4_symbol_case([$1])[]dnl m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])]) b4_symbol_case_([$1])
b4_symbol([$1], [$2]) b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
b4_symbol([$1], [$2])
b4_syncline([@oline@], [@ofile@]) b4_syncline([@oline@], [@ofile@])
break; break;
b4_dollar_popdef[]dnl m4_popdef([b4_at_dollar])dnl
m4_popdef([b4_dollar_dollar])dnl
])]) ])])
@@ -488,29 +399,11 @@ m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])])
m4_define([b4_symbol_printer], [b4_symbol_action([$1], [printer])]) m4_define([b4_symbol_printer], [b4_symbol_action([$1], [printer])])
# b4_symbol_actions(KIND, [TYPE = yytype]) # b4_symbol_case_(SYMBOL-NUM)
# ----------------------------------------
# Emit the symbol actions for KIND ("printer" or "destructor").
# Dispatch on TYPE.
m4_define([b4_symbol_actions],
[m4_pushdef([b4_actions_], m4_expand([b4_symbol_foreach([b4_symbol_$1])]))dnl
m4_ifval(m4_defn([b4_actions_]),
[switch (m4_default([$2], [yytype]))
{
m4_defn([b4_actions_])
default:
break;
}dnl
],
[YYUSE (m4_default([$2], [yytype]));])dnl
m4_popdef([b4_actions_])dnl
])
# _b4_symbol_case(SYMBOL-NUM)
# --------------------------- # ---------------------------
# Issue a "case NUM" for SYMBOL-NUM. # Issue a "case NUM" for SYMBOL-NUM.
m4_define([_b4_symbol_case], m4_define([b4_symbol_case_],
[case b4_symbol([$1], [number]): b4_symbol_tag_comment([$1])]) [ case b4_symbol([$1], [number]): // b4_symbol([$1], [tag])
]) ])
@@ -564,16 +457,13 @@ m4_define([b4_token_format],
## Types. ## ## Types. ##
## ------- ## ## ------- ##
# _b4_type_action(NUMS) # b4_type_action_(NUMS)
# --------------------- # ---------------------
# Run actions for the symbol NUMS that all have the same type-name. # Run actions for the symbol NUMS that all have the same type-name.
# Skip NUMS that have no type-name. # Skip NUMS that have no type-name.
# m4_define([b4_type_action_],
# To specify the action to run, define b4_dollar_dollar(NUMBER,
# TAG, TYPE).
m4_define([_b4_type_action],
[b4_symbol_if([$1], [has_type], [b4_symbol_if([$1], [has_type],
[m4_map([ _b4_symbol_case], [$@])[]dnl [m4_map_args([b4_symbol_case_], $@)[]dnl
b4_dollar_dollar([b4_symbol([$1], [number])], b4_dollar_dollar([b4_symbol([$1], [number])],
[b4_symbol([$1], [tag])], [b4_symbol([$1], [tag])],
[b4_symbol([$1], [type])]); [b4_symbol([$1], [type])]);
@@ -605,21 +495,11 @@ m4_define([b4_basename],
# ----------------------- # -----------------------
m4_define([b4_syncline], m4_define([b4_syncline],
[b4_flag_if([synclines], [b4_flag_if([synclines],
[b4_sync_start([$1], [$2]) b4_sync_end([__line__], [b4_sync_end([__line__], [b4_basename(m4_quote(__file__))])
[b4_basename(m4_quote(__file__))])[]dnl b4_sync_start([$1], [$2])])])
])])
# b4_sync_start(LINE, FILE)
# -----------------------
# Syncline for the new place. Typically a directive for the compiler.
m4_define([b4_sync_start], [b4_comment([$2:$1])])
# b4_sync_end(LINE, FILE)
# -----------------------
# Syncline for the current place, which ends. Typically a comment
# left for the reader.
m4_define([b4_sync_end], [b4_comment([$2:$1])])
m4_define([b4_sync_end], [b4_comment([Line $1 of $2])])
m4_define([b4_sync_start], [b4_comment([Line $1 of $2])])
# b4_user_code(USER-CODE) # b4_user_code(USER-CODE)
# ----------------------- # -----------------------
@@ -629,28 +509,26 @@ m4_define([b4_user_code],
b4_syncline([@oline@], [@ofile@])]) b4_syncline([@oline@], [@ofile@])])
# b4_define_user_code(MACRO, COMMENT) # b4_define_user_code(MACRO)
# ----------------------------------- # --------------------------
# From b4_MACRO, if defined, build b4_user_MACRO that includes the synclines. # From b4_MACRO, build b4_user_MACRO that includes the synclines.
m4_define([b4_define_user_code], m4_define([b4_define_user_code],
[m4_define([b4_user_$1], [m4_define([b4_user_$1],
[m4_ifdef([b4_$1], [b4_user_code([b4_$1])])])
[m4_ifval([$2],
[b4_comment([$2])
])b4_user_code([b4_$1])])])])
# b4_user_actions # b4_user_actions
# b4_user_initial_action # b4_user_initial_action
# b4_user_post_prologue # b4_user_post_prologue
# b4_user_pre_prologue # b4_user_pre_prologue
# b4_user_union_members # b4_user_stype
# ---------------------- # ----------------------
# Macros that issue user code, ending with synclines. # Macros that issue user code, ending with synclines.
b4_define_user_code([actions]) b4_define_user_code([actions])
b4_define_user_code([initial_action], [User initialization code.]) b4_define_user_code([initial_action])
b4_define_user_code([post_prologue], [Second part of user prologue.]) b4_define_user_code([post_prologue])
b4_define_user_code([pre_prologue], [First part of user prologue.]) b4_define_user_code([pre_prologue])
b4_define_user_code([union_members]) b4_define_user_code([stype])
# b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE) # b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE)
@@ -731,16 +609,16 @@ m4_define([b4_percent_define_use],
# b4_percent_define_get([[foo]]) # b4_percent_define_get([[foo]])
m4_define([b4_percent_define_get], m4_define([b4_percent_define_get],
[b4_percent_define_use([$1])dnl [b4_percent_define_use([$1])dnl
_b4_percent_define_ifdef([$1], m4_ifdef([b4_percent_define(]$1[)],
[m4_indir([b4_percent_define(]$1[)])], [m4_indir([b4_percent_define(]$1[)])],
[$2])]) [$2])])
# b4_percent_define_get_loc(VARIABLE) # b4_percent_define_get_loc(VARIABLE)
# ----------------------------------- # -----------------------------------
# Mimic muscle_percent_define_get_loc in ../src/muscle-tab.h exactly. That is, # Mimic muscle_percent_define_get_loc in ../src/muscle-tab.h exactly. That is,
# if the %define variable VARIABLE is undefined, complain fatally since that's # if the %define variable VARIABLE is undefined, complain fatally since that's
# a Bison or skeleton error. Otherwise, return its definition location in a # a Bison or skeleton error. Otherwise, return its definition location in a
# form appropriate for the first two arguments of b4_warn_at, b4_complain_at, or # form approriate for the first two arguments of b4_warn_at, b4_complain_at, or
# b4_fatal_at. Don't record this as a Bison usage of VARIABLE as there's no # b4_fatal_at. Don't record this as a Bison usage of VARIABLE as there's no
# reason to suspect that the user-supplied value has yet influenced the output. # reason to suspect that the user-supplied value has yet influenced the output.
# #
@@ -752,21 +630,7 @@ m4_define([b4_percent_define_get_loc],
[m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl [m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl
b4_loc[]dnl b4_loc[]dnl
m4_popdef([b4_loc])], m4_popdef([b4_loc])],
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) [b4_fatal([[b4_percent_define_get_loc: undefined %%define variable '%s']], [$1])])])
# b4_percent_define_get_kind(VARIABLE)
# ------------------------------------
# Get the kind (code, keyword, string) of VARIABLE, i.e., how its
# value was defined (braces, not delimiters, quotes).
#
# If the %define variable VARIABLE is undefined, complain fatally
# since that's a Bison or skeleton error. Don't record this as a
# Bison usage of VARIABLE as there's no reason to suspect that the
# user-supplied value has yet influenced the output.
m4_define([b4_percent_define_get_kind],
[m4_ifdef([b4_percent_define_kind(]$1[)],
[m4_indir([b4_percent_define_kind(]$1[)])],
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
# b4_percent_define_get_syncline(VARIABLE) # b4_percent_define_get_syncline(VARIABLE)
# ---------------------------------------- # ----------------------------------------
@@ -783,20 +647,7 @@ m4_define([b4_percent_define_get_kind],
m4_define([b4_percent_define_get_syncline], m4_define([b4_percent_define_get_syncline],
[m4_ifdef([b4_percent_define_syncline(]$1[)], [m4_ifdef([b4_percent_define_syncline(]$1[)],
[m4_indir([b4_percent_define_syncline(]$1[)])], [m4_indir([b4_percent_define_syncline(]$1[)])],
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) [b4_fatal([[b4_percent_define_get_syncline: undefined %%define variable '%s']], [$1])])])
# _b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
# ------------------------------------------------------
# If the %define variable VARIABLE is defined, expand IF-TRUE, else expand
# IF-FALSE. Don't record usage of VARIABLE.
#
# For example:
#
# _b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
m4_define([_b4_percent_define_ifdef],
[m4_ifdef([b4_percent_define(]$1[)],
[$2],
[$3])])
# b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE]) # b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
# ------------------------------------------------------ # ------------------------------------------------------
@@ -809,42 +660,9 @@ m4_define([_b4_percent_define_ifdef],
# #
# b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]]) # b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
m4_define([b4_percent_define_ifdef], m4_define([b4_percent_define_ifdef],
[_b4_percent_define_ifdef([$1], [m4_ifdef([b4_percent_define(]$1[)],
[b4_percent_define_use([$1])$2], [b4_percent_define_use([$1])$2],
[$3])]) [$3])])
# b4_percent_define_check_file_complain(VARIABLE)
# -----------------------------------------------
# Warn about %define variable VARIABLE having an incorrect
# value.
m4_define([b4_percent_define_check_file_complain],
[b4_complain_at(b4_percent_define_get_loc([$1]),
[[%%define variable '%s' requires 'none' or '"..."' values]],
[$1])])
# b4_percent_define_check_file(MACRO, VARIABLE, DEFAULT)
# ------------------------------------------------------
# If the %define variable VARIABLE:
# - is undefined, then if DEFAULT is non-empty, define MACRO to DEFAULT
# - is a string, define MACRO to its value
# - is the keyword 'none', do nothing
# - otherwise, warn about the incorrect value.
m4_define([b4_percent_define_check_file],
[b4_percent_define_ifdef([$2],
[m4_case(b4_percent_define_get_kind([$2]),
[string],
[m4_define([$1], b4_percent_define_get([$2]))],
[keyword],
[m4_if(b4_percent_define_get([$2]), [none], [],
[b4_percent_define_check_file_complain([$2])])],
[b4_percent_define_check_file_complain([$2])])
],
[m4_ifval([$3],
[m4_define([$1], [$3])])])
])
## --------- ## ## --------- ##
@@ -873,11 +691,11 @@ m4_define([b4_percent_define_flag_if],
[[invalid value for %%define Boolean variable '%s']], [[invalid value for %%define Boolean variable '%s']],
[$1])], [$1])],
[[b4_percent_define_flag_if($1)]])])], [[b4_percent_define_flag_if($1)]])])],
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) [b4_fatal([[b4_percent_define_flag_if: undefined %%define variable '%s']], [$1])])])
# b4_percent_define_default(VARIABLE, DEFAULT, [KIND = keyword]) # b4_percent_define_default(VARIABLE, DEFAULT)
# -------------------------------------------------------------- # --------------------------------------------
# Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly. That is, # Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly. That is,
# if the %define variable VARIABLE is undefined, set its value to DEFAULT. # if the %define variable VARIABLE is undefined, set its value to DEFAULT.
# Don't record this as a Bison usage of VARIABLE as there's no reason to # Don't record this as a Bison usage of VARIABLE as there's no reason to
@@ -887,43 +705,25 @@ m4_define([b4_percent_define_flag_if],
# #
# b4_percent_define_default([[foo]], [[default value]]) # b4_percent_define_default([[foo]], [[default value]])
m4_define([b4_percent_define_default], m4_define([b4_percent_define_default],
[_b4_percent_define_ifdef([$1], [], [m4_ifndef([b4_percent_define(]$1[)],
[m4_define([b4_percent_define(]$1[)], [$2])dnl [m4_define([b4_percent_define(]$1[)], [$2])dnl
m4_define([b4_percent_define_kind(]$1[)],
[m4_default([$3], [keyword])])dnl
m4_define([b4_percent_define_loc(]$1[)], m4_define([b4_percent_define_loc(]$1[)],
[[[[<skeleton default value>:-1.-1]], [[[[<skeleton default value>:-1.-1]],
[[<skeleton default value>:-1.-1]]]])dnl [[<skeleton default value>:-1.-1]]]])dnl
m4_define([b4_percent_define_syncline(]$1[)], [[]])])]) m4_define([b4_percent_define_syncline(]$1[)], [[]])])])
# b4_percent_define_if_define(NAME, [VARIABLE = NAME]) # b4_percent_define_if_define(VARIABLE)
# ---------------------------------------------------- # -------------------------------------
# Define b4_NAME_if that executes its $1 or $2 depending whether # Define b4_VARIABLE_if that executes its $1 or $2 depending whether
# VARIABLE was %defined. The characters '.' and `-' in VARIABLE are mapped # VARIABLE was %defined. The characters `.' and `-' in VARIABLE are mapped
# to '_'. # to `_'.
m4_define([_b4_percent_define_if_define], m4_define([b4_percent_define_if_define_],
[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]), [m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]),
[b4_percent_define_flag_if(m4_default([$2], [$1]), [b4_percent_define_flag_if([$1], [$2], [$3])])])
[$3], [$4])])])
m4_define([b4_percent_define_if_define], m4_define([b4_percent_define_if_define],
[b4_percent_define_default([m4_default([$2], [$1])], [[false]]) [b4_percent_define_default([[$1]], [[false]])
_b4_percent_define_if_define([$1], [$2], $[1], $[2])]) b4_percent_define_if_define_([$1], $[1], $[2])])
# b4_percent_define_check_kind(VARIABLE, KIND, [DIAGNOSTIC = complain])
# ---------------------------------------------------------------------
m4_define([b4_percent_define_check_kind],
[_b4_percent_define_ifdef([$1],
[m4_if(b4_percent_define_get_kind([$1]), [$2], [],
[b4_error([m4_default([$3], [complain])],
b4_percent_define_get_loc([$1]),
[m4_case([$2],
[code], [[%%define variable '%s' requires '{...}' values]],
[keyword], [[%%define variable '%s' requires keyword values]],
[string], [[%%define variable '%s' requires '"..."' values]])],
[$1])])])dnl
])
# b4_percent_define_check_values(VALUES) # b4_percent_define_check_values(VALUES)
@@ -947,9 +747,8 @@ m4_define([b4_percent_define_check_values],
[_b4_percent_define_check_values(b4_sublist)])]) [_b4_percent_define_check_values(b4_sublist)])])
m4_define([_b4_percent_define_check_values], m4_define([_b4_percent_define_check_values],
[_b4_percent_define_ifdef([$1], [m4_ifdef([b4_percent_define(]$1[)],
[b4_percent_define_check_kind(]$1[, [keyword], [deprecated])dnl [m4_pushdef([b4_good_value], [0])dnl
m4_pushdef([b4_good_value], [0])dnl
m4_if($#, 1, [], m4_if($#, 1, [],
[m4_foreach([b4_value], m4_dquote(m4_shift($@)), [m4_foreach([b4_value], m4_dquote(m4_shift($@)),
[m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value, [m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value,
@@ -960,11 +759,11 @@ m4_define([_b4_percent_define_check_values],
[$1], [$1],
m4_dquote(m4_indir([b4_percent_define(]$1[)]))) m4_dquote(m4_indir([b4_percent_define(]$1[)])))
m4_foreach([b4_value], m4_dquote(m4_shift($@)), m4_foreach([b4_value], m4_dquote(m4_shift($@)),
[b4_error([[note]], b4_percent_define_get_loc([$1]), [] [b4_complain_at(b4_percent_define_get_loc([$1]),
[[accepted value: '%s']], [[accepted value: '%s']],
m4_dquote(b4_value))])])dnl m4_dquote(b4_value))])])dnl
m4_popdef([b4_good_value])], m4_popdef([b4_good_value])],
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])]) [b4_fatal([[b4_percent_define_check_values: undefined %%define variable '%s']], [$1])])])
# b4_percent_code_get([QUALIFIER]) # b4_percent_code_get([QUALIFIER])
# -------------------------------- # --------------------------------
@@ -1005,23 +804,21 @@ m4_define([b4_percent_code_ifdef],
## Common variables. ## ## Common variables. ##
## ------------------ ## ## ------------------ ##
# Default values for %define.
# ---------------------------
# If the api.tokens.prefix, it is empty.
m4_percent_define_default([[api.tokens.prefix]], [[]])
# b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT]) # b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT])
# b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT]) # b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT])
# b4_token_ctor_if([IF-YYLEX-RETURNS-A-TOKEN], [IF-NOT]) # b4_lex_symbol_if([IF-YYLEX-RETURNS-A-COMPLETE-SYMBOL], [IF-NOT])
# ---------------------------------------------------------- # b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
b4_percent_define_if_define([token_ctor], [api.token.constructor]) # ----------------------------------------------
b4_percent_define_if_define([lex_symbol])
b4_percent_define_if_define([locations]) # Whether locations are tracked. b4_percent_define_if_define([locations]) # Whether locations are tracked.
b4_percent_define_if_define([parse.assert]) b4_percent_define_if_define([parse.assert])
b4_percent_define_if_define([parse.trace]) b4_percent_define_if_define([parse.trace])
b4_percent_define_if_define([variant])
# b4_bison_locations_if([IF-TRUE])
# --------------------------------
# Expand IF-TRUE if using locations, and using the default location
# type.
m4_define([b4_bison_locations_if],
[b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [], [$1])])])
# b4_error_verbose_if([IF-ERRORS-ARE-VERBOSE], [IF-NOT]) # b4_error_verbose_if([IF-ERRORS-ARE-VERBOSE], [IF-NOT])
@@ -1041,17 +838,6 @@ b4_define_flag_if([error_verbose])
b4_error_verbose_if([m4_define([b4_token_table_flag], [1])]) b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
# b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
# ----------------------------------------------
b4_percent_define_if_define([variant])
m4_define([b4_variant_flag], [[0]])
b4_percent_define_ifdef([[api.value.type]],
[m4_case(b4_percent_define_get_kind([[api.value.type]]), [keyword],
[m4_case(b4_percent_define_get([[api.value.type]]), [variant],
[m4_define([b4_variant_flag], [[1]])])])])
b4_define_flag_if([variant])
## ----------------------------------------------------------- ## ## ----------------------------------------------------------- ##
## After processing the skeletons, check that all the user's ## ## After processing the skeletons, check that all the user's ##
## %define variables and %code qualifiers were used by Bison. ## ## %define variables and %code qualifiers were used by Bison. ##
@@ -1074,6 +860,8 @@ b4_check_user_names_wrap([[code]], [[qualifier]])
## ---------------- ## ## ---------------- ##
# m4_define_default([b4_lex_param], []) dnl breaks other skeletons # m4_define_default([b4_lex_param], []) dnl breaks other skeletons
m4_define_default([b4_pre_prologue], [])
m4_define_default([b4_post_prologue], [])
m4_define_default([b4_epilogue], []) m4_define_default([b4_epilogue], [])
m4_define_default([b4_parse_param], []) m4_define_default([b4_parse_param], [])
@@ -1081,46 +869,10 @@ m4_define_default([b4_parse_param], [])
m4_define_default([b4_location_initial_column], [1]) m4_define_default([b4_location_initial_column], [1])
m4_define_default([b4_location_initial_line], [1]) m4_define_default([b4_location_initial_line], [1])
# Sanity checks.
## --------------- ##
## Sanity checks. ##
## --------------- ##
# api.location.prefix={...} (Java and C++).
b4_percent_define_check_kind([api.location.type], [code], [deprecated])
# api.position.prefix={...} (Java).
b4_percent_define_check_kind([api.position.type], [code], [deprecated])
# api.prefix >< %name-prefix.
b4_percent_define_check_kind([api.prefix], [code], [deprecated])
b4_percent_define_ifdef([api.prefix], b4_percent_define_ifdef([api.prefix],
[m4_ifdef([b4_prefix], [m4_ifdef([b4_prefix],
[b4_complain_at(b4_percent_define_get_loc([api.prefix]), [b4_complain_at(b4_percent_define_get_loc([api.prefix]),
[['%s' and '%s' cannot be used together]], [['%s' and '%s' cannot be used together]],
[%name-prefix], [%name-prefix],
[%define api.prefix])])]) [%define api.prefix])])])
# api.token.prefix={...}
# Make it a warning for those who used betas of Bison 3.0.
b4_percent_define_check_kind([api.token.prefix], [code], [deprecated])
# api.value.type >< %union.
b4_percent_define_ifdef([api.value.type],
[m4_ifdef([b4_union_members],
[b4_complain_at(b4_percent_define_get_loc([api.value.type]),
[['%s' and '%s' cannot be used together]],
[%union],
[%define api.value.type])])])
# api.value.type=union >< %yacc.
b4_percent_define_ifdef([api.value.type],
[m4_if(b4_percent_define_get([api.value.type]), [union],
[b4_yacc_if(dnl
[b4_complain_at(b4_percent_define_get_loc([api.value.type]),
[['%s' and '%s' cannot be used together]],
[%yacc],
[%define api.value.type "union"])])])])
# api.value.union.name.
b4_percent_define_check_kind([api.value.union.name], [keyword])
+1 -2
View File
@@ -2,8 +2,7 @@
# C++ skeleton dispatching for Bison. # C++ skeleton dispatching for Bison.
# Copyright (C) 2006-2007, 2009-2015, 2018 Free Software Foundation, # Copyright (C) 2006-2007, 2009-2012 Free Software Foundation, Inc.
# Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+141 -330
View File
@@ -2,7 +2,7 @@
# C++ skeleton for Bison # C++ skeleton for Bison
# Copyright (C) 2002-2018 Free Software Foundation, Inc. # Copyright (C) 2002-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -17,65 +17,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/>.
# Sanity checks, before defaults installed by c.m4.
b4_percent_define_ifdef([[api.value.union.name]],
[b4_complain_at(b4_percent_define_get_loc([[api.value.union.name]]),
[named %union is invalid in C++])])
m4_include(b4_pkgdatadir/[c.m4]) m4_include(b4_pkgdatadir/[c.m4])
b4_percent_define_check_kind([api.namespace], [code], [deprecated])
b4_percent_define_check_kind([parser_class_name], [code], [deprecated])
## ----- ##
## C++. ##
## ----- ##
# b4_comment(TEXT, [PREFIX])
# --------------------------
# Put TEXT in comment. Prefix all the output lines with PREFIX.
m4_define([b4_comment],
[_b4_comment([$1], [$2// ], [$2// ])])
# b4_inline(hh|cc)
# ----------------
# Expand to `inline\n ` if $1 is hh.
m4_define([b4_inline],
[m4_case([$1],
[cc], [],
[hh], [[inline
]],
[m4_fatal([$0: invalid argument: $1])])])
# b4_cxx_portability
# ------------------
m4_define([b4_cxx_portability],
[#if defined __cplusplus
# define YY_CPLUSPLUS __cplusplus
#else
# define YY_CPLUSPLUS 199711L
#endif
// Support move semantics when possible.
#if 201103L <= YY_CPLUSPLUS
# define YY_MOVE std::move
# define YY_MOVE_OR_COPY move
# define YY_MOVE_REF(Type) Type&&
# define YY_RVREF(Type) Type&&
# define YY_COPY(Type) Type
#else
# define YY_MOVE
# define YY_MOVE_OR_COPY copy
# define YY_MOVE_REF(Type) Type&
# define YY_RVREF(Type) const Type&
# define YY_COPY(Type) const Type&
#endif[]dnl
])
## ---------------- ## ## ---------------- ##
## Default values. ## ## Default values. ##
## ---------------- ## ## ---------------- ##
@@ -85,10 +28,9 @@ b4_percent_define_default([[parser_class_name]], [[parser]])
# Don't do that so that we remember whether we're using a user # Don't do that so that we remember whether we're using a user
# request, or the default value. # request, or the default value.
# #
# b4_percent_define_default([[api.location.type]], [[location]]) # b4_percent_define_default([[location_type]], [[location]])
b4_percent_define_default([[filename_type]], [[std::string]]) b4_percent_define_default([[filename_type]], [[std::string]])
# Make it a warning for those who used betas of Bison 3.0.
b4_percent_define_default([[api.namespace]], m4_defn([b4_prefix])) b4_percent_define_default([[api.namespace]], m4_defn([b4_prefix]))
b4_percent_define_default([[global_tokens_and_yystype]], [[false]]) b4_percent_define_default([[global_tokens_and_yystype]], [[false]])
@@ -105,8 +47,8 @@ b4_percent_define_default([[define_location_comparison]],
m4_define([b4_namespace_ref], [b4_percent_define_get([[api.namespace]])]) m4_define([b4_namespace_ref], [b4_percent_define_get([[api.namespace]])])
# Don't permit an empty b4_namespace_ref. Any '::parser::foo' appended to it # Don't permit an empty b4_namespace_ref. Any `::parser::foo' appended to it
# would compile as an absolute reference with 'parser' in the global namespace. # would compile as an absolute reference with `parser' in the global namespace.
# b4_namespace_open would open an anonymous namespace and thus establish # b4_namespace_open would open an anonymous namespace and thus establish
# internal linkage. This would compile. However, it's cryptic, and internal # internal linkage. This would compile. However, it's cryptic, and internal
# linkage for the parser would be specified in all translation units that # linkage for the parser would be specified in all translation units that
@@ -117,7 +59,7 @@ m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [],
[[namespace reference is empty]])]) [[namespace reference is empty]])])
# Instead of assuming the C++ compiler will do it, Bison should reject any # Instead of assuming the C++ compiler will do it, Bison should reject any
# invalid b4_namespace_ref that would be converted to a valid # invalid b4_namepsace_ref that would be converted to a valid
# b4_namespace_open. The problem is that Bison doesn't always output # b4_namespace_open. The problem is that Bison doesn't always output
# b4_namespace_ref to uncommented code but should reserve the ability to do so # b4_namespace_ref to uncommented code but should reserve the ability to do so
# in future releases without risking breaking any existing user grammars. # in future releases without risking breaking any existing user grammars.
@@ -148,13 +90,13 @@ m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
# -------------- # --------------
# Output the definition of the tokens as enums. # Output the definition of the tokens as enums.
m4_define([b4_token_enums], m4_define([b4_token_enums],
[[enum yytokentype [[/* Tokens. */
{ enum yytokentype {
]m4_join([, ]m4_join([,
], ],
b4_symbol_map([b4_token_enum]))[ b4_symbol_map([b4_token_enum]))[
};]dnl };
]) ]])
@@ -163,24 +105,18 @@ m4_define([b4_token_enums],
## Semantic Values. ## ## Semantic Values. ##
## ----------------- ## ## ----------------- ##
# b4_semantic_type_declare
# ------------------------
# b4_value_type_declare
# ---------------------
# Declare semantic_type. # Declare semantic_type.
m4_define([b4_value_type_declare], m4_define([b4_semantic_type_declare],
[b4_value_type_setup[]dnl
[ /// Symbol semantic values. [ /// Symbol semantic values.
]m4_bmatch(b4_percent_define_get_kind([[api.value.type]]), m4_ifdef([b4_stype],
[code], [ union semantic_type
[[ typedef ]b4_percent_define_get([[api.value.type]])[ semantic_type;]], {b4_user_stype
[m4_bmatch(b4_percent_define_get([[api.value.type]]), };],
[union\|union-directive], [m4_if(b4_tag_seen_flag, 0,
[[ union semantic_type [[ typedef int semantic_type;]],
{ [[ typedef ]b4_api_PREFIX[STYPE semantic_type;]])])])
]b4_user_union_members[
};]])])dnl
])
# b4_public_types_declare # b4_public_types_declare
@@ -189,12 +125,12 @@ m4_define([b4_value_type_declare],
# Depending on %define token_lex, may be output in the header or source file. # Depending on %define token_lex, may be output in the header or source file.
m4_define([b4_public_types_declare], m4_define([b4_public_types_declare],
[[#ifndef ]b4_api_PREFIX[STYPE [[#ifndef ]b4_api_PREFIX[STYPE
]b4_value_type_declare[ ]b4_semantic_type_declare[
#else #else
typedef ]b4_api_PREFIX[STYPE semantic_type; typedef ]b4_api_PREFIX[STYPE semantic_type;
#endif]b4_locations_if([ #endif]b4_locations_if([
/// Symbol locations. /// Symbol locations.
typedef b4_percent_define_get([[api.location.type]], typedef b4_percent_define_get([[location_type]],
[[location]]) location_type;])[ [[location]]) location_type;])[
/// Syntax errors thrown from user actions. /// Syntax errors thrown from user actions.
@@ -210,278 +146,164 @@ m4_define([b4_public_types_declare],
]b4_token_enums[ ]b4_token_enums[
}; };
/// (External) token type, as returned by yylex. /// Token type.
typedef token::yytokentype token_type; typedef token::yytokentype token_type;
/// Symbol type: an internal symbol number. /// A complete symbol, with its type.
typedef int symbol_number_type; template <typename Exact>
struct symbol_base_type
/// The symbol type number to denote an empty symbol.
enum { empty_symbol = -2 };
/// Internal symbol number for tokens (subsumed by symbol_number_type).
typedef ]b4_int_type_for([b4_translate])[ token_number_type;
]])
# b4_symbol_type_declare
# ----------------------
# Define symbol_type, the external type for symbols used for symbol
# constructors.
m4_define([b4_symbol_type_declare],
[[ /// A complete symbol.
///
/// Expects its Base type to provide access to the symbol type
/// via type_get ().
///
/// Provide access to semantic value]b4_locations_if([ and location])[.
template <typename Base>
struct basic_symbol : Base
{ {
/// Alias to Base.
typedef Base super_type;
/// Default constructor. /// Default constructor.
basic_symbol (); inline symbol_base_type ();
#if 201103L <= YY_CPLUSPLUS /// Constructor.]b4_locations_if([
/// Move constructor. inline symbol_base_type (const location_type& l)])[;
basic_symbol (basic_symbol&& that); inline symbol_base_type (]b4_args(
#endif [const semantic_type& v],
b4_locations_if([const location_type& l]))[);
/// Copy constructor. /// Return this with its exact type.
basic_symbol (const basic_symbol& that); const Exact& self () const;
Exact& self ();
]b4_variant_if([[ /// Return the type of this symbol.
/// Constructor for valueless symbols, and symbols from each type. int type_get () const;
]b4_type_foreach([b4_basic_symbol_constructor_declare])], [[
/// Constructor for valueless symbols.
basic_symbol (typename Base::kind_type t]b4_locations_if([,
YY_MOVE_REF (location_type) l])[);
/// Constructor for symbols with semantic value.
basic_symbol (typename Base::kind_type t,
YY_RVREF (semantic_type) v]b4_locations_if([,
YY_RVREF (location_type) l])[);]])[
/// Destroy the symbol.
~basic_symbol ();
/// Destroy contents, and record that is empty.
void clear ();
/// Whether empty.
bool empty () const;
/// Destructive move, \a s is emptied into this.
void move (basic_symbol& s);
/// The semantic value. /// The semantic value.
semantic_type value;]b4_locations_if([ semantic_type value;]b4_locations_if([
/// The location. /// The location.
location_type location;])[ location_type location;])[
private:
#if YY_CPLUSPLUS < 201103L
/// Assignment operator.
basic_symbol& operator= (const basic_symbol& that);
#endif
}; };
/// Type access provider for token (enum) based symbols. /// External form of a symbol: its type and attributes.
struct by_type struct symbol_type : symbol_base_type<symbol_type>
{ {
/// The parent class.
typedef symbol_base_type<symbol_type> super_type;
/// Default constructor. /// Default constructor.
by_type (); inline symbol_type ();
#if 201103L <= YY_CPLUSPLUS /// Constructor for tokens with semantic value.
/// Move constructor. inline symbol_type (]b4_args([token_type t],
by_type (by_type&& that); [const semantic_type& v],
#endif b4_locations_if([const location_type& l]))[);
/// Copy constructor. /// Constructor for valueless tokens.
by_type (const by_type& that); inline symbol_type (]b4_args([token_type t],
b4_locations_if([const location_type& l]))[);
/// The symbol type as needed by the constructor.
typedef token_type kind_type;
/// Constructor from (external) token numbers.
by_type (kind_type t);
/// Record that this symbol is empty.
void clear ();
/// Steal the symbol type from \a that.
void move (by_type& that);
/// The (internal) type number (corresponding to \a type).
/// \a empty when empty.
symbol_number_type type_get () const;
/// The token.
token_type token () const;
/// The symbol type. /// The symbol type.
/// \a empty_symbol when empty.
/// An int, not token_number_type, to be able to store empty_symbol.
int type; int type;
/// The symbol type.
inline int type_get_ () const;
/// The token.
inline token_type token () const;
}; };
]b4_symbol_constructor_declare])
/// "External" symbols: returned by the scanner.
typedef basic_symbol<by_type> symbol_type;
]])
# b4_public_types_define(hh|cc) # b4_public_types_define
# ----------------------------- # ----------------------
# Provide the implementation needed by the public types. # Provide the implementation needed by the public types.
m4_define([b4_public_types_define], m4_define([b4_public_types_define],
[ b4_inline([$1])b4_parser_class_name[::syntax_error::syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m) [[ inline
]b4_parser_class_name[::syntax_error::syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m)
: std::runtime_error (m)]b4_locations_if([ : std::runtime_error (m)]b4_locations_if([
, location (l)])[ , location (l)])[
{} {}
// basic_symbol. // symbol_base_type.
template <typename Base> template <typename Exact>
]b4_parser_class_name[::basic_symbol<Base>::basic_symbol () inline
: value ()]b4_locations_if([ ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type ()
, location ()])[ : value()]b4_locations_if([
{} , location()])[
#if 201103L <= YY_CPLUSPLUS
template <typename Base>
]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (basic_symbol&& that)
: Base (std::move (that))
, value (]b4_variant_if([], [std::move (that.value)]))b4_locations_if([
, location (std::move (that.location))])[
{]b4_variant_if([
b4_symbol_variant([this->type_get ()], [value], [move],
[std::move (that.value)])])[
}
#endif
template <typename Base>
]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (const basic_symbol& that)
: Base (that)
, value (]b4_variant_if([], [that.value]))b4_locations_if([
, location (that.location)])[
{]b4_variant_if([
b4_symbol_variant([this->type_get ()], [value], [copy],
[that.value])])[
}
]b4_variant_if([[
// Implementation of basic_symbol constructor for each type.
]b4_type_foreach([b4_basic_symbol_constructor_define])], [[
/// Constructor for valueless symbols.
template <typename Base>
]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (]b4_join(
[typename Base::kind_type t],
b4_locations_if([YY_MOVE_REF (location_type) l]))[)
: Base (t)
, value ()]b4_locations_if([
, location (l)])[
{}
template <typename Base>
]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (]b4_join(
[typename Base::kind_type t],
[YY_RVREF (semantic_type) v],
b4_locations_if([YY_RVREF (location_type) l]))[)
: Base (t)
, value (]b4_variant_if([], [YY_MOVE (v)])[)]b4_locations_if([
, location (YY_MOVE (l))])[
{]b4_variant_if([[
(void) v;
]b4_symbol_variant([this->type_get ()], [value], [YY_MOVE_OR_COPY], [YY_MOVE (v)])])[}]])[
template <typename Base>
]b4_parser_class_name[::basic_symbol<Base>::~basic_symbol ()
{ {
clear (); }]b4_locations_if([[
}
template <typename Base> template <typename Exact>
void inline
]b4_parser_class_name[::basic_symbol<Base>::clear () ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type (const location_type& l)
{]b4_variant_if([[ : value()
// User destructor. , location(l)
symbol_number_type yytype = this->type_get ();
basic_symbol<Base>& yysym = *this;
(void) yysym;
switch (yytype)
{
]b4_symbol_foreach([b4_symbol_destructor])dnl
[ default:
break;
}
// Type destructor.
]b4_symbol_variant([[yytype]], [[value]], [[template destroy]])])[
Base::clear ();
}
template <typename Base>
bool
]b4_parser_class_name[::basic_symbol<Base>::empty () const
{ {
return Base::type_get () == empty_symbol; }]])[
}
template <typename Base> template <typename Exact>
void inline
]b4_parser_class_name[::basic_symbol<Base>::move (basic_symbol& s) ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type (]b4_args(
[const semantic_type& v],
b4_locations_if([const location_type& l]))[)
: value(v)]b4_locations_if([
, location(l)])[
{ {
super_type::move (s);
]b4_variant_if([b4_symbol_variant([this->type_get ()], [value], [move],
[YY_MOVE (s.value)])],
[value = YY_MOVE (s.value);])[]b4_locations_if([
location = YY_MOVE (s.location);])[
} }
// by_type. template <typename Exact>
]b4_inline([$1])b4_parser_class_name[::by_type::by_type () inline
: type (empty_symbol) const Exact&
{} ]b4_parser_class_name[::symbol_base_type<Exact>::self () const
#if 201103L <= YY_CPLUSPLUS
]b4_inline([$1])b4_parser_class_name[::by_type::by_type (by_type&& that)
: type (that.type)
{ {
that.clear (); return static_cast<const Exact&>(*this);
} }
#endif
]b4_inline([$1])b4_parser_class_name[::by_type::by_type (const by_type& that) template <typename Exact>
: type (that.type) inline
{} Exact&
]b4_parser_class_name[::symbol_base_type<Exact>::self ()
]b4_inline([$1])b4_parser_class_name[::by_type::by_type (token_type t)
: type (yytranslate_ (t))
{}
]b4_inline([$1])[void
]b4_parser_class_name[::by_type::clear ()
{ {
type = empty_symbol; return static_cast<Exact&>(*this);
} }
]b4_inline([$1])[void template <typename Exact>
]b4_parser_class_name[::by_type::move (by_type& that) inline
int
]b4_parser_class_name[::symbol_base_type<Exact>::type_get () const
{ {
type = that.type; return self ().type_get_ ();
that.clear ();
} }
]b4_inline([$1])[int // symbol_type.
]b4_parser_class_name[::by_type::type_get () const inline
]b4_parser_class_name[::symbol_type::symbol_type ()
: super_type ()
, type ()
{
}
inline
]b4_parser_class_name[::symbol_type::symbol_type (]b4_args(
[token_type t],
b4_locations_if([const location_type& l]))[)
: super_type (]b4_locations_if([l])[)
, type (yytranslate_ (t))
{
}
inline
]b4_parser_class_name[::symbol_type::symbol_type (]b4_args(
[token_type t],
[const semantic_type& v],
b4_locations_if([const location_type& l]))[)
: super_type (v]b4_locations_if([, l])[)
, type (yytranslate_ (t))
{
}
inline
int
]b4_parser_class_name[::symbol_type::type_get_ () const
{ {
return type; return type;
} }
]b4_token_ctor_if([[ ]b4_lex_symbol_if([[
]b4_inline([$1])b4_parser_class_name[::token_type inline
]b4_parser_class_name[::by_type::token () const ]b4_parser_class_name[::token_type
]b4_parser_class_name[::symbol_type::token () const
{ {
// YYTOKNUM[NUM] -- (External) token number corresponding to the // YYTOKNUM[NUM] -- (External) token number corresponding to the
// (internal) symbol number NUM (which must be that of a token). */ // (internal) symbol number NUM (which must be that of a token). */
@@ -494,7 +316,6 @@ m4_define([b4_public_types_define],
return static_cast<token_type> (yytoken_number_[type]); return static_cast<token_type> (yytoken_number_[type]);
} }
]])[]dnl ]])[]dnl
b4_symbol_constructor_define]) b4_symbol_constructor_define])
@@ -507,14 +328,14 @@ m4_define([b4_symbol_constructor_declare], [])
m4_define([b4_symbol_constructor_define], []) m4_define([b4_symbol_constructor_define], [])
# b4_yytranslate_define(cc|hh) # b4_yytranslate_define
# ---------------------------- # ---------------------
# Define yytranslate_. Sometimes used in the header file ($1=hh), # Define yytranslate_. Sometimes used in the header file,
# sometimes in the cc file. # sometimes in the cc file.
m4_define([b4_yytranslate_define], m4_define([b4_yytranslate_define],
[[ // Symbol number corresponding to token number t. [[ // Symbol number corresponding to token number t.
]b4_inline([$1])b4_parser_class_name[::token_number_type ]b4_parser_class_name[::token_number_type
]b4_parser_class_name[::yytranslate_ (]b4_token_ctor_if([token_type], ]b4_parser_class_name[::yytranslate_ (]b4_lex_symbol_if([token_type],
[int])[ t) [int])[ t)
{ {
static static
@@ -523,12 +344,12 @@ m4_define([b4_yytranslate_define],
{ {
]b4_translate[ ]b4_translate[
}; };
const unsigned user_token_number_max_ = ]b4_user_token_number_max[; const unsigned int user_token_number_max_ = ]b4_user_token_number_max[;
const token_number_type undef_token_ = ]b4_undef_token_number[; const token_number_type undef_token_ = ]b4_undef_token_number[;
if (static_cast<int> (t) <= yyeof_) if (static_cast<int>(t) <= yyeof_)
return yyeof_; return yyeof_;
else if (static_cast<unsigned> (t) <= user_token_number_max_) else if (static_cast<unsigned int> (t) <= user_token_number_max_)
return translate_table[t]; return translate_table[t];
else else
return undef_token_; return undef_token_;
@@ -600,7 +421,7 @@ m4_define([b4_cc_constructor_call],
m4_define([b4_parse_param_vars], m4_define([b4_parse_param_vars],
[m4_ifset([b4_parse_param], [m4_ifset([b4_parse_param],
[ [
// User arguments. /* User arguments. */
b4_cc_var_decls(b4_parse_param)])]) b4_cc_var_decls(b4_parse_param)])])
m4_define([b4_cc_var_decls], m4_define([b4_cc_var_decls],
[m4_map_sep([b4_cc_var_decl], [ [m4_map_sep([b4_cc_var_decl], [
@@ -636,13 +457,3 @@ m4_define([b4_yylloc_default_define],
while (/*CONSTCOND*/ false) while (/*CONSTCOND*/ false)
# endif # endif
]]) ]])
## -------- ##
## Checks. ##
## -------- ##
b4_token_ctor_if([b4_variant_if([],
[b4_fatal_at(b4_percent_define_get_loc(api.token.constructor),
[cannot use '%s' without '%s'],
[%define api.token.constructor],
[%define api.value.type variant]))])])
-65
View File
@@ -1,65 +0,0 @@
-*- Autoconf -*-
# Common code for C-like languages (C, C++, Java, etc.)
# Copyright (C) 2012-2015, 2018 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/>.
# _b4_comment(TEXT, OPEN, CONTINUE, END)
# --------------------------------------
# Put TEXT in comment. Avoid trailing spaces: don't indent empty lines.
# Avoid adding indentation to the first line, as the indentation comes
# from OPEN. That's why we don't patsubst([$1], [^\(.\)], [ \1]).
#
# Prefix all the output lines with PREFIX.
m4_define([_b4_comment],
[$2[]m4_bpatsubst(m4_expand([[$1]]), [
\(.\)], [
$3\1])$4])
# b4_comment(TEXT, [PREFIX])
# --------------------------
# Put TEXT in comment. Prefix all the output lines with PREFIX.
m4_define([b4_comment],
[_b4_comment([$1], [$2/* ], [$2 ], [ */])])
# _b4_dollar_dollar(VALUE, FIELD, DEFAULT-FIELD)
# ----------------------------------------------
# If FIELD (or DEFAULT-FIELD) is non-null, return "VALUE.FIELD",
# otherwise just VALUE. Be sure to pass "(VALUE)" is VALUE is a
# pointer.
m4_define([_b4_dollar_dollar],
[b4_symbol_value([$1],
m4_if([$2], [[]],
[[$3]], [[$2]]))])
# b4_dollar_pushdef(VALUE-POINTER, DEFAULT-FIELD, LOCATION)
# b4_dollar_popdef
# ---------------------------------------------------------
# Define b4_dollar_dollar for VALUE and DEFAULT-FIELD,
# and b4_at_dollar for LOCATION.
m4_define([b4_dollar_pushdef],
[m4_pushdef([b4_dollar_dollar],
[_b4_dollar_dollar([$1], m4_dquote($][1), [$2])])dnl
m4_pushdef([b4_at_dollar], [$3])dnl
])
m4_define([b4_dollar_popdef],
[m4_popdef([b4_at_dollar])dnl
m4_popdef([b4_dollar_dollar])dnl
])
+1 -2
View File
@@ -2,8 +2,7 @@
# C skeleton dispatching for Bison. # C skeleton dispatching for Bison.
# Copyright (C) 2006-2007, 2009-2015, 2018 Free Software Foundation, # Copyright (C) 2006-2007, 2009-2012 Free Software Foundation, Inc.
# Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+241 -445
View File
@@ -2,7 +2,7 @@
# C M4 Macros for Bison. # C M4 Macros for Bison.
# Copyright (C) 2002, 2004-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2002, 2004-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -17,7 +17,6 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
m4_include(b4_pkgdatadir/[c-like.m4])
# b4_tocpp(STRING) # b4_tocpp(STRING)
# ---------------- # ----------------
@@ -30,27 +29,54 @@ m4_define([b4_tocpp],
# ------------------ # ------------------
# A valid C macro name to use as a CPP header guard for FILE. # A valid C macro name to use as a CPP header guard for FILE.
m4_define([b4_cpp_guard], m4_define([b4_cpp_guard],
[[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]]) [b4_tocpp(m4_defn([b4_prefix])/[$1])])
# b4_cpp_guard_open(FILE) # b4_cpp_guard_open(FILE)
# b4_cpp_guard_close(FILE) # b4_cpp_guard_close(FILE)
# ------------------------ # ------------------------
# If FILE does not expand to nothing, open/close CPP inclusion guards for FILE. # Open/close CPP inclusion guards for FILE.
m4_define([b4_cpp_guard_open], m4_define([b4_cpp_guard_open],
[m4_ifval(m4_quote($1),
[#ifndef b4_cpp_guard([$1]) [#ifndef b4_cpp_guard([$1])
# define b4_cpp_guard([$1])])]) # define b4_cpp_guard([$1])])
m4_define([b4_cpp_guard_close], m4_define([b4_cpp_guard_close],
[m4_ifval(m4_quote($1), [#endif b4_comment([!b4_cpp_guard([$1])])])
[#endif b4_comment([!b4_cpp_guard([$1])])])])
## ---------------- ## ## ---------------- ##
## Identification. ## ## Identification. ##
## ---------------- ## ## ---------------- ##
# b4_comment_(TEXT, OPEN, CONTINUE, END)
# -------------------------------------
# Put TEXT in comment. Avoid trailing spaces: don't indent empty lines.
# Avoid adding indentation to the first line, as the indentation comes
# from OPEN. That's why we don't patsubst([$1], [^\(.\)], [ \1]).
#
# Prefix all the output lines with PREFIX.
m4_define([b4_comment_], [$2[]m4_bpatsubst([$1], [
\(.\)], [
$3\1])$4])
# b4_c_comment(TEXT, [PREFIX])
# ----------------------------
# Put TEXT in comment. Avoid trailing spaces: don't indent empty lines.
# Avoid adding indentation to the first line, as the indentation comes
# from "/*". That's why we don't patsubst([$1], [^\(.\)], [ \1]).
#
# Prefix all the output lines with PREFIX.
m4_define([b4_c_comment],
[b4_comment_([$1], [$2/* ], [$2 ], [$2 */])])
# b4_comment(TEXT, [PREFIX])
# --------------------------
# By default, C comments.
m4_define([b4_comment], [b4_c_comment($@)])
# b4_identification # b4_identification
# ----------------- # -----------------
# Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or # Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or
@@ -97,35 +123,17 @@ m4_define([b4_api_PREFIX],
m4_define_default([b4_prefix], [b4_api_prefix]) m4_define_default([b4_prefix], [b4_api_prefix])
# If the %union is not named, its name is YYSTYPE. # If the %union is not named, its name is YYSTYPE.
b4_percent_define_default([[api.value.union.name]], m4_define_default([b4_union_name], [b4_api_PREFIX[]STYPE])
[b4_api_PREFIX[][STYPE]])
## ------------------------ ## ## ------------------------ ##
## Pure/impure interfaces. ## ## Pure/impure interfaces. ##
## ------------------------ ## ## ------------------------ ##
# b4_lex_formals
# --------------
# All the yylex formal arguments.
# b4_lex_param arrives quoted twice, but we want to keep only one level.
m4_define([b4_lex_formals],
[b4_pure_if([[[[YYSTYPE *yylvalp]], [[&yylval]]][]dnl
b4_locations_if([, [[YYLTYPE *yyllocp], [&yylloc]]])])dnl
m4_ifdef([b4_lex_param], [, ]b4_lex_param)])
# b4_lex
# ------
# Call yylex.
m4_define([b4_lex],
[b4_function_call([yylex], [int], b4_lex_formals)])
# b4_user_args # b4_user_args
# ------------ # ------------
m4_define([b4_user_args], m4_define([b4_user_args],
[m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])]) [m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])])
# b4_parse_param # b4_parse_param
@@ -151,9 +159,9 @@ m4_popdef([$1])dnl
# b4_parse_param_use([VAL], [LOC]) # b4_parse_param_use([VAL], [LOC])
# -------------------------------- # --------------------------------
# 'YYUSE' VAL, LOC if locations are enabled, and all the parse-params. # `YYUSE' VAL, LOC if locations are enabled, and all the parse-params.
m4_define([b4_parse_param_use], m4_define([b4_parse_param_use],
[m4_ifvaln([$1], [ YYUSE ([$1]);])dnl [m4_ifvaln([$1], [ YYUSE([$1]);])dnl
b4_locations_if([m4_ifvaln([$2], [ YYUSE ([$2]);])])dnl b4_locations_if([m4_ifvaln([$2], [ YYUSE ([$2]);])])dnl
b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal); b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal);
])dnl ])dnl
@@ -172,10 +180,10 @@ m4_define([b4_int_type],
[m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char], [m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char],
b4_ints_in($@, [-128], [127]), [1], [signed char], b4_ints_in($@, [-128], [127]), [1], [signed char],
b4_ints_in($@, [0], [65535]), [1], [unsigned short], b4_ints_in($@, [0], [65535]), [1], [unsigned short int],
b4_ints_in($@, [-32768], [32767]), [1], [short], b4_ints_in($@, [-32768], [32767]), [1], [short int],
m4_eval([0 <= $1]), [1], [unsigned], m4_eval([0 <= $1]), [1], [unsigned int],
[int])]) [int])])
@@ -183,7 +191,7 @@ m4_define([b4_int_type],
# b4_int_type_for(NAME) # b4_int_type_for(NAME)
# --------------------- # ---------------------
# Return the smallest int type able to handle numbers ranging from # Return the smallest int type able to handle numbers ranging from
# 'NAME_min' to 'NAME_max' (included). # `NAME_min' to `NAME_max' (included).
m4_define([b4_int_type_for], m4_define([b4_int_type_for],
[b4_int_type($1_min, $1_max)]) [b4_int_type($1_min, $1_max)])
@@ -192,102 +200,30 @@ m4_define([b4_int_type_for],
# -------------------------------------------- # --------------------------------------------
# Without inducing a comparison warning from the compiler, check if the # Without inducing a comparison warning from the compiler, check if the
# literal value LITERAL equals VALUE from table TABLE, which must have # literal value LITERAL equals VALUE from table TABLE, which must have
# TABLE_min and TABLE_max defined. # TABLE_min and TABLE_max defined. YYID must be defined as an identity
# function that suppresses warnings about constant conditions.
m4_define([b4_table_value_equals], m4_define([b4_table_value_equals],
[m4_if(m4_eval($3 < m4_indir([b4_]$1[_min]) [m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
|| m4_indir([b4_]$1[_max]) < $3), [1], || m4_indir([b4_]$1[_max]) < $3), [1],
[[0]], [[YYID (0)]],
[(!!(($2) == ($3)))])]) [[((]$2[) == (]$3[))]])])
## ----------------- ## ## ---------##
## Compiler issues. ## ## Values. ##
## ----------------- ## ## ---------##
# b4_attribute_define([noreturn])
# -------------------------------
# Provide portable compiler "attributes". If "noreturn" is passed, define
# _Noreturn.
m4_define([b4_attribute_define],
[[#ifndef YY_ATTRIBUTE
# if (defined __GNUC__ \
&& (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
|| defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
# else
# define YY_ATTRIBUTE(Spec) /* empty */
# endif
#endif
#ifndef YY_ATTRIBUTE_PURE
# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
#endif
#ifndef YY_ATTRIBUTE_UNUSED
# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
#endif
]m4_bmatch([$1], [\bnoreturn\b], [[/* The _Noreturn keyword of C11. */
#if ! defined _Noreturn
# if defined __cplusplus && 201103L <= __cplusplus
# define _Noreturn [[noreturn]]
# elif !(defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)
# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
|| 0x5110 <= __SUNPRO_C)
# define _Noreturn __attribute__ ((__noreturn__))
# elif defined _MSC_VER && 1200 <= _MSC_VER
# define _Noreturn __declspec (noreturn)
# else
# define _Noreturn
# endif
# endif
#endif
]])[/* Suppress unused-variable warnings by "using" E. */
#if ! defined lint || defined __GNUC__
# define YYUSE(E) ((void) (E))
#else
# define YYUSE(E) /* empty */
#endif
#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
/* Suppress an incorrect diagnostic about yylval being uninitialized. */
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
_Pragma ("GCC diagnostic push") \
_Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
_Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
_Pragma ("GCC diagnostic pop")
#else
# define YY_INITIAL_VALUE(Value) Value
#endif
#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
# define YY_IGNORE_MAYBE_UNINITIALIZED_END
#endif
#ifndef YY_INITIAL_VALUE
# define YY_INITIAL_VALUE(Value) /* Nothing. */
#endif
]])
# b4_null_define # b4_null_define
# -------------- # --------------
# Portability issues: define a YY_NULLPTR appropriate for the current # Portability issues: define a YY_NULL appropriate for the current
# language (C, C++98, or C++11). # language (C, C++98, or C++11).
#
# In C++ pre C++11 it is standard practice to use 0 (not NULL) for the
# null pointer. In C, prefer ((void*)0) to avoid having to include stdlib.h.
m4_define([b4_null_define], m4_define([b4_null_define],
[# ifndef YY_NULLPTR [# ifndef YY_NULL
# if defined __cplusplus # if defined __cplusplus && 201103L <= __cplusplus
# if 201103L <= __cplusplus # define YY_NULL nullptr
# define YY_NULLPTR nullptr
# else
# define YY_NULLPTR 0
# endif
# else # else
# define YY_NULLPTR ((void*)0) # define YY_NULL 0
# endif # endif
# endif[]dnl # endif[]dnl
]) ])
@@ -296,19 +232,13 @@ m4_define([b4_null_define],
# b4_null # b4_null
# ------- # -------
# Return a null pointer constant. # Return a null pointer constant.
m4_define([b4_null], [YY_NULLPTR]) m4_define([b4_null], [YY_NULL])
## ---------##
## Values. ##
## ---------##
# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT) # b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
# ------------------------------------------------------------- # -------------------------------------------------------------
# Define "yy<TABLE-NAME>" whose contents is CONTENT. # Define "yy<TABLE-NAME>" which contents is CONTENT.
m4_define([b4_integral_parser_table_define], m4_define([b4_integral_parser_table_define],
[m4_ifvaln([$3], [b4_comment([$3], [ ])])dnl [m4_ifvaln([$3], [b4_c_comment([$3], [ ])])dnl
static const b4_int_type_for([$2]) yy$1[[]] = static const b4_int_type_for([$2]) yy$1[[]] =
{ {
$2 $2
@@ -332,29 +262,29 @@ m4_define([b4_token_define],
m4_define([b4_token_defines], m4_define([b4_token_defines],
[b4_any_token_visible_if([/* Tokens. */ [b4_any_token_visible_if([/* Tokens. */
m4_join([ m4_join([
], b4_symbol_map([b4_token_define])) ], b4_symbol_map([b4_token_define]))])])
])])
# b4_token_enum(TOKEN-NUM) # b4_token_enum(TOKEN-NUM)
# ------------------------ # ------------------------
# Output the definition of this token as an enum. # Output the definition of this token as an enum.
m4_define([b4_token_enum], m4_define([b4_token_enum],
[b4_token_format([%s = %s], [$1])]) [b4_token_format([ %s = %s], [$1])])
# b4_token_enums # b4_token_enums
# -------------- # --------------
# Output the definition of the tokens (if there are) as enums. # Output the definition of the tokens (if there are) as enums.
m4_define([b4_token_enums], m4_define([b4_token_enums],
[b4_any_token_visible_if([[/* Token type. */ [b4_any_token_visible_if([[/* Tokens. */
#ifndef ]b4_api_PREFIX[TOKENTYPE #ifndef ]b4_api_PREFIX[TOKENTYPE
# define ]b4_api_PREFIX[TOKENTYPE # define ]b4_api_PREFIX[TOKENTYPE
enum ]b4_api_prefix[tokentype /* Put the tokens into the symbol table, so that GDB and other debuggers
{ know about them. */
]m4_join([, enum ]b4_api_prefix[tokentype {
], ]m4_join([,
b4_symbol_map([b4_token_enum]))[ ],
b4_symbol_map([b4_token_enum]))[
}; };
#endif #endif
]])]) ]])])
@@ -377,50 +307,113 @@ m4_define([b4_token_enums_defines],
# ---------------------------- # ----------------------------
# Given a semantic value VAL ($$, $1 etc.), extract its value of type # Given a semantic value VAL ($$, $1 etc.), extract its value of type
# TYPE if TYPE is given, otherwise just return VAL. The result can be # TYPE if TYPE is given, otherwise just return VAL. The result can be
# used safely, it is put in parens to avoid nasty precedence issues. # used safetly, it is put in parens to avoid nasty precedence issues.
# TYPE is *not* put in braces, provide some if needed. # TYPE is *not* put in braces, provide some if needed.
m4_define([b4_symbol_value], m4_define([b4_symbol_value],
[($1[]m4_ifval([$2], [.$2]))]) [($1[]m4_ifval([$2], [.$2]))])
## ---------------------- ## ## --------------------------------------------- ##
## Defining C functions. ## ## Defining C functions in both K&R and ANSI-C. ##
## ---------------------- ## ## --------------------------------------------- ##
# b4_function_define(NAME, RETURN-VALUE, [DECL1, NAME1], ...) # b4_modern_c
# ----------------------------------------------------------- # -----------
# Declare the function NAME in C. # A predicate useful in #if to determine whether C is ancient or modern.
m4_define([b4_function_define], #
[$2 # If __STDC__ is defined, the compiler is modern. IBM xlc 7.0 when run
$1 (b4_formals(m4_shift2($@)))[]dnl # as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
# reasons, but it defines __C99__FUNC__ so check that as well.
# Microsoft C normally doesn't define these macros, but it defines _MSC_VER.
# Consider a C++ compiler to be modern if it defines __cplusplus.
#
m4_define([b4_c_modern],
[[(defined __STDC__ || defined __C99__FUNC__ \
|| defined __cplusplus || defined _MSC_VER)]])
# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
# ----------------------------------------------------------
# Declare the function NAME.
m4_define([b4_c_function_def],
[#if b4_c_modern
b4_c_ansi_function_def($@)
#else
$2
$1 (b4_c_knr_formal_names(m4_shift2($@)))
b4_c_knr_formal_decls(m4_shift2($@))
#endif[]dnl
]) ])
# b4_formals([DECL1, NAME1], ...) # b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
# ------------------------------- # ---------------------------------------------------------------
# The formal arguments of a C function definition. # Declare the function NAME in ANSI.
m4_define([b4_formals], m4_define([b4_c_ansi_function_def],
[$2
$1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl
])
# b4_c_ansi_formals([DECL1, NAME1], ...)
# --------------------------------------
# Output the arguments ANSI-C definition.
m4_define([b4_c_ansi_formals],
[m4_if([$#], [0], [void], [m4_if([$#], [0], [void],
[$#$1], [1], [void], [$#$1], [1], [void],
[m4_map_sep([b4_formal], [, ], [$@])])]) [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
m4_define([b4_formal], m4_define([b4_c_ansi_formal],
[$1]) [$1])
# b4_c_knr_formal_names([DECL1, NAME1], ...)
# ------------------------------------------
# Output the argument names.
m4_define([b4_c_knr_formal_names],
[m4_map_sep([b4_c_knr_formal_name], [, ], [$@])])
## ----------------------- ## m4_define([b4_c_knr_formal_name],
## Declaring C functions. ## [$2])
## ----------------------- ##
# b4_function_declare(NAME, RETURN-VALUE, [DECL1, NAME1], ...) # b4_c_knr_formal_decls([DECL1, NAME1], ...)
# ------------------------------------------------------------ # ------------------------------------------
# Output the K&R argument declarations.
m4_define([b4_c_knr_formal_decls],
[m4_map_sep([b4_c_knr_formal_decl],
[
],
[$@])])
m4_define([b4_c_knr_formal_decl],
[ $1;])
## ------------------------------------------------------------ ##
## Declaring (prototyping) C functions in both K&R and ANSI-C. ##
## ------------------------------------------------------------ ##
# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
# -----------------------------------------------------------
# Declare the function NAME. # Declare the function NAME.
m4_define([b4_function_declare], m4_define([b4_c_function_decl],
[$2 $1 (b4_formals(m4_shift2($@)));[]dnl [#if b4_c_modern
b4_c_ansi_function_decl($@)
#else
$2 $1 ();
#endif[]dnl
])
# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
# ----------------------------------------------------------------
# Declare the function NAME.
m4_define([b4_c_ansi_function_decl],
[$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl
]) ])
@@ -431,21 +424,21 @@ m4_define([b4_function_declare],
## --------------------- ## ## --------------------- ##
# b4_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...) # b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
# ----------------------------------------------------------- # -----------------------------------------------------------
# Call the function NAME with arguments NAME1, NAME2 etc. # Call the function NAME with arguments NAME1, NAME2 etc.
m4_define([b4_function_call], m4_define([b4_c_function_call],
[$1 (b4_args(m4_shift2($@)))[]dnl [$1 (b4_c_args(m4_shift2($@)))[]dnl
]) ])
# b4_args([DECL1, NAME1], ...) # b4_c_args([DECL1, NAME1], ...)
# ---------------------------- # ------------------------------
# Output the arguments NAME1, NAME2... # Output the arguments NAME1, NAME2...
m4_define([b4_args], m4_define([b4_c_args],
[m4_map_sep([b4_arg], [, ], [$@])]) [m4_map_sep([b4_c_arg], [, ], [$@])])
m4_define([b4_arg], m4_define([b4_c_arg],
[$2]) [$2])
@@ -454,7 +447,7 @@ m4_define([b4_arg],
## ----------- ## ## ----------- ##
# b4_sync_start(LINE, FILE) # b4_sync_start(LINE, FILE)
# ------------------------- # -----------------------
m4_define([b4_sync_start], [[#]line $1 $2]) m4_define([b4_sync_start], [[#]line $1 $2])
@@ -475,21 +468,23 @@ b4_syncline([@oline@], [@ofile@])
# ------------------------------------ # ------------------------------------
m4_define([b4_predicate_case], m4_define([b4_predicate_case],
[ case $1: [ case $1:
if (! ( if (! ($2)) YYERROR;
$2)) YYERROR;
b4_syncline([@oline@], [@ofile@]) b4_syncline([@oline@], [@ofile@])
break;]) break;])
# b4_yydestruct_define # b4_yydestruct_generate(FUNCTION-DECLARATOR)
# -------------------- # -------------------------------------------
# Define the "yydestruct" function. # Generate the "yydestruct" function, which declaration is issued using
m4_define_default([b4_yydestruct_define], # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
# or "b4_c_function_def" for K&R.
m4_define_default([b4_yydestruct_generate],
[[/*-----------------------------------------------. [[/*-----------------------------------------------.
| Release the memory associated to this symbol. | | Release the memory associated to this symbol. |
`-----------------------------------------------*/ `-----------------------------------------------*/
]b4_function_define([yydestruct], /*ARGSUSED*/
]$1([yydestruct],
[static void], [static void],
[[const char *yymsg], [yymsg]], [[const char *yymsg], [yymsg]],
[[int yytype], [yytype]], [[int yytype], [yytype]],
@@ -502,256 +497,126 @@ m4_ifset([b4_parse_param], [, b4_parse_param]))[
yymsg = "Deleting"; yymsg = "Deleting";
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN switch (yytype)
]b4_symbol_actions([destructor])[ {
YY_IGNORE_MAYBE_UNINITIALIZED_END ]b4_symbol_foreach([b4_symbol_destructor])dnl
[ default:
break;
}
}]dnl }]dnl
]) ])
# b4_yy_symbol_print_define # b4_yy_symbol_print_generate(FUNCTION-DECLARATOR)
# ------------------------- # ------------------------------------------------
# Define the "yy_symbol_print" function. # Generate the "yy_symbol_print" function, which declaration is issued using
m4_define_default([b4_yy_symbol_print_define], # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
# or "b4_c_function_def" for K&R.
m4_define_default([b4_yy_symbol_print_generate],
[[ [[
/*-----------------------------------. /*--------------------------------.
| Print this symbol's value on YYO. | | Print this symbol on YYOUTPUT. |
`-----------------------------------*/ `--------------------------------*/
]b4_function_define([yy_symbol_value_print], /*ARGSUSED*/
]$1([yy_symbol_value_print],
[static void], [static void],
[[FILE *yyo], [yyo]], [[FILE *yyoutput], [yyoutput]],
[[int yytype], [yytype]], [[int yytype], [yytype]],
[[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl
b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
m4_ifset([b4_parse_param], [, b4_parse_param]))[ m4_ifset([b4_parse_param], [, b4_parse_param]))[
{ {
FILE *yyoutput = yyo; FILE *yyo = yyoutput;
]b4_parse_param_use([yyoutput], [yylocationp])dnl ]b4_parse_param_use([yyo], [yylocationp])dnl
[ if (!yyvaluep) [ if (!yyvaluep)
return;] return;]
dnl glr.c does not feature yytoknum. dnl glr.c does not feature yytoknum.
m4_if(b4_skeleton, ["yacc.c"], m4_if(b4_skeleton, ["yacc.c"],
[[# ifdef YYPRINT [[# ifdef YYPRINT
if (yytype < YYNTOKENS) if (yytype < YYNTOKENS)
YYPRINT (yyo, yytoknum[yytype], *yyvaluep); YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
# endif # endif
]])dnl ]])dnl
b4_symbol_actions([printer])[ [ switch (yytype)
{
]b4_symbol_foreach([b4_symbol_printer])dnl
[ default:
break;
}
} }
/*---------------------------. /*--------------------------------.
| Print this symbol on YYO. | | Print this symbol on YYOUTPUT. |
`---------------------------*/ `--------------------------------*/
]b4_function_define([yy_symbol_print], ]$1([yy_symbol_print],
[static void], [static void],
[[FILE *yyo], [yyo]], [[FILE *yyoutput], [yyoutput]],
[[int yytype], [yytype]], [[int yytype], [yytype]],
[[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl
b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
m4_ifset([b4_parse_param], [, b4_parse_param]))[ m4_ifset([b4_parse_param], [, b4_parse_param]))[
{ {
YYFPRINTF (yyo, "%s %s (", if (yytype < YYNTOKENS)
yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
else
YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
]b4_locations_if([ YY_LOCATION_PRINT (yyo, *yylocationp); ]b4_locations_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp);
YYFPRINTF (yyo, ": "); YYFPRINTF (yyoutput, ": ");
])dnl ])dnl
[ yy_symbol_value_print (yyo, yytype, yyvaluep]dnl [ yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl
b4_locations_if([, yylocationp])[]b4_user_args[); b4_locations_if([, yylocationp])[]b4_user_args[);
YYFPRINTF (yyo, ")"); YYFPRINTF (yyoutput, ")");
}]dnl }]dnl
]) ])
## ---------------- ##
## api.value.type. ##
## ---------------- ##
# ---------------------- #
# api.value.type=union. #
# ---------------------- #
# b4_symbol_type_register(SYMBOL-NUM)
# -----------------------------------
# Symbol SYMBOL-NUM has a type (for variant) instead of a type-tag.
# Extend the definition of %union's body (b4_union_members) with a
# field of that type, and extend the symbol's "type" field to point to
# the field name, instead of the type name.
m4_define([b4_symbol_type_register],
[m4_define([b4_symbol($1, type_tag)],
[b4_symbol_if([$1], [has_id],
[b4_symbol([$1], [id])],
[yytype_[]b4_symbol([$1], [number])])])dnl
m4_append([b4_union_members],
m4_expand([
b4_symbol_tag_comment([$1])dnl
b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]))
])
# b4_type_define_tag(SYMBOL1-NUM, ...)
# ------------------------------------
# For the batch of symbols SYMBOL1-NUM... (which all have the same
# type), enhance the %union definition for each of them, and set
# there "type" field to the field tag name, instead of the type name.
m4_define([b4_type_define_tag],
[b4_symbol_if([$1], [has_type],
[m4_map([b4_symbol_type_register], [$@])])
])
# b4_symbol_value_union(VAL, [TYPE])
# ----------------------------------
# Same of b4_symbol_value, but when api.value.type=union.
m4_define([b4_symbol_value_union],
[m4_ifval([$2],
[(*($2*)(&$1))],
[$1])])
])
# b4_value_type_setup_union
# -------------------------
# Setup support for api.value.type=union. Symbols are defined with a
# type instead of a union member name: build the corresponding union,
# and give the symbols their tag.
m4_define([b4_value_type_setup_union],
[m4_define([b4_union_members])
b4_type_foreach([b4_type_define_tag])
m4_copy_force([b4_symbol_value_union], [b4_symbol_value])
])
# -------------------------- #
# api.value.type = variant. #
# -------------------------- #
# b4_value_type_setup_variant
# ---------------------------
# Setup support for api.value.type=variant. By default, fail, specialized
# by other skeletons.
m4_define([b4_value_type_setup_variant],
[b4_complain_at(b4_percent_define_get_loc([[api.value.type]]),
[['%s' does not support '%s']],
[b4_skeleton],
[%define api.value.type variant])])
# _b4_value_type_setup_keyword
# ----------------------------
# api.value.type is defined with a keyword/string syntax. Check if
# that is properly defined, and prepare its use.
m4_define([_b4_value_type_setup_keyword],
[b4_percent_define_check_values([[[[api.value.type]],
[[none]],
[[union]],
[[union-directive]],
[[variant]],
[[yystype]]]])dnl
m4_case(b4_percent_define_get([[api.value.type]]),
[union], [b4_value_type_setup_union],
[variant], [b4_value_type_setup_variant])])
# b4_value_type_setup
# -------------------
# Check if api.value.type is properly defined, and possibly prepare
# its use.
b4_define_silent([b4_value_type_setup],
[# Define default value.
b4_percent_define_ifdef([[api.value.type]], [],
[# %union => api.value.type=union-directive
m4_ifdef([b4_union_members],
[m4_define([b4_percent_define_kind(api.value.type)], [keyword])
m4_define([b4_percent_define(api.value.type)], [union-directive])],
[# no tag seen => api.value.type={int}
m4_if(b4_tag_seen_flag, 0,
[m4_define([b4_percent_define_kind(api.value.type)], [code])
m4_define([b4_percent_define(api.value.type)], [int])],
[# otherwise api.value.type=yystype
m4_define([b4_percent_define_kind(api.value.type)], [keyword])
m4_define([b4_percent_define(api.value.type)], [yystype])])])])
# Set up.
m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
[keyword\|string], [_b4_value_type_setup_keyword])
])
## -------------- ## ## -------------- ##
## Declarations. ## ## Declarations. ##
## -------------- ## ## -------------- ##
# b4_value_type_define
# --------------------
m4_define([b4_value_type_define],
[b4_value_type_setup[]dnl
/* Value type. */
m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
[code],
[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
typedef ]b4_percent_define_get([[api.value.type]])[ ]b4_api_PREFIX[STYPE;
# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
#endif
]],
[m4_bmatch(b4_percent_define_get([[api.value.type]]),
[union\|union-directive],
[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
]b4_percent_define_get_syncline([[api.value.union.name]])[
union ]b4_percent_define_get([[api.value.union.name]])[
{
]b4_user_union_members[
};
]b4_percent_define_get_syncline([[api.value.union.name]])[
typedef union ]b4_percent_define_get([[api.value.union.name]])[ ]b4_api_PREFIX[STYPE;
# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
#endif
]])])])
# b4_location_type_define
# -----------------------
m4_define([b4_location_type_define],
[[/* Location type. */
#if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED
typedef struct ]b4_api_PREFIX[LTYPE ]b4_api_PREFIX[LTYPE;
struct ]b4_api_PREFIX[LTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
};
# define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
# define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
#endif
]])
# b4_declare_yylstype # b4_declare_yylstype
# ------------------- # -------------------
# Declarations that might either go into the header (if --defines) or # Declarations that might either go into the header (if --defines) or
# in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc. # in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
m4_define([b4_declare_yylstype], m4_define([b4_declare_yylstype],
[b4_value_type_define[]b4_locations_if([ [[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
b4_location_type_define]) ]m4_ifdef([b4_stype],
[[typedef union ]b4_union_name[
{
]b4_user_stype[
} ]b4_api_PREFIX[STYPE;
# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]],
[m4_if(b4_tag_seen_flag, 0,
[[typedef int ]b4_api_PREFIX[STYPE;
# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[
# define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */
# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
#endif]b4_locations_if([[
#if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED
typedef struct ]b4_api_PREFIX[LTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
} ]b4_api_PREFIX[LTYPE;
# define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */
# define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
# define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
#endif]])
b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval; b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval;
]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl ]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl
]) ])
# b4_YYDEBUG_define # b4_YYDEBUG_define
# ----------------- # ------------------
m4_define([b4_YYDEBUG_define], m4_define([b4_YYDEBUG_define],
[[/* Debug traces. */ [[/* Enabling traces. */
]m4_if(b4_api_prefix, [yy], ]m4_if(b4_api_prefix, [yy],
[[#ifndef YYDEBUG [[#ifndef YYDEBUG
# define YYDEBUG ]b4_parse_trace_if([1], [0])[ # define YYDEBUG ]b4_parse_trace_if([1], [0])[
@@ -765,7 +630,7 @@ m4_define([b4_YYDEBUG_define],
# endif # endif
# else /* ! defined YYDEBUG */ # else /* ! defined YYDEBUG */
# define ]b4_api_PREFIX[DEBUG ]b4_parse_trace_if([1], [0])[ # define ]b4_api_PREFIX[DEBUG ]b4_parse_trace_if([1], [0])[
# endif /* ! defined YYDEBUG */ # endif /* ! defined ]b4_api_PREFIX[DEBUG */
#endif /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl #endif /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
]) ])
@@ -789,7 +654,7 @@ m4_define([b4_yylloc_default_define],
#ifndef YYLLOC_DEFAULT #ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \ # define YYLLOC_DEFAULT(Current, Rhs, N) \
do \ do \
if (N) \ if (YYID (N)) \
{ \ { \
(Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
(Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
@@ -803,75 +668,6 @@ m4_define([b4_yylloc_default_define],
(Current).first_column = (Current).last_column = \ (Current).first_column = (Current).last_column = \
YYRHSLOC (Rhs, 0).last_column; \ YYRHSLOC (Rhs, 0).last_column; \
} \ } \
while (0) while (YYID (0))
#endif #endif
]]) ]])
# b4_yy_location_print_define
# ---------------------------
# Define YY_LOCATION_PRINT.
m4_define([b4_yy_location_print_define],
[b4_locations_if([[
/* YY_LOCATION_PRINT -- Print the location on the stream.
This macro was not mandated originally: define only if we know
we won't break user code: when these are the locations we know. */
#ifndef YY_LOCATION_PRINT
# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
/* Print *YYLOCP on YYO. Private, do not rely on its existence. */
YY_ATTRIBUTE_UNUSED
]b4_function_define([yy_location_print_],
[static int],
[[FILE *yyo], [yyo]],
[[YYLTYPE const * const yylocp], [yylocp]])[
{
int res = 0;
int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
if (0 <= yylocp->first_line)
{
res += YYFPRINTF (yyo, "%d", yylocp->first_line);
if (0 <= yylocp->first_column)
res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
}
if (0 <= yylocp->last_line)
{
if (yylocp->first_line < yylocp->last_line)
{
res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
if (0 <= end_col)
res += YYFPRINTF (yyo, ".%d", end_col);
}
else if (0 <= end_col && yylocp->first_column < end_col)
res += YYFPRINTF (yyo, "-%d", end_col);
}
return res;
}
# define YY_LOCATION_PRINT(File, Loc) \
yy_location_print_ (File, &(Loc))
# else
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
# endif
#endif]],
[[/* This macro is provided for backward compatibility. */
#ifndef YY_LOCATION_PRINT
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
#endif]])
])
# b4_yyloc_default
# ----------------
# Expand to a possible default value for yylloc.
m4_define([b4_yyloc_default],
[[
# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
= { ]m4_join([, ],
m4_defn([b4_location_initial_line]),
m4_defn([b4_location_initial_column]),
m4_defn([b4_location_initial_line]),
m4_defn([b4_location_initial_column]))[ }
# endif
]])
+332 -301
View File
File diff suppressed because it is too large Load Diff
+86 -129
View File
@@ -1,6 +1,6 @@
# C++ GLR skeleton for Bison # C++ GLR skeleton for Bison
# Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2002-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -43,11 +43,17 @@
# user must initialize the first positions (in particular the # user must initialize the first positions (in particular the
# filename member). # filename member).
# We require a pure interface. # We require a pure interface using locations.
m4_define([b4_pure_flag], [1]) m4_define([b4_percent_define(locations)], [])
m4_define([b4_pure_flag], [1])
# The header is mandatory.
b4_defines_if([],
[b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
m4_include(b4_pkgdatadir/[c++.m4]) m4_include(b4_pkgdatadir/[c++.m4])
b4_bison_locations_if([m4_include(b4_pkgdatadir/[location.cc])]) b4_percent_define_ifdef([[location_type]], [],
[m4_include(b4_pkgdatadir/[location.cc])])
m4_define([b4_parser_class_name], m4_define([b4_parser_class_name],
[b4_percent_define_get([[parser_class_name]])]) [b4_percent_define_get([[parser_class_name]])])
@@ -55,103 +61,69 @@ m4_define([b4_parser_class_name],
# Save the parse parameters. # Save the parse parameters.
m4_define([b4_parse_param_orig], m4_defn([b4_parse_param])) m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
# b4_parse_param_wrap
# -------------------
# New ones.
m4_ifset([b4_parse_param],
[m4_define([b4_parse_param_wrap],
[[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],]
m4_defn([b4_parse_param]))],
[m4_define([b4_parse_param_wrap],
[[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]])
])
# b4_yy_symbol_print_generate
# b4_yy_symbol_print_define # ---------------------------
# -------------------------
# Bypass the default implementation to generate the "yy_symbol_print" # Bypass the default implementation to generate the "yy_symbol_print"
# and "yy_symbol_value_print" functions. # and "yy_symbol_value_print" functions.
m4_define([b4_yy_symbol_print_define], m4_define([b4_yy_symbol_print_generate],
[[ [[
/*--------------------. /*--------------------.
| Print this symbol. | | Print this symbol. |
`--------------------*/ `--------------------*/
]b4_function_define([yy_symbol_print], ]b4_c_ansi_function_def([yy_symbol_print],
[static void], [static void],
[[FILE *], []], [[FILE *], []],
[[int yytype], [yytype]], [[int yytype], [yytype]],
[[const ]b4_namespace_ref::b4_parser_class_name[::semantic_type *yyvaluep], [[const ]b4_namespace_ref::b4_parser_class_name[::semantic_type *yyvaluep],
[yyvaluep]][]dnl [yyvaluep]],
b4_locations_if([,
[[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
[yylocationp]]]), [yylocationp]],
b4_parse_param)[ b4_parse_param)[
{ {
]b4_parse_param_use[]dnl ]b4_parse_param_use[]dnl
[ yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[); [ yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[);
} }
]])[ ]])
# Hijack the initial action to initialize the locations.
]b4_bison_locations_if([m4_define([b4_initial_action],
[yylloc.initialize ();]m4_ifdef([b4_initial_action], [
m4_defn([b4_initial_action])]))])[
# Hijack the post prologue to insert early definition of YYLLOC_DEFAULT # Hijack the post prologue to insert early definition of YYLLOC_DEFAULT
# and declaration of yyerror. # and declaration of yyerror.
]m4_append([b4_post_prologue], m4_append([b4_post_prologue],
[b4_syncline([@oline@], [@ofile@])[ [b4_syncline([@oline@], [@ofile@])[
]b4_yylloc_default_define[ ]b4_yylloc_default_define[
#define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc) #define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
]b4_function_declare([yyerror], ]b4_c_ansi_function_decl([yyerror],
[static void],b4_locations_if([ [static void],
[[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
[yylocationp]],]) [yylocationp]],
b4_parse_param, b4_parse_param,
[[const char* msg], [msg]])]) [[const char* msg], [msg]])])
#undef yynerrs
#undef yychar
#undef yylval]b4_locations_if([
#undef yylloc])
m4_if(b4_prefix, [yy], [],
[[/* Substitute the variable and function names. */
#define yyparse ]b4_prefix[parse
#define yylex ]b4_prefix[lex
#define yyerror ]b4_prefix[error
#define yydebug ]b4_prefix[debug
]]b4_pure_if([], [[
#define yylval ]b4_prefix[lval
#define yychar ]b4_prefix[char
#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
#define yylloc ]b4_prefix[lloc]])]))
# 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],
[b4_syncline([@oline@], [@ofile@])[ [b4_syncline([@oline@], [@ofile@])[
/*------------------. /*------------------.
| Report an error. | | Report an error. |
`------------------*/ `------------------*/
]b4_function_define([yyerror], ]b4_c_ansi_function_def([yyerror],
[static void],b4_locations_if([ [static void],
[[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
[yylocationp]],]) [yylocationp]],
b4_parse_param, b4_parse_param,
[[const char* msg], [msg]])[ [[const char* msg], [msg]])[
{ {
]b4_parse_param_use[]dnl ]b4_parse_param_use[]dnl
[ yyparser.error (]b4_locations_if([[*yylocationp, ]])[msg); [ yyparser.error (*yylocationp, msg);
} }
]b4_namespace_open[ ]b4_namespace_open[
]dnl In this section, the parse params are the original parse_params. ]dnl In this section, the parse param are the original parse_params.
m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
[ /// Build a parser object. [ /// Build a parser object.
]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [ ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
@@ -166,12 +138,6 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
{ {
} }
int
]b4_parser_class_name[::operator() ()
{
return parse ();
}
int int
]b4_parser_class_name[::parse () ]b4_parser_class_name[::parse ()
{ {
@@ -183,29 +149,34 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
| Print this symbol. | | Print this symbol. |
`--------------------*/ `--------------------*/
void inline void
]b4_parser_class_name[::yy_symbol_value_print_ (int yytype, ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
const semantic_type* yyvaluep]b4_locations_if([[, const semantic_type* yyvaluep,
const location_type* yylocationp]])[) const location_type* yylocationp)
{]b4_locations_if([[ {
YYUSE (yylocationp);]])[ YYUSE (yylocationp);
YYUSE (yyvaluep); YYUSE (yyvaluep);
std::ostream& yyo = debug_stream (); std::ostream& yyoutput = debug_stream ();
std::ostream& yyoutput = yyo; std::ostream& yyo = yyoutput;
YYUSE (yyoutput); YYUSE (yyo);
]b4_symbol_actions([printer])[ switch (yytype)
{
]b4_symbol_foreach([b4_symbol_printer])dnl
[ default:
break;
}
} }
void void
]b4_parser_class_name[::yy_symbol_print_ (int yytype, ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
const semantic_type* yyvaluep]b4_locations_if([[, const semantic_type* yyvaluep,
const location_type* yylocationp]])[) const location_type* yylocationp)
{ {
*yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm") *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
<< ' ' << yytname[yytype] << " ("]b4_locations_if([[ << ' ' << yytname[yytype] << " ("
<< *yylocationp << ": "]])[; << *yylocationp << ": ";
yy_symbol_value_print_ (yytype, yyvaluep]b4_locations_if([[, yylocationp]])[); yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
*yycdebug_ << ')'; *yycdebug_ << ')';
} }
@@ -231,38 +202,46 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
void void
]b4_parser_class_name[::set_debug_level (debug_level_type l) ]b4_parser_class_name[::set_debug_level (debug_level_type l)
{ {
// Actually, it is yydebug which is really used.
yydebug = l; yydebug = l;
} }
#endif #endif
]m4_popdef([b4_parse_param])dnl ]m4_popdef([b4_parse_param])dnl
b4_namespace_close b4_namespace_close[
]])
# Let glr.c believe that the user arguments include the parser itself.
m4_ifset([b4_parse_param],
[m4_pushdef([b4_parse_param],
[[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],]
m4_defn([b4_parse_param]))],
[m4_pushdef([b4_parse_param],
[[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]])
]) ])
m4_include(b4_pkgdatadir/[glr.c])
m4_popdef([b4_parse_param])
m4_divert_push(0)
@output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison GLR parsers in C++],
[2002-2012])[
/* C++ GLR parser skeleton written by Akim Demaille. */
]b4_cpp_guard_open([b4_spec_defines_file])[
]b4_percent_code_get([[requires]])[
# b4_shared_declarations(hh|cc)
# -----------------------------
# Declaration that might either go into the header (if --defines, $1 = hh)
# or in the implementation file.
m4_define([b4_shared_declarations],
[m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
b4_percent_code_get([[requires]])[
#include <iostream>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
#include <iostream>
]m4_ifdef([b4_location_file], ]b4_percent_define_ifdef([[location_type]], [],
[[# include ]b4_location_include])[ [[#include "location.hh"]])[
]b4_null_define[
]b4_YYDEBUG_define[ ]b4_YYDEBUG_define[
]b4_namespace_open[ ]b4_namespace_open[
]b4_bison_locations_if([m4_ifndef([b4_location_file],
[b4_location_define])])[
/// A Bison parser. /// A Bison parser.
class ]b4_parser_class_name[ class ]b4_parser_class_name[
{ {
@@ -273,10 +252,6 @@ b4_percent_code_get([[requires]])[
]b4_parser_class_name[ (]b4_parse_param_decl[); ]b4_parser_class_name[ (]b4_parse_param_decl[);
virtual ~]b4_parser_class_name[ (); virtual ~]b4_parser_class_name[ ();
/// Parse. An alias for parse ().
/// \returns 0 iff parsing succeeded.
int operator() ();
/// Parse. /// Parse.
/// \returns 0 iff parsing succeeded. /// \returns 0 iff parsing succeeded.
virtual int parse (); virtual int parse ();
@@ -294,29 +269,29 @@ b4_percent_code_get([[requires]])[
void set_debug_level (debug_level_type l); void set_debug_level (debug_level_type l);
public: public:
/// Report a syntax error.]b4_locations_if([[ /// Report a syntax error.
/// \param loc where the syntax error is found.]])[ /// \param loc where the syntax error is found.
/// \param msg a description of the syntax error. /// \param msg a description of the syntax error.
virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg); virtual void error (const location_type& loc, const std::string& msg);
# if ]b4_api_PREFIX[DEBUG # if ]b4_api_PREFIX[DEBUG
public: public:
/// \brief Report a symbol value on the debug stream. /// \brief Report a symbol value on the debug stream.
/// \param yytype The token type. /// \param yytype The token type.
/// \param yyvaluep Its semantic value.]b4_locations_if([[ /// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.]])[ /// \param yylocationp Its location.
virtual void yy_symbol_value_print_ (int yytype, virtual void yy_symbol_value_print_ (int yytype,
const semantic_type* yyvaluep]b4_locations_if([[, const semantic_type* yyvaluep,
const location_type* yylocationp]])[); const location_type* yylocationp);
/// \brief Report a symbol on the debug stream. /// \brief Report a symbol on the debug stream.
/// \param yytype The token type. /// \param yytype The token type.
/// \param yyvaluep Its semantic value.]b4_locations_if([[ /// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.]])[ /// \param yylocationp Its location.
virtual void yy_symbol_print_ (int yytype, virtual void yy_symbol_print_ (int yytype,
const semantic_type* yyvaluep]b4_locations_if([[, const semantic_type* yyvaluep,
const location_type* yylocationp]])[); const location_type* yylocationp);
private: private:
// Debugging. /* Debugging. */
std::ostream* yycdebug_; std::ostream* yycdebug_;
#endif #endif
@@ -336,23 +311,5 @@ b4_percent_define_flag_if([[global_tokens_and_yystype]],
]b4_namespace_close[ ]b4_namespace_close[
]b4_percent_code_get([[provides]])[ ]b4_percent_code_get([[provides]])[
]m4_popdef([b4_parse_param])dnl
])
b4_defines_if(
[b4_output_begin([b4_spec_defines_file])
b4_copyright([Skeleton interface for Bison GLR parsers in C++],
[2002-2015, 2018])[
// C++ GLR parser skeleton written by Akim Demaille.
]b4_disclaimer[
]b4_cpp_guard_open([b4_spec_defines_file])[
]b4_shared_declarations[
]b4_cpp_guard_close([b4_spec_defines_file])[ ]b4_cpp_guard_close([b4_spec_defines_file])[
]b4_output_end]) ]m4_divert_pop(0)
# Let glr.c (and b4_shared_declarations) believe that the user
# arguments include the parser itself.
m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_wrap]))
m4_include(b4_pkgdatadir/[glr.c])
m4_popdef([b4_parse_param])
+1 -1
View File
@@ -2,7 +2,7 @@
# Java skeleton dispatching for Bison. # Java skeleton dispatching for Bison.
# Copyright (C) 2007, 2009-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+18 -29
View File
@@ -2,7 +2,7 @@
# Java language support for Bison # Java language support for Bison
# Copyright (C) 2007-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -17,11 +17,16 @@
# 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/>.
m4_include(b4_pkgdatadir/[c-like.m4])
# b4_comment(TEXT)
# ----------------
m4_define([b4_comment], [/* m4_bpatsubst([$1], [
], [
]) */])
# b4_list2(LIST1, LIST2) # b4_list2(LIST1, LIST2)
# ---------------------- # --------------------------
# Join two lists with a comma if necessary. # Join two lists with a comma if necessary.
m4_define([b4_list2], m4_define([b4_list2],
[$1[]m4_ifval(m4_quote($1), [m4_ifval(m4_quote($2), [[, ]])])[]$2]) [$1[]m4_ifval(m4_quote($1), [m4_ifval(m4_quote($2), [[, ]])])[]$2])
@@ -103,7 +108,7 @@ m4_define([b4_int_type],
# b4_int_type_for(NAME) # b4_int_type_for(NAME)
# --------------------- # ---------------------
# Return the smallest int type able to handle numbers ranging from # Return the smallest int type able to handle numbers ranging from
# 'NAME_min' to 'NAME_max' (included). # `NAME_min' to `NAME_max' (included).
m4_define([b4_int_type_for], m4_define([b4_int_type_for],
[b4_int_type($1_min, $1_max)]) [b4_int_type($1_min, $1_max)])
@@ -169,28 +174,12 @@ m4_define([b4_predicate_case], [ case $1:
]) ])
## -------- ##
## Checks. ##
## -------- ##
b4_percent_define_check_kind([[api.value.type]], [code], [deprecated])
b4_percent_define_check_kind([[annotations]], [code], [deprecated])
b4_percent_define_check_kind([[extends]], [code], [deprecated])
b4_percent_define_check_kind([[implements]], [code], [deprecated])
b4_percent_define_check_kind([[init_throws]], [code], [deprecated])
b4_percent_define_check_kind([[lex_throws]], [code], [deprecated])
b4_percent_define_check_kind([[parser_class_name]], [code], [deprecated])
b4_percent_define_check_kind([[throws]], [code], [deprecated])
## ---------------- ## ## ---------------- ##
## Default values. ## ## Default values. ##
## ---------------- ## ## ---------------- ##
m4_define([b4_yystype], [b4_percent_define_get([[api.value.type]])]) m4_define([b4_yystype], [b4_percent_define_get([[stype]])])
b4_percent_define_default([[api.value.type]], [[Object]]) b4_percent_define_default([[stype]], [[Object]])
# %name-prefix # %name-prefix
m4_define_default([b4_prefix], [[YY]]) m4_define_default([b4_prefix], [[YY]])
@@ -207,11 +196,11 @@ m4_define([b4_throws], [b4_percent_define_get([[throws]])])
b4_percent_define_default([[init_throws]], []) b4_percent_define_default([[init_throws]], [])
m4_define([b4_init_throws], [b4_percent_define_get([[init_throws]])]) m4_define([b4_init_throws], [b4_percent_define_get([[init_throws]])])
b4_percent_define_default([[api.location.type]], [Location]) b4_percent_define_default([[location_type]], [Location])
m4_define([b4_location_type], [b4_percent_define_get([[api.location.type]])]) m4_define([b4_location_type], [b4_percent_define_get([[location_type]])])
b4_percent_define_default([[api.position.type]], [Position]) b4_percent_define_default([[position_type]], [Position])
m4_define([b4_position_type], [b4_percent_define_get([[api.position.type]])]) m4_define([b4_position_type], [b4_percent_define_get([[position_type]])])
## ----------------- ## ## ----------------- ##
@@ -271,7 +260,7 @@ m4_define([b4_lex_param_decl],
[$1])]) [$1])])
m4_define([b4_param_decls], m4_define([b4_param_decls],
[m4_map([b4_param_decl], [$@])]) [m4_map_args([b4_param_decl], $@)])
m4_define([b4_param_decl], [, $1]) m4_define([b4_param_decl], [, $1])
m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)]) m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)])
@@ -298,7 +287,7 @@ m4_define([b4_lex_param_call],
b4_param_calls(b4_lex_param))], b4_param_calls(b4_lex_param))],
[$1])]) [$1])])
m4_define([b4_param_calls], m4_define([b4_param_calls],
[m4_map([b4_param_call], [$@])]) [m4_map_args([b4_param_call], $@)])
m4_define([b4_param_call], [, $2]) m4_define([b4_param_call], [, $2])
@@ -311,7 +300,7 @@ m4_define([b4_parse_param_cons],
[b4_constructor_calls(b4_parse_param)])]) [b4_constructor_calls(b4_parse_param)])])
m4_define([b4_constructor_calls], m4_define([b4_constructor_calls],
[m4_map([b4_constructor_call], [$@])]) [m4_map_args([b4_constructor_call], $@)])
m4_define([b4_constructor_call], m4_define([b4_constructor_call],
[this.$2 = $2; [this.$2 = $2;
]) ])
+346 -459
View File
File diff suppressed because it is too large Load Diff
+102 -286
View File
@@ -1,6 +1,6 @@
# Java skeleton for Bison -*- autoconf -*- # Java skeleton for Bison -*- autoconf -*-
# Copyright (C) 2007-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -20,8 +20,7 @@ m4_include(b4_pkgdatadir/[java.m4])
b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java],
[b4_skeleton])]) [b4_skeleton])])
# We do not depend on %debug in Java, but pacify warnings about # We don't depend on %debug in Java, but pacify warnings about non-used flags.
# non-used flags.
b4_parse_trace_if([0], [0]) b4_parse_trace_if([0], [0])
m4_define([b4_symbol_no_destructor_assert], m4_define([b4_symbol_no_destructor_assert],
@@ -31,65 +30,16 @@ m4_define([b4_symbol_no_destructor_assert],
[b4_symbol_action_location([$1], [destructor])])])]) [b4_symbol_action_location([$1], [destructor])])])])
b4_symbol_foreach([b4_symbol_no_destructor_assert]) b4_symbol_foreach([b4_symbol_no_destructor_assert])
# Setup some macros for api.push-pull. m4_divert_push(0)dnl
b4_percent_define_default([[api.push-pull]], [[pull]]) @output(b4_parser_file_name@)@
b4_percent_define_check_values([[[[api.push-pull]], b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
[[pull]], [[push]], [[both]]]]) [2007-2012])
# Define m4 conditional macros that encode the value b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
# of the api.push-pull flag. ])[/* First part of user declarations. */
b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]]) ]b4_user_pre_prologue
b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]]) b4_user_post_prologue
m4_case(b4_percent_define_get([[api.push-pull]]), b4_percent_code_get([[imports]])
[pull], [m4_define([b4_push_flag], [[0]])],
[push], [m4_define([b4_pull_flag], [[0]])])
# Define a macro to be true when api.push-pull has the value "both".
m4_define([b4_both_if],[b4_push_if([b4_pull_if([$1],[$2])],[$2])])
# Handle BISON_USE_PUSH_FOR_PULL for the test suite. So that push parsing
# tests function as written, do not let BISON_USE_PUSH_FOR_PULL modify the
# behavior of Bison at all when push parsing is already requested.
b4_define_flag_if([use_push_for_pull])
b4_use_push_for_pull_if([
b4_push_if([m4_define([b4_use_push_for_pull_flag], [[0]])],
[m4_define([b4_push_flag], [[1]])])])
# Define a macro to encapsulate the parse state variables.
# This allows them to be defined either in parse() when doing
# pull parsing, or as class instance variable when doing push parsing.
m4_define([b4_define_state],[[
/* Lookahead and lookahead in internal form. */
int yychar = yyempty_;
int yytoken = 0;
/* State. */
int yyn = 0;
int yylen = 0;
int yystate = 0;
YYStack yystack = new YYStack ();
int label = YYNEWSTATE;
/* Error handling. */
int yynerrs_ = 0;
]b4_locations_if([/* The location where the error started. */
b4_location_type yyerrloc = null;
/* Location. */
b4_location_type yylloc = new b4_location_type (null, null);])[
/* Semantic value of the lookahead. */
]b4_yystype[ yylval = null;
]])
b4_output_begin([b4_parser_file_name])[
]b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
[2007-2015, 2018])[
]b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);[
]])[
]b4_user_pre_prologue[
]b4_user_post_prologue[
]b4_percent_code_get([[imports]])
[/** [/**
* A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>. * A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
* *
@@ -106,9 +56,7 @@ b4_percent_define_get3([implements], [ implements ])[
{ {
]b4_identification[ ]b4_identification[
]b4_error_verbose_if([[ ]b4_error_verbose_if([[
/** /** True if verbose error messages are enabled. */
* True if verbose error messages are enabled.
*/
private boolean yyErrorVerbose = true; private boolean yyErrorVerbose = true;
/** /**
@@ -129,24 +77,18 @@ b4_locations_if([[
* A class defining a pair of positions. Positions, defined by the * A class defining a pair of positions. Positions, defined by the
* <code>]b4_position_type[</code> class, denote a point in the input. * <code>]b4_position_type[</code> class, denote a point in the input.
* Locations represent a part of the input through the beginning * Locations represent a part of the input through the beginning
* and ending positions. * and ending positions. */
*/
public class ]b4_location_type[ { public class ]b4_location_type[ {
/** /** The first, inclusive, position in the range. */
* The first, inclusive, position in the range.
*/
public ]b4_position_type[ begin; public ]b4_position_type[ begin;
/** /** The first position beyond the range. */
* The first position beyond the range.
*/
public ]b4_position_type[ end; public ]b4_position_type[ end;
/** /**
* Create a <code>]b4_location_type[</code> denoting an empty range located at * Create a <code>]b4_location_type[</code> denoting an empty range located at
* a given point. * a given point.
* @@param loc The position at which the range is anchored. * @@param loc The position at which the range is anchored. */
*/
public ]b4_location_type[ (]b4_position_type[ loc) { public ]b4_location_type[ (]b4_position_type[ loc) {
this.begin = this.end = loc; this.begin = this.end = loc;
} }
@@ -154,8 +96,7 @@ b4_locations_if([[
/** /**
* Create a <code>]b4_location_type[</code> from the endpoints of the range. * Create a <code>]b4_location_type[</code> from the endpoints of the range.
* @@param begin The first position included in the range. * @@param begin The first position included in the range.
* @@param end The first position beyond the range. * @@param end The first position beyond the range. */
*/
public ]b4_location_type[ (]b4_position_type[ begin, ]b4_position_type[ end) { public ]b4_location_type[ (]b4_position_type[ begin, ]b4_position_type[ end) {
this.begin = begin; this.begin = begin;
this.end = end; this.end = end;
@@ -164,8 +105,7 @@ b4_locations_if([[
/** /**
* Print a representation of the location. For this to be correct, * Print a representation of the location. For this to be correct,
* <code>]b4_position_type[</code> should override the <code>equals</code> * <code>]b4_position_type[</code> should override the <code>equals</code>
* method. * method. */
*/
public String toString () { public String toString () {
if (begin.equals (end)) if (begin.equals (end))
return begin.toString (); return begin.toString ();
@@ -197,28 +137,24 @@ b4_locations_if([[
]b4_locations_if([[/** ]b4_locations_if([[/**
* Method to retrieve the beginning position of the last scanned token. * Method to retrieve the beginning position of the last scanned token.
* @@return the position at which the last scanned token starts. * @@return the position at which the last scanned token starts. */
*/
]b4_position_type[ getStartPos (); ]b4_position_type[ getStartPos ();
/** /**
* Method to retrieve the ending position of the last scanned token. * Method to retrieve the ending position of the last scanned token.
* @@return the first position beyond the last scanned token. * @@return the first position beyond the last scanned token. */
*/
]b4_position_type[ getEndPos ();]])[ ]b4_position_type[ getEndPos ();]])[
/** /**
* Method to retrieve the semantic value of the last scanned token. * Method to retrieve the semantic value of the last scanned token.
* @@return the semantic value of the last scanned token. * @@return the semantic value of the last scanned token. */
*/
]b4_yystype[ getLVal (); ]b4_yystype[ getLVal ();
/** /**
* Entry point for the scanner. Returns the token identifier corresponding * Entry point for the scanner. Returns the token identifier corresponding
* to the next token and prepares to return the semantic value * to the next token and prepares to return the semantic value
* ]b4_locations_if([and beginning/ending positions ])[of the token. * ]b4_locations_if([and beginning/ending positions ])[of the token.
* @@return the token identifier corresponding to the next token. * @@return the token identifier corresponding to the next token. */
*/
int yylex () ]b4_maybe_throws([b4_lex_throws])[; int yylex () ]b4_maybe_throws([b4_lex_throws])[;
/** /**
@@ -227,8 +163,7 @@ b4_locations_if([[
* *
* ]b4_locations_if([[@@param loc The location of the element to which the * ]b4_locations_if([[@@param loc The location of the element to which the
* error message is related]])[ * error message is related]])[
* @@param msg The string for the error message. * @@param msg The string for the error message. */
*/
void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);] void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);]
} }
@@ -236,9 +171,7 @@ b4_locations_if([[
]b4_percent_code_get([[lexer]])[ ]b4_percent_code_get([[lexer]])[
} }
]])[/** ]])[/** The object doing lexical analysis for us. */
* The object doing lexical analysis for us.
*/
private Lexer yylexer; private Lexer yylexer;
] ]
b4_parse_param_vars b4_parse_param_vars
@@ -404,74 +337,46 @@ b4_lexer_if([[
/** /**
* Returned by a Bison action in order to stop the parsing process and * Returned by a Bison action in order to stop the parsing process and
* return success (<tt>true</tt>). * return success (<tt>true</tt>). */
*/
public static final int YYACCEPT = 0; public static final int YYACCEPT = 0;
/** /**
* Returned by a Bison action in order to stop the parsing process and * Returned by a Bison action in order to stop the parsing process and
* return failure (<tt>false</tt>). * return failure (<tt>false</tt>). */
*/
public static final int YYABORT = 1; public static final int YYABORT = 1;
]b4_push_if([
/**
* Returned by a Bison action in order to request a new token.
*/
public static final int YYPUSH_MORE = 4;])[
/** /**
* Returned by a Bison action in order to start error recovery without * Returned by a Bison action in order to start error recovery without
* printing an error message. * printing an error message. */
*/
public static final int YYERROR = 2; public static final int YYERROR = 2;
/** // Internal return codes that are not supported for user semantic
* Internal return codes that are not supported for user semantic // actions.
* actions.
*/
private static final int YYERRLAB = 3; private static final int YYERRLAB = 3;
private static final int YYNEWSTATE = 4; private static final int YYNEWSTATE = 4;
private static final int YYDEFAULT = 5; private static final int YYDEFAULT = 5;
private static final int YYREDUCE = 6; private static final int YYREDUCE = 6;
private static final int YYERRLAB1 = 7; private static final int YYERRLAB1 = 7;
private static final int YYRETURN = 8; private static final int YYRETURN = 8;
]b4_push_if([[ private static final int YYGETTOKEN = 9; /* Signify that a new token is expected when doing push-parsing. */]])[
private int yyerrstatus_ = 0; private int yyerrstatus_ = 0;
]b4_push_if([dnl
b4_define_state])[
/** /**
* Return whether error recovery is being done. In this state, the parser * Return whether error recovery is being done. In this state, the parser
* reads token until it reaches a known state, and then restarts normal * reads token until it reaches a known state, and then restarts normal
* operation. * operation. */
*/
public final boolean recovering () public final boolean recovering ()
{ {
return yyerrstatus_ == 0; return yyerrstatus_ == 0;
} }
/** Compute post-reduction state.
* @@param yystate the current state
* @@param yysym the nonterminal to push on the stack
*/
private int yy_lr_goto_state_ (int yystate, int yysym)
{
int yyr = yypgoto_[yysym - yyntokens_] + yystate;
if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
return yytable_[yyr];
else
return yydefgoto_[yysym - yyntokens_];
}
private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[ private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[
{ {
]b4_yystype[ yyval; ]b4_yystype[ yyval;
]b4_locations_if([b4_location_type[ yyloc = yylloc (yystack, yylen);]])[ ]b4_locations_if([b4_location_type[ yyloc = yylloc (yystack, yylen);]])[
/* If YYLEN is nonzero, implement the default value of the action: /* If YYLEN is nonzero, implement the default value of the action:
'$$ = $1'. Otherwise, use the top of the stack. `$$ = $1'. Otherwise, use the top of the stack.
Otherwise, the following line sets YYVAL to garbage. Otherwise, the following line sets YYVAL to garbage.
This behavior is undocumented and Bison This behavior is undocumented and Bison
@@ -495,7 +400,14 @@ b4_define_state])[
yylen = 0; yylen = 0;
/* Shift the result of the reduction. */ /* Shift the result of the reduction. */
int yystate = yy_lr_goto_state_ (yystack.stateAt (0), yyr1_[yyn]); yyn = yyr1_[yyn];
int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
if (0 <= yystate && yystate <= yylast_
&& yycheck_[yystate] == yystack.stateAt (0))
yystate = yytable_[yystate];
else
yystate = yydefgoto_[yyn - yyntokens_];
yystack.push (yystate, yyval]b4_locations_if([, yyloc])[); yystack.push (yystate, yyval]b4_locations_if([, yyloc])[);
return YYNEWSTATE; return YYNEWSTATE;
} }
@@ -552,7 +464,6 @@ b4_define_state])[
+ (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")"); + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
} }
]b4_push_if([],[[
/** /**
* Parse input from the scanner that was specified at object construction * Parse input from the scanner that was specified at object construction
* time. Return whether the end of the input was reached successfully. * time. Return whether the end of the input was reached successfully.
@@ -560,51 +471,48 @@ b4_define_state])[
* @@return <tt>true</tt> if the parsing succeeds. Note that this does not * @@return <tt>true</tt> if the parsing succeeds. Note that this does not
* imply that there were no syntax errors. * imply that there were no syntax errors.
*/ */
public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[]])[ public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[
]b4_push_if([
/**
* Push Parse input from external lexer
*
* @@param yylextoken current token
* @@param yylexval current lval
]b4_locations_if([ * @@param yylexloc current position])[
*
* @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
*/
public int push_parse (int yylextoken, b4_yystype yylexval[]b4_locations_if([, b4_location_type yylexloc]))
b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])])[
{ {
]b4_locations_if([/* @@$. */ /// Lookahead and lookahead in internal form.
b4_location_type yyloc;])[ int yychar = yyempty_;
]b4_push_if([],[[ int yytoken = 0;
]b4_define_state[
/* State. */
int yyn = 0;
int yylen = 0;
int yystate = 0;
YYStack yystack = new YYStack ();
/* Error handling. */
int yynerrs_ = 0;
]b4_locations_if([/// The location where the error started.
]b4_location_type[ yyerrloc = null;
/// ]b4_location_type[ of the lookahead.
]b4_location_type[ yylloc = new ]b4_location_type[ (null, null);
/// @@$.
]b4_location_type[ yyloc;])
/// Semantic value of the lookahead.
b4_yystype[ yylval = null;
yycdebug ("Starting parse\n"); yycdebug ("Starting parse\n");
yyerrstatus_ = 0; yyerrstatus_ = 0;
/* Initialize the stack. */
yystack.push (yystate, yylval ]b4_locations_if([, yylloc])[);
]m4_ifdef([b4_initial_action], [ ]m4_ifdef([b4_initial_action], [
b4_dollar_pushdef([yylval], [], [yylloc])dnl m4_pushdef([b4_at_dollar], [yylloc])dnl
m4_pushdef([b4_dollar_dollar], [yylval])dnl
/* User initialization code. */
b4_user_initial_action b4_user_initial_action
b4_dollar_popdef[]dnl m4_popdef([b4_dollar_dollar])dnl
])[ m4_popdef([b4_at_dollar])])dnl
]])[
]b4_push_if([[
if (!this.push_parse_initialized)
{
push_parse_initialize ();
]m4_ifdef([b4_initial_action], [
b4_dollar_pushdef([yylval], [], [yylloc])dnl
b4_user_initial_action
b4_dollar_popdef[]dnl
])[
yycdebug ("Starting parse\n");
yyerrstatus_ = 0;
} else
label = YYGETTOKEN;
boolean push_token_consumed = true; [ /* Initialize the stack. */
]])[ yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
int label = YYNEWSTATE;
for (;;) for (;;)
switch (label) switch (label)
{ {
@@ -617,8 +525,7 @@ b4_dollar_popdef[]dnl
/* Accept? */ /* Accept? */
if (yystate == yyfinal_) if (yystate == yyfinal_)
]b4_push_if([{label = YYACCEPT; break;}], return true;
[return true;])[
/* Take a decision. First try without lookahead. */ /* Take a decision. First try without lookahead. */
yyn = yypact_[yystate]; yyn = yypact_[yystate];
@@ -627,27 +534,16 @@ b4_dollar_popdef[]dnl
label = YYDEFAULT; label = YYDEFAULT;
break; break;
} }
]b4_push_if([ /* Fall Through */
case YYGETTOKEN:])[
/* Read a lookahead token. */ /* Read a lookahead token. */
if (yychar == yyempty_) if (yychar == yyempty_)
{ {
]b4_push_if([[
if (!push_token_consumed)
return YYPUSH_MORE;
yycdebug ("Reading a token: "); yycdebug ("Reading a token: ");
yychar = yylextoken; yychar = yylexer.yylex ();]
yylval = yylexval;]b4_locations_if([ b4_locations_if([[
yylloc = yylexloc;])[ yylloc = new ]b4_location_type[(yylexer.getStartPos (),
push_token_consumed = false;]])[ yylexer.getEndPos ());]])
]b4_push_if([],[[ yylval = yylexer.getLVal ();[
yycdebug ("Reading a token: ");
yychar = yylexer.yylex ();
yylval = yylexer.getLVal ();]b4_locations_if([
yylloc = new b4_location_type (yylexer.getStartPos (),
yylexer.getEndPos ());])[
]])[
} }
/* Convert token to internal form. */ /* Convert token to internal form. */
@@ -744,10 +640,10 @@ b4_dollar_popdef[]dnl
{ {
/* Return failure if at end of input. */ /* Return failure if at end of input. */
if (yychar == Lexer.EOF) if (yychar == Lexer.EOF)
]b4_push_if([{label = YYABORT; break;}],[return false;])[ return false;
} }
else else
yychar = yyempty_; yychar = yyempty_;
} }
/* Else will try to reuse lookahead token after shifting the error /* Else will try to reuse lookahead token after shifting the error
@@ -755,9 +651,9 @@ b4_dollar_popdef[]dnl
label = YYERRLAB1; label = YYERRLAB1;
break; break;
/*-------------------------------------------------. /*---------------------------------------------------.
| errorlab -- error raised explicitly by YYERROR. | | errorlab -- error raised explicitly by YYERROR. |
`-------------------------------------------------*/ `---------------------------------------------------*/
case YYERROR: case YYERROR:
]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[ ]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[
@@ -789,10 +685,9 @@ b4_dollar_popdef[]dnl
} }
} }
/* Pop the current state because it cannot handle the /* Pop the current state because it cannot handle the error token. */
* error token. */
if (yystack.height == 0) if (yystack.height == 0)
]b4_push_if([{label = YYABORT; break;}],[return false;])[ return false;
]b4_locations_if([yyerrloc = yystack.locationAt (0);])[ ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
yystack.pop (); yystack.pop ();
@@ -801,11 +696,7 @@ b4_dollar_popdef[]dnl
yystack.print (yyDebugStream); yystack.print (yyDebugStream);
} }
if (label == YYABORT) ]b4_locations_if([
/* Leave the switch. */
break;
]b4_locations_if([
/* Muck with the stack to setup for yylloc. */ /* Muck with the stack to setup for yylloc. */
yystack.push (0, null, yylloc); yystack.push (0, null, yylloc);
yystack.push (0, null, yyerrloc); yystack.push (0, null, yyerrloc);
@@ -823,91 +714,13 @@ b4_dollar_popdef[]dnl
/* Accept. */ /* Accept. */
case YYACCEPT: case YYACCEPT:
]b4_push_if([this.push_parse_initialized = false; return YYACCEPT;], return true;
[return true;])[
/* Abort. */ /* Abort. */
case YYABORT: case YYABORT:
]b4_push_if([this.push_parse_initialized = false; return YYABORT;], return false;
[return false;])[
} }
}
]b4_push_if([[
boolean push_parse_initialized = false;
/**
* (Re-)Initialize the state of the push parser.
*/
public void push_parse_initialize()
{
/* Lookahead and lookahead in internal form. */
this.yychar = yyempty_;
this.yytoken = 0;
/* State. */
this.yyn = 0;
this.yylen = 0;
this.yystate = 0;
this.yystack = new YYStack ();
this.label = YYNEWSTATE;
/* Error handling. */
this.yynerrs_ = 0;
]b4_locations_if([/* The location where the error started. */
this.yyerrloc = null;
this.yylloc = new b4_location_type (null, null);])[
/* Semantic value of the lookahead. */
this.yylval = null;
yystack.push (this.yystate, this.yylval]b4_locations_if([, this.yylloc])[);
this.push_parse_initialized = true;
} }
]b4_locations_if([
/**
* Push parse given input from an external lexer.
*
* @@param yylextoken current token
* @@param yylexval current lval
* @@param yyylexpos current position
*
* @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
*/
public int push_parse (int yylextoken, b4_yystype yylexval, b4_position_type yylexpos)
b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])
{
return push_parse (yylextoken, yylexval, new b4_location_type (yylexpos));
}
])[]])
b4_both_if([[
/**
* Parse input from the scanner that was specified at object construction
* time. Return whether the end of the input was reached successfully.
* This version of parse () is defined only when api.push-push=both.
*
* @@return <tt>true</tt> if the parsing succeeds. Note that this does not
* imply that there were no syntax errors.
*/
public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[
{
if (yylexer == null)
throw new NullPointerException("Null Lexer");
int status;
do {
int token = yylexer.yylex();
]b4_yystype[ lval = yylexer.getLVal();
]b4_locations_if([dnl
b4_location_type yyloc = new b4_location_type (yylexer.getStartPos (),
yylexer.getEndPos ());])[
]b4_locations_if([status = push_parse(token,lval,yyloc);],[
status = push_parse(token,lval);])[
} while (status == YYPUSH_MORE);
return (status == YYACCEPT);
}
]])[
// Generate an error message. // Generate an error message.
private String yysyntax_error (int yystate, int tok) private String yysyntax_error (int yystate, int tok)
@@ -915,6 +728,11 @@ b4_both_if([[
if (yyErrorVerbose) if (yyErrorVerbose)
{ {
/* There are many possibilities here to consider: /* There are many possibilities here to consider:
- Assume YYFAIL is not used. It's too flawed to consider.
See
<http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
for details. YYERROR is fine as it does not invoke this
function.
- If this state is a consistent state with a default action, - If this state is a consistent state with a default action,
then the only way this function was invoked is if the then the only way this function was invoked is if the
default action is an error action. In that case, don't default action is an error action. In that case, don't
@@ -942,8 +760,8 @@ b4_both_if([[
*/ */
if (tok != yyempty_) if (tok != yyempty_)
{ {
/* FIXME: This method of building the message is not compatible // FIXME: This method of building the message is not compatible
with internationalization. */ // with internationalization.
StringBuffer res = StringBuffer res =
new StringBuffer ("syntax error, unexpected "); new StringBuffer ("syntax error, unexpected ");
res.append (yytnamerr_ (yytname_[tok])); res.append (yytnamerr_ (yytname_[tok]));
@@ -992,9 +810,8 @@ b4_both_if([[
} }
/** /**
* Whether the given <code>yytable_</code> * Whether the given <code>yytable_</code> value indicates a syntax error.
* value indicates a syntax error. * @@param yyvalue the value to check
* @@param yyvalue the value to check
*/ */
private static boolean yy_table_value_is_error_ (int yyvalue) private static boolean yy_table_value_is_error_ (int yyvalue)
{ {
@@ -1006,16 +823,15 @@ b4_both_if([[
]b4_parser_tables_define[ ]b4_parser_tables_define[
]b4_integral_parser_table_define([token_number], [b4_toknum], ]b4_integral_parser_table_define([token_number], [b4_toknum],
[[YYTOKEN_NUMBER[YYLEX-NUM] -- Internal symbol number corresponding [TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
to YYLEX-NUM.]])[ to YYLEX-NUM.])[
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at \a yyntokens_, nonterminals. */ First, the terminals, then, starting at \a yyntokens_, nonterminals. */
]b4_typed_parser_table_define([String], [tname], [b4_tname])[ ]b4_typed_parser_table_define([String], [tname], [b4_tname])[
]b4_integral_parser_table_define([rline], [b4_rline], ]b4_integral_parser_table_define([rline], [b4_rline],
[[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[ [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
// Report on the debug stream that the rule yyrule is going to be reduced. // Report on the debug stream that the rule yyrule is going to be reduced.
private void yy_reduce_print (int yyrule, YYStack yystack) private void yy_reduce_print (int yyrule, YYStack yystack)
@@ -1065,4 +881,4 @@ b4_percent_code_get[]dnl
} }
b4_epilogue[]dnl b4_epilogue[]dnl
b4_output_end m4_divert_pop(0)dnl
+1 -2
View File
@@ -1,4 +1,4 @@
## Copyright (C) 2002, 2005-2015, 2018 Free Software Foundation, Inc. ## Copyright (C) 2002, 2005-2012 Free Software Foundation, Inc.
## This program is free software: you can redistribute it and/or modify ## 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 ## it under the terms of the GNU General Public License as published by
@@ -18,7 +18,6 @@ dist_pkgdata_DATA = \
data/bison.m4 \ data/bison.m4 \
data/c++-skel.m4 \ data/c++-skel.m4 \
data/c++.m4 \ data/c++.m4 \
data/c-like.m4 \
data/c-skel.m4 \ data/c-skel.m4 \
data/c.m4 \ data/c.m4 \
data/glr.c \ data/glr.c \
+104 -167
View File
@@ -1,6 +1,6 @@
# C++ skeleton for Bison # C++ skeleton for Bison
# Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2002-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -16,67 +16,48 @@
# 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_pushdef([b4_copyright_years], m4_pushdef([b4_copyright_years],
[2002-2015, 2018]) [2002-2012])
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert_push(0)dnl
@output(b4_dir_prefix[]position.hh@)@
b4_copyright([Positions for Bison parsers in C++])[
# b4_position_file /**
# ---------------- ** \file ]b4_dir_prefix[position.hh
# Name of the file containing the position class, if we want this file. ** Define the ]b4_namespace_ref[::position class.
b4_defines_if([b4_required_version_if([302], [], */
[m4_define([b4_position_file], [position.hh])])])])
]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[
# b4_location_file # include <algorithm> // std::max
# ---------------- # include <iosfwd>
# Name of the file containing the position/location class, # include <string>
# if we want this file.
b4_percent_define_check_file([b4_location_file],
[[api.location.file]],
b4_defines_if([[location.hh]]))
# b4_location_include ]b4_null_define[
# -------------------
# If location.hh is to be generated, the name under which should it be
# included.
#
# b4_location_path
# ----------------
# The path to use for the CPP guard.
m4_ifdef([b4_location_file],
[m4_define([b4_location_include],
[b4_percent_define_get([[api.location.include]],
["b4_location_file"])])
m4_define([b4_location_path],
b4_percent_define_get([[api.location.include]],
["b4_dir_prefix[]b4_location_file"]))
m4_define([b4_location_path],
m4_substr(m4_defn([b4_location_path]), 1, m4_eval(m4_len(m4_defn([b4_location_path])) - 2)))
])
]b4_namespace_open[
/// Abstract a position.
# b4_location_define
# ------------------
# Define the position and location classes.
m4_define([b4_location_define],
[[ /// A point in a source file.
class position class position
{ {
public:]m4_ifdef([b4_location_constructors], [[ public:
]m4_ifdef([b4_location_constructors], [[
/// Construct a position. /// Construct a position.
explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR, explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULL,
unsigned l = ]b4_location_initial_line[u, unsigned int l = ]b4_location_initial_line[u,
unsigned c = ]b4_location_initial_column[u) unsigned int c = ]b4_location_initial_column[u)
: filename (f) : filename (f)
, line (l) , line (l)
, column (c) , column (c)
{} {
}
]])[ ]])[
/// Initialization. /// Initialization.
void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULLPTR, void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULL,
unsigned l = ]b4_location_initial_line[u, unsigned int l = ]b4_location_initial_line[u,
unsigned c = ]b4_location_initial_column[u) unsigned int c = ]b4_location_initial_column[u)
{ {
filename = fn; filename = fn;
line = l; line = l;
@@ -88,63 +69,53 @@ m4_define([b4_location_define],
/// (line related) Advance to the COUNT next lines. /// (line related) Advance to the COUNT next lines.
void lines (int count = 1) void lines (int count = 1)
{ {
if (count) column = ]b4_location_initial_column[u;
{ line += count;
column = ]b4_location_initial_column[u;
line = add_ (line, count, ]b4_location_initial_line[);
}
} }
/// (column related) Advance to the COUNT next columns. /// (column related) Advance to the COUNT next columns.
void columns (int count = 1) void columns (int count = 1)
{ {
column = add_ (column, count, ]b4_location_initial_column[); column = std::max (]b4_location_initial_column[u, column + count);
} }
/** \} */ /** \} */
/// File name to which this position refers. /// File name to which this position refers.
]b4_percent_define_get([[filename_type]])[* filename; ]b4_percent_define_get([[filename_type]])[* filename;
/// Current line number. /// Current line number.
unsigned line; unsigned int line;
/// Current column number. /// Current column number.
unsigned column; unsigned int column;
private:
/// Compute max (min, lhs+rhs).
static unsigned add_ (unsigned lhs, int rhs, int min)
{
return static_cast<unsigned> (std::max (min,
static_cast<int> (lhs) + rhs));
}
}; };
/// Add \a width columns, in place. /// Add and assign a position.
inline position& inline const position&
operator+= (position& res, int width) operator+= (position& res, const int width)
{ {
res.columns (width); res.columns (width);
return res; return res;
} }
/// Add \a width columns. /// Add two position objects.
inline position inline const position
operator+ (position res, int width) operator+ (const position& begin, const int width)
{ {
position res = begin;
return res += width; return res += width;
} }
/// Subtract \a width columns, in place. /// Add and assign a position.
inline position& inline const position&
operator-= (position& res, int width) operator-= (position& res, const int width)
{ {
return res += -width; return res += -width;
} }
/// Subtract \a width columns. /// Add two position objects.
inline position inline const position
operator- (position res, int width) operator- (const position& begin, const int width)
{ {
return res -= width; return begin + -width;
} }
]b4_percent_define_flag_if([[define_location_comparison]], [[ ]b4_percent_define_flag_if([[define_location_comparison]], [[
/// Compare two position objects. /// Compare two position objects.
@@ -169,16 +140,33 @@ m4_define([b4_location_define],
** \param ostr the destination output stream ** \param ostr the destination output stream
** \param pos a reference to the position to redirect ** \param pos a reference to the position to redirect
*/ */
template <typename YYChar> inline std::ostream&
std::basic_ostream<YYChar>& operator<< (std::ostream& ostr, const position& pos)
operator<< (std::basic_ostream<YYChar>& ostr, const position& pos)
{ {
if (pos.filename) if (pos.filename)
ostr << *pos.filename << ':'; ostr << *pos.filename << ':';
return ostr << pos.line << '.' << pos.column; return ostr << pos.line << '.' << pos.column;
} }
/// Two points in a source file. ]b4_namespace_close[
]b4_cpp_guard_close([b4_dir_prefix[]position.hh])
@output(b4_dir_prefix[]location.hh@)@
b4_copyright([Locations for Bison parsers in C++])[
/**
** \file ]b4_dir_prefix[location.hh
** Define the ]b4_namespace_ref[::location class.
*/
]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[
# include <iostream>
# include <string>
# include "position.hh"
]b4_namespace_open[
/// Abstract a location.
class location class location
{ {
public: public:
@@ -187,27 +175,30 @@ m4_define([b4_location_define],
location (const position& b, const position& e) location (const position& b, const position& e)
: begin (b) : begin (b)
, end (e) , end (e)
{} {
}
/// Construct a 0-width location in \a p. /// Construct a 0-width location in \a p.
explicit location (const position& p = position ()) explicit location (const position& p = position ())
: begin (p) : begin (p)
, end (p) , end (p)
{} {
}
/// Construct a 0-width location in \a f, \a l, \a c. /// Construct a 0-width location in \a f, \a l, \a c.
explicit location (]b4_percent_define_get([[filename_type]])[* f, explicit location (]b4_percent_define_get([[filename_type]])[* f,
unsigned l = ]b4_location_initial_line[u, unsigned int l = ]b4_location_initial_line[u,
unsigned c = ]b4_location_initial_column[u) unsigned int c = ]b4_location_initial_column[u)
: begin (f, l, c) : begin (f, l, c)
, end (f, l, c) , end (f, l, c)
{} {
}
])[ ])[
/// Initialization. /// Initialization.
void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR, void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULL,
unsigned l = ]b4_location_initial_line[u, unsigned int l = ]b4_location_initial_line[u,
unsigned c = ]b4_location_initial_column[u) unsigned int c = ]b4_location_initial_column[u)
{ {
begin.initialize (f, l, c); begin.initialize (f, l, c);
end = begin; end = begin;
@@ -223,13 +214,13 @@ m4_define([b4_location_define],
} }
/// Extend the current location to the COUNT next columns. /// Extend the current location to the COUNT next columns.
void columns (int count = 1) void columns (unsigned int count = 1)
{ {
end += count; end += count;
} }
/// Extend the current location to the COUNT next lines. /// Extend the current location to the COUNT next lines.
void lines (int count = 1) void lines (unsigned int count = 1)
{ {
end.lines (count); end.lines (count);
} }
@@ -243,42 +234,27 @@ m4_define([b4_location_define],
position end; position end;
}; };
/// Join two locations, in place. /// Join two location objects to create a location.
inline location& operator+= (location& res, const location& end) inline const location operator+ (const location& begin, const location& end)
{ {
location res = begin;
res.end = end.end; res.end = end.end;
return res; return res;
} }
/// Join two locations. /// Add two location objects.
inline location operator+ (location res, const location& end) inline const location operator+ (const location& begin, unsigned int width)
{
return res += end;
}
/// Add \a width columns to the end position, in place.
inline location& operator+= (location& res, int width)
{ {
location res = begin;
res.columns (width); res.columns (width);
return res; return res;
} }
/// Add \a width columns to the end position. /// Add and assign a location.
inline location operator+ (location res, int width) inline location& operator+= (location& res, unsigned int width)
{ {
return res += width; res.columns (width);
} return res;
/// Subtract \a width columns to the end position, in place.
inline location& operator-= (location& res, int width)
{
return res += -width;
}
/// Subtract \a width columns to the end position.
inline location operator- (location res, int width)
{
return res -= width;
} }
]b4_percent_define_flag_if([[define_location_comparison]], [[ ]b4_percent_define_flag_if([[define_location_comparison]], [[
/// Compare two location objects. /// Compare two location objects.
@@ -301,63 +277,24 @@ m4_define([b4_location_define],
** **
** Avoid duplicate information. ** Avoid duplicate information.
*/ */
template <typename YYChar> inline std::ostream& operator<< (std::ostream& ostr, const location& loc)
std::basic_ostream<YYChar>&
operator<< (std::basic_ostream<YYChar>& ostr, const location& loc)
{ {
unsigned end_col = 0 < loc.end.column ? loc.end.column - 1 : 0; position last = loc.end - 1;
ostr << loc.begin; ostr << loc.begin;
if (loc.end.filename if (last.filename
&& (!loc.begin.filename && (!loc.begin.filename
|| *loc.begin.filename != *loc.end.filename)) || *loc.begin.filename != *last.filename))
ostr << '-' << loc.end.filename << ':' << loc.end.line << '.' << end_col; ostr << '-' << last;
else if (loc.begin.line < loc.end.line) else if (loc.begin.line != last.line)
ostr << '-' << loc.end.line << '.' << end_col; ostr << '-' << last.line << '.' << last.column;
else if (loc.begin.column < end_col) else if (loc.begin.column != last.column)
ostr << '-' << end_col; ostr << '-' << last.column;
return ostr; return ostr;
} }
]])
m4_ifdef([b4_position_file], [[
]b4_output_begin([b4_dir_prefix], [b4_position_file])[
]b4_generated_by[
// Starting with Bison 3.2, this file is useless: the structure it
// used to define is now defined in "]b4_location_file[".
//
// To get rid of this file:
// 1. add 'require "3.2"' (or newer) to your grammar file
// 2. remove references to this file from your build system
// 3. if you used to include it, include "]b4_location_file[" instead.
#include ]b4_location_include[
]b4_output_end[
]])
m4_ifdef([b4_location_file], [[
]b4_output_begin([b4_dir_prefix], [b4_location_file])[
]b4_copyright([Locations for Bison parsers in C++])[
/**
** \file ]b4_location_path[
** Define the ]b4_namespace_ref[::location class.
*/
]b4_cpp_guard_open([b4_location_path])[
# include <algorithm> // std::max
# include <iostream>
# include <string>
]b4_null_define[
]b4_namespace_open[
]b4_location_define[
]b4_namespace_close[ ]b4_namespace_close[
]b4_cpp_guard_close([b4_location_path])[
]b4_output_end[
]])
]b4_cpp_guard_close([b4_dir_prefix[]location.hh])
m4_popdef([b4_copyright_years]) m4_divert_pop(0)
m4_popdef([b4_copyright_years])dnl
m4_changecom([#])
+55 -77
View File
@@ -1,6 +1,6 @@
# C++ skeleton for Bison # C++ skeleton for Bison
# Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2002-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -15,102 +15,87 @@
# 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/>.
m4_pushdef([b4_copyright_years],
[2002-2012])
# b4_stack_file # We do want M4 expansion after # for CPP macros.
# ------------- m4_changecom()
# Name of the file containing the stack class, if we want this file. m4_divert_push(0)dnl
b4_defines_if([b4_required_version_if([302], [], @output(b4_dir_prefix[]stack.hh@)@
[m4_define([b4_stack_file], [stack.hh])])]) b4_copyright([Stack handling for Bison parsers in C++])[
/**
** \file ]b4_dir_prefix[stack.hh
** Define the ]b4_namespace_ref[::stack class.
*/
# b4_stack_define ]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
# ---------------
m4_define([b4_stack_define], # include <deque>
[[ /// A stack with random access from its top.
template <typename T, typename S = std::vector<T> > ]b4_namespace_open[
template <class T, class S = std::deque<T> >
class stack class stack
{ {
public: public:
// Hide our reversed order. // Hide our reversed order.
typedef typename S::reverse_iterator iterator; typedef typename S::reverse_iterator iterator;
typedef typename S::const_reverse_iterator const_iterator; typedef typename S::const_reverse_iterator const_iterator;
typedef typename S::size_type size_type;
stack (size_type n = 200) stack ()
: seq_ ()
{
}
stack (unsigned int n)
: seq_ (n) : seq_ (n)
{} {
}
/// Random access. inline
///
/// Index 0 returns the topmost element.
T& T&
operator[] (size_type i) operator [] (unsigned int i)
{ {
return seq_[size () - 1 - i]; return seq_[i];
} }
/// Random access. inline
///
/// Index 0 returns the topmost element.
T&
operator[] (int i)
{
return operator[] (size_type (i));
}
/// Random access.
///
/// Index 0 returns the topmost element.
const T& const T&
operator[] (size_type i) const operator [] (unsigned int i) const
{ {
return seq_[size () - 1 - i]; return seq_[i];
} }
/// Random access. inline
///
/// Index 0 returns the topmost element.
const T&
operator[] (int i) const
{
return operator[] (size_type (i));
}
/// Steal the contents of \a t.
///
/// Close to move-semantics.
void void
push (YY_MOVE_REF (T) t) push (const T& t)
{ {
seq_.push_back (T ()); seq_.push_front (t);
operator[](0).move (t);
} }
inline
void void
pop (int n = 1) pop (unsigned int n = 1)
{ {
for (; 0 < n; --n) for (; n; --n)
seq_.pop_back (); seq_.pop_front ();
} }
void inline
clear () typename S::size_type
{
seq_.clear ();
}
size_type
size () const size () const
{ {
return seq_.size (); return seq_.size ();
} }
inline
const_iterator const_iterator
begin () const begin () const
{ {
return seq_.rbegin (); return seq_.rbegin ();
} }
inline
const_iterator const_iterator
end () const end () const
{ {
@@ -118,42 +103,35 @@ m4_define([b4_stack_define],
} }
private: private:
stack (const stack&);
stack& operator= (const stack&);
/// The wrapped container. /// The wrapped container.
S seq_; S seq_;
}; };
/// Present a slice of the top of a stack. /// Present a slice of the top of a stack.
template <typename T, typename S = stack<T> > template <class T, class S = stack<T> >
class slice class slice
{ {
public: public:
slice (const S& stack, int range) slice (const S& stack, unsigned int range)
: stack_ (stack) : stack_ (stack)
, range_ (range) , range_ (range)
{} {
}
inline
const T& const T&
operator[] (int i) const operator [] (unsigned int i) const
{ {
return stack_[range_ - i]; return stack_[range_ - i];
} }
private: private:
const S& stack_; const S& stack_;
int range_; unsigned int range_;
}; };
]]) ]b4_namespace_close[
m4_ifdef([b4_stack_file], ]b4_cpp_guard_close([b4_dir_prefix[]stack.hh])
[b4_output_begin([b4_dir_prefix], [b4_stack_file])[ m4_divert_pop(0)
]b4_generated_by[ m4_popdef([b4_copyright_years])dnl
// Starting with Bison 3.2, this file is useless: the structure it m4_changecom([#])
// used to define is now defined with the parser itself.
//
// To get rid of this file:
// 1. add 'require "3.2"' (or newer) to your grammar file
// 2. remove references to this file from your build system.
]b4_output_end[
]])
+96 -267
View File
@@ -1,6 +1,6 @@
# C++ skeleton for Bison # C++ skeleton for Bison
# Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2002-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -26,10 +26,10 @@
# YYTYPE. # YYTYPE.
m4_define([b4_symbol_variant], m4_define([b4_symbol_variant],
[m4_pushdef([b4_dollar_dollar], [m4_pushdef([b4_dollar_dollar],
[$2.$3< $][3 > (m4_shift3($@))])dnl [$2.$3< $][3 >(m4_shift3($@))])dnl
switch ($1) switch ($1)
{ {
b4_type_foreach([_b4_type_action])[]dnl b4_type_foreach([b4_type_action_])[]dnl
default: default:
break; break;
} }
@@ -51,238 +51,134 @@ m4_define([_b4_char_sizeof_dummy],
dummy[]_b4_char_sizeof_counter]) dummy[]_b4_char_sizeof_counter])
# b4_char_sizeof_(SYMBOL-NUM)
# ---------------------------
# A comment describing this symbol.
m4_define([b4_char_sizeof_],
[ // b4_symbol([$1], [tag])
])
# b4_char_sizeof(SYMBOL-NUMS) # b4_char_sizeof(SYMBOL-NUMS)
# --------------------------- # ---------------------------
# To be mapped on the list of type names to produce: # To be mapped on the list of type names to produce:
# #
# char dummy1[sizeof (type_name_1)]; # char dummy1[sizeof(type_name_1)];
# char dummy2[sizeof (type_name_2)]; # char dummy2[sizeof(type_name_2)];
# #
# for defined type names. # for defined type names.
m4_define([b4_char_sizeof], m4_define([b4_char_sizeof],
[b4_symbol_if([$1], [has_type], [b4_symbol_if([$1], [has_type],
[ [
m4_map([ b4_symbol_tag_comment], [$@])dnl m4_map_args([b4_char_sizeof_], $@)dnl
char _b4_char_sizeof_dummy@{sizeof (b4_symbol([$1], [type]))@}; char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type])])@};
])]) ])])
# b4_variant_includes
# -------------------
# The needed includes for variants support.
m4_define([b4_variant_includes],
[b4_parse_assert_if([[#include <typeinfo>]])[
#ifndef YYASSERT
# include <cassert>
# define YYASSERT assert
#endif
]])
# b4_variant_define # b4_variant_define
# ----------------- # -----------------
# Define "variant". # Define "variant".
m4_define([b4_variant_define], m4_define([b4_variant_define],
[[ /// A char[S] buffer to store and retrieve objects. [[
/// A char[S] buffer to store and retrieve objects.
/// ///
/// Sort of a variant, but does not keep track of the nature /// Sort of a variant, but does not keep track of the nature
/// of the stored data, since that knowledge is available /// of the stored data, since that knowledge is available
/// via the current state. /// via the current state.
template <size_t S> template <size_t S>
struct variant struct variant
{ {]b4_parse_assert_if([
/// Type of *this. /// Whether something is contained.
typedef variant<S> self_type; bool built;
])[
/// Empty construction. /// Empty construction.
variant () inline
: yybuffer_ ()]b4_parse_assert_if([ variant ()]b4_parse_assert_if([
, yytypeid_ (YY_NULLPTR)])[ : built (false)])[
{} {}
/// Instantiate a \a T in here.
template <typename T>
inline T&
build ()
{]b4_parse_assert_if([
assert (!built);
built = true;])[
return *new (buffer.raw) T;
}
/// Instantiate a \a T in here from \a t.
template <typename T>
inline T&
build (const T& t)
{]b4_parse_assert_if([
assert(!built);
built = true;])[
return *new (buffer.raw) T(t);
}
/// Construct and fill. /// Construct and fill.
template <typename T> template <typename T>
variant (YY_RVREF (T) t)]b4_parse_assert_if([ inline
: yytypeid_ (&typeid (T))])[ variant (const T& t)]b4_parse_assert_if([
: built (true)])[
{ {
YYASSERT (sizeof (T) <= S); new (buffer.raw) T(t);
new (yyas_<T> ()) T (YY_MOVE (t));
}
/// Destruction, allowed only if empty.
~variant ()
{]b4_parse_assert_if([
YYASSERT (!yytypeid_);
])[}
/// Instantiate an empty \a T in here.
template <typename T>
T&
emplace ()
{]b4_parse_assert_if([
YYASSERT (!yytypeid_);
YYASSERT (sizeof (T) <= S);
yytypeid_ = & typeid (T);])[
return *new (yyas_<T> ()) T ();
}
# if 201103L <= YY_CPLUSPLUS
/// Instantiate a \a T in here from \a t.
template <typename T, typename U>
T&
emplace (U&& u)
{]b4_parse_assert_if([
YYASSERT (!yytypeid_);
YYASSERT (sizeof (T) <= S);
yytypeid_ = & typeid (T);])[
return *new (yyas_<T> ()) T (std::forward <U>(u));
}
# else
/// Instantiate a \a T in here from \a t.
template <typename T>
T&
emplace (const T& t)
{]b4_parse_assert_if([
YYASSERT (!yytypeid_);
YYASSERT (sizeof (T) <= S);
yytypeid_ = & typeid (T);])[
return *new (yyas_<T> ()) T (t);
}
# endif
/// Instantiate an empty \a T in here.
/// Obsolete, use emplace.
template <typename T>
T&
build ()
{
return emplace<T> ();
}
/// Instantiate a \a T in here from \a t.
/// Obsolete, use emplace.
template <typename T>
T&
build (const T& t)
{
return emplace<T> (t);
} }
/// Accessor to a built \a T. /// Accessor to a built \a T.
template <typename T> template <typename T>
T& inline T&
as () as ()
{]b4_parse_assert_if([ {]b4_parse_assert_if([
YYASSERT (yytypeid_); assert (built);])[
YYASSERT (*yytypeid_ == typeid (T)); return reinterpret_cast<T&>(buffer.raw);
YYASSERT (sizeof (T) <= S);])[
return *yyas_<T> ();
} }
/// Const accessor to a built \a T (for %printer). /// Const accessor to a built \a T (for %printer).
template <typename T> template <typename T>
const T& inline const T&
as () const as () const
{]b4_parse_assert_if([ {]b4_parse_assert_if([
YYASSERT (yytypeid_); assert(built);])[
YYASSERT (*yytypeid_ == typeid (T)); return reinterpret_cast<const T&>(buffer.raw);
YYASSERT (sizeof (T) <= S);])[
return *yyas_<T> ();
} }
/// Swap the content with \a other, of same type. /// Swap the content with \a other.
///
/// Both variants must be built beforehand, because swapping the actual
/// data requires reading it (with as()), and this is not possible on
/// unconstructed variants: it would require some dynamic testing, which
/// should not be the variant's responsibility.
/// Swapping between built and (possibly) non-built is done with
/// variant::move ().
template <typename T> template <typename T>
void inline void
swap (self_type& other) swap (variant<S>& other)
{]b4_parse_assert_if([ {
YYASSERT (yytypeid_); std::swap (as<T>(), other.as<T>());
YYASSERT (*yytypeid_ == *other.yytypeid_);])[
std::swap (as<T> (), other.as<T> ());
} }
/// Move the content of \a other to this. /// Assign the content of \a other to this.
///
/// Destroys \a other. /// Destroys \a other.
template <typename T> template <typename T>
void inline void
move (self_type& other) build (variant<S>& other)
{ {
# if 201103L <= YY_CPLUSPLUS build<T>();
emplace<T> (std::move (other.as<T> ())); swap<T>(other);
# else other.destroy<T>();
emplace<T> ();
swap<T> (other);
# endif
other.destroy<T> ();
}
# if 201103L <= YY_CPLUSPLUS
/// Move the content of \a other to this.
template <typename T>
void
move (self_type&& other)
{
emplace<T> (std::move (other.as<T> ()));
other.destroy<T> ();
}
#endif
/// Copy the content of \a other to this.
template <typename T>
void
copy (const self_type& other)
{
emplace<T> (other.as<T> ());
} }
/// Destroy the stored \a T. /// Destroy the stored \a T.
template <typename T> template <typename T>
void inline void
destroy () destroy ()
{ {
as<T> ().~T ();]b4_parse_assert_if([ as<T>().~T();]b4_parse_assert_if([
yytypeid_ = YY_NULLPTR;])[ built = false;])[
} }
private: /// A buffer large enough to store any of the semantic values.
/// Prohibit blind copies. /// Long double is chosen as it has the strongest alignment
self_type& operator= (const self_type&); /// constraints.
variant (const self_type&);
/// Accessor to raw memory as \a T.
template <typename T>
T*
yyas_ ()
{
void *yyp = yybuffer_.yyraw;
return static_cast<T*> (yyp);
}
/// Const accessor to raw memory as \a T.
template <typename T>
const T*
yyas_ () const
{
const void *yyp = yybuffer_.yyraw;
return static_cast<const T*> (yyp);
}
union union
{ {
/// Strongest alignment constraints. long double align_me;
long double yyalign_me; char raw[S];
/// A buffer large enough to store any of the semantic values. } buffer;
char yyraw[S];
} yybuffer_;]b4_parse_assert_if([
/// Whether the content is built: if defined, the name of the stored type.
const std::type_info *yytypeid_;])[
}; };
]]) ]])
@@ -292,17 +188,16 @@ m4_define([b4_variant_define],
## -------------------------- ## ## -------------------------- ##
# b4_value_type_declare # b4_semantic_type_declare
# --------------------- # ------------------------
# Declare semantic_type. # Declare semantic_type.
m4_define([b4_value_type_declare], m4_define([b4_semantic_type_declare],
[[ /// An auxiliary type to compute the largest semantic type. [ /// An auxiliary type to compute the largest semantic type.
union union_type union union_type
{]b4_type_foreach([b4_char_sizeof])[}; {]b4_type_foreach([b4_char_sizeof])[};
/// Symbol semantic values. /// Symbol semantic values.
typedef variant<sizeof (union_type)> semantic_type;][]dnl typedef variant<sizeof(union_type)> semantic_type;])
])
# How the semantic value is extracted when using variants. # How the semantic value is extracted when using variants.
@@ -311,7 +206,7 @@ m4_define([b4_value_type_declare],
# ---------------------------- # ----------------------------
m4_define([b4_symbol_value], m4_define([b4_symbol_value],
[m4_ifval([$2], [m4_ifval([$2],
[$1.as< $2 > ()], [$1.as< $2 >()],
[$1])]) [$1])])
# b4_symbol_value_template(VAL, [TYPE]) # b4_symbol_value_template(VAL, [TYPE])
@@ -319,7 +214,7 @@ m4_define([b4_symbol_value],
# Same as b4_symbol_value, but used in a template method. # Same as b4_symbol_value, but used in a template method.
m4_define([b4_symbol_value_template], m4_define([b4_symbol_value_template],
[m4_ifval([$2], [m4_ifval([$2],
[$1.template as< $2 > ()], [$1.template as< $2 >()],
[$1])]) [$1])])
@@ -329,27 +224,19 @@ m4_define([b4_symbol_value_template],
## ------------- ## ## ------------- ##
# _b4_symbol_constructor_declare(SYMBOL-NUMBER) # b4_symbol_constructor_declare_(SYMBOL-NUMBER)
# --------------------------------------------- # ---------------------------------------------
# Declare the overloaded version of make_symbol for the (common) type of # Declare the overloaded version of make_symbol for the (common) type of
# these SYMBOL-NUMBERS. Use at class-level. # these SYMBOL-NUMBERS. Use at class-level.
m4_define([_b4_symbol_constructor_declare], m4_define([b4_symbol_constructor_declare_],
[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], [b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
[#if 201103L <= YY_CPLUSPLUS [ static inline
static
symbol_type symbol_type
make_[]_b4_symbol([$1], [id]) (dnl make_[]b4_symbol_([$1], [id]) (dnl
b4_join(b4_symbol_if([$1], [has_type], b4_args(b4_symbol_if([$1], [has_type],
[b4_symbol([$1], [type]) v]),
b4_locations_if([location_type l])));
#else
static
symbol_type
make_[]_b4_symbol([$1], [id]) (dnl
b4_join(b4_symbol_if([$1], [has_type],
[const b4_symbol([$1], [type])& v]), [const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l]))); b4_locations_if([const location_type& l])));
#endif
])])]) ])])])
@@ -359,90 +246,32 @@ b4_join(b4_symbol_if([$1], [has_type],
# Use at class-level. # Use at class-level.
m4_define([b4_symbol_constructor_declare], m4_define([b4_symbol_constructor_declare],
[ // Symbol constructors declarations. [ // Symbol constructors declarations.
b4_symbol_foreach([_b4_symbol_constructor_declare])]) b4_symbol_foreach([b4_symbol_constructor_declare_])])
# _b4_symbol_constructor_define(SYMBOL-NUMBER) # b4_symbol_constructor_define_(SYMBOL-NUMBER)
# -------------------------------------------- # --------------------------------------------
# Define symbol constructor for this SYMBOL-NUMBER. # Define symbol constructor for this SYMBOL-NUMBER.
m4_define([_b4_symbol_constructor_define], m4_define([b4_symbol_constructor_define_],
[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], [b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
[# if 201103L <= YY_CPLUSPLUS [ b4_parser_class_name::symbol_type
inline b4_parser_class_name::make_[]b4_symbol_([$1], [id]) (dnl
b4_parser_class_name::symbol_type b4_args(b4_symbol_if([$1], [has_type],
b4_parser_class_name::make_[]_b4_symbol([$1], [id]) (dnl
b4_join(b4_symbol_if([$1], [has_type],
[b4_symbol([$1], [type]) v]),
b4_locations_if([location_type l])))
{
return symbol_type (b4_join([token::b4_symbol([$1], [id])],
b4_symbol_if([$1], [has_type], [std::move (v)]),
b4_locations_if([std::move (l)])));
}
#else
inline
b4_parser_class_name::symbol_type
b4_parser_class_name::make_[]_b4_symbol([$1], [id]) (dnl
b4_join(b4_symbol_if([$1], [has_type],
[const b4_symbol([$1], [type])& v]), [const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l]))) b4_locations_if([const location_type& l])))
{ {
return symbol_type (b4_join([token::b4_symbol([$1], [id])], return symbol_type (b4_args([token::b4_symbol([$1], [id])],
b4_symbol_if([$1], [has_type], [v]), b4_symbol_if([$1], [has_type], [v]),
b4_locations_if([l]))); b4_locations_if([l])));
} }
#endif
])])]) ])])])
# b4_basic_symbol_constructor_declare
# -----------------------------------
# Generate a constructor declaration for basic_symbol from given type.
m4_define([b4_basic_symbol_constructor_declare],
[[# if 201103L <= YY_CPLUSPLUS
basic_symbol (]b4_join(
[typename Base::kind_type t],
b4_symbol_if([$1], [has_type], [b4_symbol([$1], [type])&& v]),
b4_locations_if([location_type&& l]))[);
#else
basic_symbol (]b4_join(
[typename Base::kind_type t],
b4_symbol_if([$1], [has_type], [const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l]))[);
#endif
]])
# b4_basic_symbol_constructor_define
# ----------------------------------
# Generate a constructor implementation for basic_symbol from given type.
m4_define([b4_basic_symbol_constructor_define],
[[# if 201103L <= YY_CPLUSPLUS
template <typename Base>
]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (]b4_join(
[typename Base::kind_type t],
b4_symbol_if([$1], [has_type], [b4_symbol([$1], [type])&& v]),
b4_locations_if([location_type&& l]))[)
: Base (t)]b4_symbol_if([$1], [has_type], [
, value (std::move (v))])[]b4_locations_if([
, location (std::move (l))])[
{}
#else
template <typename Base>
]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (]b4_join(
[typename Base::kind_type t],
b4_symbol_if([$1], [has_type], [const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l]))[)
: Base (t)]b4_symbol_if([$1], [has_type], [
, value (v)])[]b4_locations_if([
, location (l)])[
{}
#endif
]])
# b4_symbol_constructor_define # b4_symbol_constructor_define
# ---------------------------- # ----------------------------
# Define the overloaded versions of make_symbol for all the value types. # Define the overloaded versions of make_symbol for all the value types.
m4_define([b4_symbol_constructor_define], m4_define([b4_symbol_constructor_define],
[ // Implementation of make_symbol for each symbol type. [ // Implementation of make_symbol for each symbol type.
b4_symbol_foreach([_b4_symbol_constructor_define])]) b4_symbol_foreach([b4_symbol_constructor_define_])])
+1 -13
View File
@@ -3,7 +3,7 @@
<!-- <!--
bison.xsl - common templates for Bison XSLT. bison.xsl - common templates for Bison XSLT.
Copyright (C) 2007-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2007-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -90,16 +90,4 @@
<xsl:value-of select="string-length(translate($conflict-data, 's', ''))"/> <xsl:value-of select="string-length(translate($conflict-data, 's', ''))"/>
</xsl:template> </xsl:template>
<xsl:template name="space">
<xsl:param name="repeat">0</xsl:param>
<xsl:param name="fill" select="' '"/>
<xsl:if test="number($repeat) &gt;= 1">
<xsl:call-template name="space">
<xsl:with-param name="repeat" select="$repeat - 1"/>
<xsl:with-param name="fill" select="$fill"/>
</xsl:call-template>
<xsl:value-of select="$fill"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>
+9 -188
View File
@@ -3,7 +3,7 @@
<!-- <!--
xml2dot.xsl - transform Bison XML Report into DOT. xml2dot.xsl - transform Bison XML Report into DOT.
Copyright (C) 2007-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2007-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -55,11 +55,7 @@
<xsl:call-template name="escape"> <xsl:call-template name="escape">
<xsl:with-param name="subject" select="$filename"/> <xsl:with-param name="subject" select="$filename"/>
</xsl:call-template> </xsl:call-template>
<xsl:text>"&#10;{ <xsl:text>"&#10;{&#10;</xsl:text>
node [fontname = courier, shape = box, colorscheme = paired6]
edge [fontname = courier]
</xsl:text>
<xsl:apply-templates select="state"/> <xsl:apply-templates select="state"/>
<xsl:text>}&#10;</xsl:text> <xsl:text>}&#10;</xsl:text>
</xsl:template> </xsl:template>
@@ -68,87 +64,11 @@
<xsl:call-template name="output-node"> <xsl:call-template name="output-node">
<xsl:with-param name="number" select="@number"/> <xsl:with-param name="number" select="@number"/>
<xsl:with-param name="label"> <xsl:with-param name="label">
<xsl:value-of select="@number"/>
<xsl:apply-templates select="itemset/item"/> <xsl:apply-templates select="itemset/item"/>
</xsl:with-param> </xsl:with-param>
</xsl:call-template> </xsl:call-template>
<xsl:apply-templates select="actions/transitions"/> <xsl:apply-templates select="actions/transitions"/>
<xsl:apply-templates select="actions/reductions">
<xsl:with-param name="staten">
<xsl:value-of select="@number"/>
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="actions/reductions">
<xsl:param name="staten"/>
<xsl:for-each select='reduction'>
<!-- These variables are needed because the current context can't be
referred to directly in XPath expressions. -->
<xsl:variable name="rul">
<xsl:value-of select="@rule"/>
</xsl:variable>
<xsl:variable name="ena">
<xsl:value-of select="@enabled"/>
</xsl:variable>
<!-- The foreach's body is protected by this, so that we are actually
going to iterate once per reduction rule, and not per lookahead. -->
<xsl:if test='not(preceding-sibling::*[@rule=$rul and @enabled=$ena])'>
<xsl:variable name="rule">
<xsl:choose>
<!-- The acceptation state is referred to as 'accept' in the XML, but
just as '0' in the DOT. -->
<xsl:when test="@rule='accept'">
<xsl:text>0</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@rule"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- The edge's beginning -->
<xsl:call-template name="reduction-edge-start">
<xsl:with-param name="state" select="$staten"/>
<xsl:with-param name="rule" select="$rule"/>
<xsl:with-param name="enabled" select="@enabled"/>
</xsl:call-template>
<!-- The edge's tokens -->
<!-- Don't show labels for the default action. In other cases, there will
always be at least one token, so 'label="[]"' will not occur. -->
<xsl:if test='$rule!=0 and not(../reduction[@enabled=$ena and @rule=$rule and @symbol="$default"])'>
<xsl:text>label="[</xsl:text>
<xsl:for-each select='../reduction[@enabled=$ena and @rule=$rule]'>
<xsl:call-template name="escape">
<xsl:with-param name="subject" select="@symbol"/>
</xsl:call-template>
<xsl:if test="position() != last ()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>]", </xsl:text>
</xsl:if>
<!-- The edge's end -->
<xsl:text>style=solid]&#10;</xsl:text>
<!-- The diamond representing the reduction -->
<xsl:call-template name="reduction-node">
<xsl:with-param name="state" select="$staten"/>
<xsl:with-param name="rule" select="$rule"/>
<xsl:with-param name="color">
<xsl:choose>
<xsl:when test='@enabled="true"'>
<xsl:text>3</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>5</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template> </xsl:template>
<xsl:template match="actions/transitions"> <xsl:template match="actions/transitions">
@@ -156,53 +76,20 @@
</xsl:template> </xsl:template>
<xsl:template match="item"> <xsl:template match="item">
<xsl:param name="prev-rule-number"
select="preceding-sibling::item[1]/@rule-number"/>
<xsl:apply-templates select="key('bison:ruleByNumber', @rule-number)"> <xsl:apply-templates select="key('bison:ruleByNumber', @rule-number)">
<xsl:with-param name="point" select="@point"/> <xsl:with-param name="point" select="@point"/>
<xsl:with-param name="num" select="@rule-number"/>
<xsl:with-param name="prev-lhs"
select="key('bison:ruleByNumber', $prev-rule-number)/lhs[text()]"
/>
</xsl:apply-templates> </xsl:apply-templates>
<xsl:apply-templates select="lookaheads"/> <xsl:apply-templates select="lookaheads"/>
</xsl:template> </xsl:template>
<xsl:template match="rule"> <xsl:template match="rule">
<xsl:param name="point"/> <xsl:param name="point"/>
<xsl:param name="num"/>
<xsl:param name="prev-lhs"/>
<xsl:text>&#10;</xsl:text> <xsl:text>&#10;</xsl:text>
<xsl:choose> <xsl:value-of select="lhs"/>
<xsl:when test="$num &lt; 10"> <xsl:text> -&gt;</xsl:text>
<xsl:text> </xsl:text>
</xsl:when>
<xsl:when test="$num &lt; 100">
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text></xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$num"/>
<xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="$prev-lhs = lhs[text()]">
<xsl:call-template name="lpad">
<xsl:with-param name="str" select="'|'"/>
<xsl:with-param name="pad" select="number(string-length(lhs[text()])) + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="lhs"/>
<xsl:text>:</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="$point = 0"> <xsl:if test="$point = 0">
<xsl:text> .</xsl:text> <xsl:text> .</xsl:text>
</xsl:if> </xsl:if>
<!-- RHS -->
<xsl:for-each select="rhs/symbol|rhs/empty"> <xsl:for-each select="rhs/symbol|rhs/empty">
<xsl:apply-templates select="."/> <xsl:apply-templates select="."/>
<xsl:if test="$point = position()"> <xsl:if test="$point = position()">
@@ -216,12 +103,10 @@
<xsl:value-of select="."/> <xsl:value-of select="."/>
</xsl:template> </xsl:template>
<xsl:template match="empty"> <xsl:template match="empty"/>
<xsl:text> %empty</xsl:text>
</xsl:template>
<xsl:template match="lookaheads"> <xsl:template match="lookaheads">
<xsl:text> [</xsl:text> <xsl:text>[</xsl:text>
<xsl:apply-templates select="symbol"/> <xsl:apply-templates select="symbol"/>
<xsl:text>]</xsl:text> <xsl:text>]</xsl:text>
</xsl:template> </xsl:template>
@@ -233,50 +118,6 @@
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="reduction-edge-start">
<xsl:param name="state"/>
<xsl:param name="rule"/>
<xsl:param name="enabled"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$state"/>
<xsl:text> -> "</xsl:text>
<xsl:value-of select="$state"/>
<xsl:text>R</xsl:text>
<xsl:value-of select="$rule"/>
<xsl:if test='$enabled = "false"'>
<xsl:text>d</xsl:text>
</xsl:if>
<xsl:text>" [</xsl:text>
</xsl:template>
<xsl:template name="reduction-node">
<xsl:param name="state"/>
<xsl:param name="rule"/>
<xsl:param name="color"/>
<xsl:text> "</xsl:text>
<xsl:value-of select="$state"/>
<xsl:text>R</xsl:text>
<xsl:value-of select="$rule"/>
<xsl:if test="$color = 5">
<xsl:text>d</xsl:text>
</xsl:if>
<xsl:text>" [label="</xsl:text>
<xsl:choose>
<xsl:when test="$rule = 0">
<xsl:text>Acc", fillcolor=1</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>R</xsl:text>
<xsl:value-of select="$rule"/>
<xsl:text>", fillcolor=</xsl:text>
<xsl:value-of select="$color"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>, shape=diamond, style=filled]&#10;</xsl:text>
</xsl:template>
<xsl:template match="transition"> <xsl:template match="transition">
<xsl:call-template name="output-edge"> <xsl:call-template name="output-edge">
<xsl:with-param name="src" select="../../../@number"/> <xsl:with-param name="src" select="../../../@number"/>
@@ -308,13 +149,10 @@
<xsl:text> </xsl:text> <xsl:text> </xsl:text>
<xsl:value-of select="$number"/> <xsl:value-of select="$number"/>
<xsl:text> [label="</xsl:text> <xsl:text> [label="</xsl:text>
<xsl:text>State </xsl:text>
<xsl:value-of select="$number"/>
<xsl:text>\n</xsl:text>
<xsl:call-template name="escape"> <xsl:call-template name="escape">
<xsl:with-param name="subject" select="$label"/> <xsl:with-param name="subject" select="$label"/>
</xsl:call-template> </xsl:call-template>
<xsl:text>\l"]&#10;</xsl:text> <xsl:text>"]&#10;</xsl:text>
</xsl:template> </xsl:template>
<xsl:template name="output-edge"> <xsl:template name="output-edge">
@@ -355,7 +193,7 @@
</xsl:call-template> </xsl:call-template>
</xsl:with-param> </xsl:with-param>
<xsl:with-param name="search" select="'&#10;'"/> <xsl:with-param name="search" select="'&#10;'"/>
<xsl:with-param name="replace" select="'\l'"/> <xsl:with-param name="replace" select="'\n'"/>
</xsl:call-template> </xsl:call-template>
</xsl:template> </xsl:template>
@@ -381,21 +219,4 @@
</xsl:choose> </xsl:choose>
</xsl:template> </xsl:template>
<xsl:template name="lpad">
<xsl:param name="str" select="''"/>
<xsl:param name="pad" select="0"/>
<xsl:variable name="diff" select="$pad - string-length($str)" />
<xsl:choose>
<xsl:when test="$diff &lt; 0">
<xsl:value-of select="$str"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="space">
<xsl:with-param name="repeat" select="$diff"/>
</xsl:call-template>
<xsl:value-of select="$str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>
+21 -4
View File
@@ -3,7 +3,7 @@
<!-- <!--
xml2text.xsl - transform Bison XML Report into plain text. xml2text.xsl - transform Bison XML Report into plain text.
Copyright (C) 2007-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2007-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -230,7 +230,7 @@
<xsl:template match="automaton/state"> <xsl:template match="automaton/state">
<xsl:param name="pad"/> <xsl:param name="pad"/>
<xsl:text>&#10;&#10;</xsl:text> <xsl:text>&#10;&#10;</xsl:text>
<xsl:text>State </xsl:text> <xsl:text>state </xsl:text>
<xsl:value-of select="@number"/> <xsl:value-of select="@number"/>
<xsl:text>&#10;&#10;</xsl:text> <xsl:text>&#10;&#10;</xsl:text>
<xsl:apply-templates select="itemset/item"> <xsl:apply-templates select="itemset/item">
@@ -350,7 +350,12 @@
<xsl:if test="position() = $point + 1"> <xsl:if test="position() = $point + 1">
<xsl:text> .</xsl:text> <xsl:text> .</xsl:text>
</xsl:if> </xsl:if>
<xsl:apply-templates select="."/> <xsl:if test="$itemset = 'true' and name(.) != 'empty'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="$itemset != 'true'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="position() = last() and position() = $point"> <xsl:if test="position() = last() and position() = $point">
<xsl:text> .</xsl:text> <xsl:text> .</xsl:text>
</xsl:if> </xsl:if>
@@ -368,7 +373,7 @@
</xsl:template> </xsl:template>
<xsl:template match="empty"> <xsl:template match="empty">
<xsl:text> %empty</xsl:text> <xsl:text> /* empty */</xsl:text>
</xsl:template> </xsl:template>
<xsl:template match="lookaheads"> <xsl:template match="lookaheads">
@@ -517,6 +522,18 @@
</xsl:choose> </xsl:choose>
</xsl:template> </xsl:template>
<xsl:template name="space">
<xsl:param name="repeat">0</xsl:param>
<xsl:param name="fill" select="' '"/>
<xsl:if test="number($repeat) &gt;= 1">
<xsl:call-template name="space">
<xsl:with-param name="repeat" select="$repeat - 1"/>
<xsl:with-param name="fill" select="$fill"/>
</xsl:call-template>
<xsl:value-of select="$fill"/>
</xsl:if>
</xsl:template>
<xsl:template name="line-wrap"> <xsl:template name="line-wrap">
<xsl:param name="line-length"/> <!-- required --> <xsl:param name="line-length"/> <!-- required -->
<xsl:param name="first-line-length" select="$line-length"/> <xsl:param name="first-line-length" select="$line-length"/>
+8 -4
View File
@@ -3,7 +3,7 @@
<!-- <!--
xml2html.xsl - transform Bison XML Report into XHTML. xml2html.xsl - transform Bison XML Report into XHTML.
Copyright (C) 2007-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2007-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -38,7 +38,6 @@
<xsl:template match="/"> <xsl:template match="/">
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<title> <title>
<xsl:value-of select="bison-xml-report/filename"/> <xsl:value-of select="bison-xml-report/filename"/>
<xsl:text> - GNU Bison XML Automaton Report</xsl:text> <xsl:text> - GNU Bison XML Automaton Report</xsl:text>
@@ -533,7 +532,12 @@
<xsl:text> </xsl:text> <xsl:text> </xsl:text>
<span class="point">.</span> <span class="point">.</span>
</xsl:if> </xsl:if>
<xsl:apply-templates select="."/> <xsl:if test="$itemset = 'true' and name(.) != 'empty'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="$itemset != 'true'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="position() = last() and position() = $point"> <xsl:if test="position() = last() and position() = $point">
<xsl:text> </xsl:text> <xsl:text> </xsl:text>
<span class="point">.</span> <span class="point">.</span>
@@ -559,7 +563,7 @@
</xsl:template> </xsl:template>
<xsl:template match="empty"> <xsl:template match="empty">
<xsl:text> %empty</xsl:text> <xsl:text> &#949;</xsl:text>
</xsl:template> </xsl:template>
<xsl:template match="lookaheads"> <xsl:template match="lookaheads">
+289 -212
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,7 +1,7 @@
# DJGPP Maintainer's Makefile -*-Makefile-*- # DJGPP Maintainer's Makefile -*-Makefile-*-
# Requires GNU sed # Requires GNU sed
## Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. ## Copyright (C) 2005-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+2 -2
View File
@@ -1,6 +1,6 @@
This is a port of GNU Bison @VERSION@ to MSDOS/DJGPP. This is a port of GNU Bison @VERSION@ to MSDOS/DJGPP.
Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2005-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
======================= =======================
The DJGPP port of Bison offers LFN and SFN support depending on which The DJGPP port of Bison offers LFN and SFN support depending on which
OS it is running. If LFN support is available or not is determined at OS it is running. If LFN support is available or not is determinated at
run time. If LFN support is available (DOS session under Win9X, Win2K, run time. If LFN support is available (DOS session under Win9X, Win2K,
WinXP, etc.) the standard posix file name extensions will be used. WinXP, etc.) the standard posix file name extensions will be used.
These are: y.tab.c, y.tab.c++, y.tab.h, y.output, etc. If only SFN These are: y.tab.c, y.tab.c++, y.tab.h, y.output, etc. If only SFN
+6 -6
View File
@@ -4,7 +4,7 @@ Rem Configure Bison for DJGPP.
Rem WARNING WARNING WARNING: This file needs to have DOS CRLF end-of-line Rem WARNING WARNING WARNING: This file needs to have DOS CRLF end-of-line
Rem format, or else stock DOS/Windows shells will refuse to run it. Rem format, or else stock DOS/Windows shells will refuse to run it.
Rem Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. Rem Copyright (C) 2005-2012 Free Software Foundation, Inc.
Rem This program is free software: you can redistribute it and/or modify Rem This program is free software: you can redistribute it and/or modify
Rem it under the terms of the GNU General Public License as published by Rem it under the terms of the GNU General Public License as published by
@@ -80,10 +80,10 @@ goto NextArgument
if "%1" == "no-dep" goto NextArgument if "%1" == "no-dep" goto NextArgument
if "%1" == "no-DEP" goto NextArgument if "%1" == "no-DEP" goto NextArgument
if "%1" == "NO-DEP" goto NextArgument if "%1" == "NO-DEP" goto NextArgument
if "%1" == "dep" goto DependecyTracking if "%1" == "dep" goto DependecyTraking
if "%1" == "DEP" goto DependecyTracking if "%1" == "DEP" goto DependecyTraking
goto LibiconvPrefixOption goto LibiconvPrefixOption
:DependecyTracking :DependecyTraking
if "%1" == "dep" set DEPENDENCY_TRACKING=enabled if "%1" == "dep" set DEPENDENCY_TRACKING=enabled
if "%1" == "DEP" set DEPENDENCY_TRACKING=enabled if "%1" == "DEP" set DEPENDENCY_TRACKING=enabled
if not "%DEPENDENCY_TRACKING%" == "enabled" goto SmallEnv if not "%DEPENDENCY_TRACKING%" == "enabled" goto SmallEnv
@@ -290,7 +290,7 @@ if errorlevel 1 goto SedError2
mv -f config.hin %XSRC%/lib/config.hin mv -f config.hin %XSRC%/lib/config.hin
Rem Fixing illicit testsuite file name. Rem Fixing ilicit testsuite file name.
test -f %XSRC%/tests/c++.at test -f %XSRC%/tests/c++.at
if not errorlevel 1 mv -f %XSRC%/tests/c++.at %XSRC%/tests/cxx.at if not errorlevel 1 mv -f %XSRC%/tests/c++.at %XSRC%/tests/cxx.at
@@ -300,7 +300,7 @@ sed -f %XSRC%/djgpp/testsuite.sed %XSRC%/tests/testsuite.org > testsuite.tmp
if errorlevel 1 goto SedError3 if errorlevel 1 goto SedError3
mv -f ./testsuite.tmp %XSRC%/tests/testsuite mv -f ./testsuite.tmp %XSRC%/tests/testsuite
Rem Fixing illicit calc++ file names in the calc++ directory. Rem Fixing ilicit calc++ file names in the calc++ directory.
test -d %XSRC%/examples/calc++ test -d %XSRC%/examples/calc++
if not errorlevel 1 mv -f %XSRC%/examples/calc++ %XSRC%/examples/calcxx if not errorlevel 1 mv -f %XSRC%/examples/calc++ %XSRC%/examples/calcxx
test -d %XSRC%/examples/calcxx test -d %XSRC%/examples/calcxx
+1 -1
View File
@@ -2,7 +2,7 @@
# Sed script for additional DJGPP specific editing # Sed script for additional DJGPP specific editing
# of the configure script generated by autoconf 2.62. # of the configure script generated by autoconf 2.62.
# Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -3,7 +3,7 @@
# This is the config.site file for configuring GNU packages # This is the config.site file for configuring GNU packages
# which are to be built with DJGPP tools. # which are to be built with DJGPP tools.
# Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -1,6 +1,6 @@
# sed script for DJGPP specific editing of config.hin # sed script for DJGPP specific editing of config.hin
# Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -7,7 +7,7 @@ Rem This batch file unpacks the Bison distribution while simultaneously
Rem renaming some of the files whose names are invalid on DOS or conflict Rem renaming some of the files whose names are invalid on DOS or conflict
Rem with other file names after truncation to DOS 8+3 namespace. Rem with other file names after truncation to DOS 8+3 namespace.
Rem Rem
Rem Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. Rem Copyright (C) 2005-2012 Free Software Foundation, Inc.
Rem Rem
Rem This program is free software: you can redistribute it and/or modify Rem This program is free software: you can redistribute it and/or modify
Rem it under the terms of the GNU General Public License as published by Rem it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -1,4 +1,4 @@
## Copyright (C) 2008-2015, 2018 Free Software Foundation, Inc. ## Copyright (C) 2008-2012 Free Software Foundation, Inc.
## This program is free software: you can redistribute it and/or modify ## 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 ## it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -1,6 +1,6 @@
/* Subprocesses with pipes. /* Subprocesses with pipes.
Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2005-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -1,6 +1,6 @@
/* Subprocesses with pipes. /* Subprocesses with pipes.
Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2005-2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
+1 -1
View File
@@ -2,7 +2,7 @@
# Sed script for additional DJGPP specific editing # Sed script for additional DJGPP specific editing
# of the testsuite script generated by autoconf 2.61. # of the testsuite script generated by autoconf 2.61.
# Copyright (C) 2007-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+10 -13
View File
@@ -1,28 +1,25 @@
# Do not ignore these. The release procedure (web-manual-update) /*.info*
# works in the src tree (even when run from the build tree) and leaves
# these files around. Since they take precedence over the files in
# the build tree, locally built manuals use obsolete auxiliary files.
#
# So don't hide them, give the maintainer a chance to clean them.
#/bison.aux
#/bison.cp
#/bison.cps
#/bison.toc
/*~ /*~
/.dirstamp /.dirstamp
/bison.1 /bison.1
/bison.aux
/bison.cp
/bison.cps
/bison.dvi /bison.dvi
/bison.fn
/bison.help /bison.help
/bison.html /bison.html
/bison.info /bison.ky
/bison.log /bison.log
/bison.pdf /bison.pdf
/bison.pg
/bison.ps /bison.ps
/bison.toc
/bison.tp
/bison.vr
/cross-options.texi /cross-options.texi
/fdl.texi /fdl.texi
/gendocs_template /gendocs_template
/gendocs_template_min
/gpl-3.0.texi /gpl-3.0.texi
/refcard.dvi /refcard.dvi
/refcard.log /refcard.log
+939 -1451
View File
File diff suppressed because it is too large Load Diff
+1172 -2742
View File
File diff suppressed because it is too large Load Diff
-11
View File
@@ -1,11 +0,0 @@
digraph "reduce.y"
{
node [fontname=courier shape=box]
edge [fontname=courier]
1 [label="State 1\n 3 a: \"0\" . [\".\"]\l 4 b: \"0\" . [\";\"]\l"]
1 -> "1R3" [label="" style=solid]
"1R3" [style=filled shape=diamond fillcolor=yellowgreen label="R3"]
1 -> "1R4" [label="[\";\"]" style=solid]
"1R4" [style=filled shape=diamond fillcolor=yellowgreen label="R4"]
}
-13
View File
@@ -1,13 +0,0 @@
.------------------.
| State 1 |
| 3 a: "0" . [";"] |
| 4 b: "0" . ["."] |
`------------------'
/ \
/ \ ["."]
/ \
v v
/ \ / \
/ R \ / R \
(green) \ 3 / \ 4 / (green)
\ / \ /
-9
View File
@@ -1,9 +0,0 @@
digraph "shift.y"
{
node [fontname=courier shape=box]
edge [fontname=courier]
3 [label="State 3\n 1 exp: a . \".\"\l"]
3 -> 6 [style=solid label="\".\""]
6 [label="State 6\n 1 exp: a \".\" .\l"]
}
-12
View File
@@ -1,12 +0,0 @@
.----------------.
| State 3 |
| 1 exp: a . ";" |
`----------------'
|
| ";"
|
v
.----------------.
| State 6 |
| 1 exp: a ";" . |
`----------------'
-35
View File
@@ -1,35 +0,0 @@
// Generated by GNU Bison 2.6.90.
// Report bugs to <[email protected]>.
// Home page: <http://www.gnu.org/software/bison/>.
digraph "/tmp/fo.y"
{
node [fontname = courier, shape = box, colorscheme = paired6]
edge [fontname = courier]
0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a \";\"\l 2 | . b \".\"\l 3 a: . \"0\"\l 4 b: . \"0\"\l"]
0 -> 1 [style=solid label="\"0\""]
0 -> 2 [style=dashed label="exp"]
0 -> 3 [style=dashed label="a"]
0 -> 4 [style=dashed label="b"]
1 [label="State 1\n\l 3 a: \"0\" . [\";\"]\l 4 b: \"0\" . [\".\"]\l"]
1 -> "1R3" [style=solid]
"1R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
1 -> "1R4" [label="[\".\"]", style=solid]
"1R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
2 [label="State 2\n\l 0 $accept: exp . $end\l"]
2 -> 5 [style=solid label="$end"]
3 [label="State 3\n\l 1 exp: a . \";\"\l"]
3 -> 6 [style=solid label="\";\""]
4 [label="State 4\n\l 2 exp: b . \".\"\l"]
4 -> 7 [style=solid label="\".\""]
5 [label="State 5\n\l 0 $accept: exp $end .\l"]
5 -> "5R0" [style=solid]
"5R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
6 [label="State 6\n\l 1 exp: a \";\" .\l"]
6 -> "6R1" [style=solid]
"6R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
7 [label="State 7\n\l 2 exp: b \".\" .\l"]
7 -> "7R2" [style=solid]
"7R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
}
-2
View File
@@ -1,2 +0,0 @@
This file is a stub, not used by the documentation. If you feel like
contributing ASCII art for example.gv, please step forward!
-4
View File
@@ -1,4 +0,0 @@
%%
exp: a ";" | b ".";
a: "0";
b: "0";
+22 -68
View File
@@ -1,5 +1,4 @@
## Copyright (C) 2001-2003, 2005-2015, 2018 Free Software Foundation, ## Copyright (C) 2001-2003, 2005-2012 Free Software Foundation, Inc.
## Inc.
## This program is free software: you can redistribute it and/or modify ## 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 ## it under the terms of the GNU General Public License as published by
@@ -21,29 +20,23 @@ doc_bison_TEXINFOS = \
doc/fdl.texi \ doc/fdl.texi \
doc/gpl-3.0.texi doc/gpl-3.0.texi
# Cannot express dependencies directly on file names because of Automake. TEXI2DVI = texi2dvi --build-dir=doc/bison.t2d
# Obfuscate with a variable. CLEANDIRS = doc/bison.t2d
doc_bison = doc/bison clean-local:
$(doc_bison).dvi: $(FIGS_GV:.gv=.eps) rm -rf $(CLEANDIRS)
$(doc_bison).info: $(FIGS_GV:.gv=.txt)
$(doc_bison).pdf: $(FIGS_GV:.gv=.pdf)
$(doc_bison).html: $(FIGS_GV:.gv=.png)
TEXI2DVI = texi2dvi --build-dir=doc/bison.t2d -I doc MOSTLYCLEANFILES += $(top_srcdir)/doc/*.t
CLEANDIRS += doc/bison.t2d
MOSTLYCLEANFILES += $(top_srcdir)/doc/*.tmp
CROSS_OPTIONS_PL = $(top_srcdir)/build-aux/cross-options.pl CROSS_OPTIONS_PL = $(top_srcdir)/build-aux/cross-options.pl
CROSS_OPTIONS_TEXI = $(top_srcdir)/doc/cross-options.texi CROSS_OPTIONS_TEXI = $(top_srcdir)/doc/cross-options.texi
$(CROSS_OPTIONS_TEXI): doc/bison.help $(CROSS_OPTIONS_PL) $(CROSS_OPTIONS_TEXI): doc/bison.help $(CROSS_OPTIONS_PL)
# Create $@~ which is the previous contents. Don't use 'mv' here so # Create $@~ which is the previous contents. Don't use `mv' here so
# that even if we are interrupted, the file is still available for # that even if we are interrupted, the file is still available for
# diff in the next run. Note that $@ might not exist yet. # diff in the next run. Note that $@ might not exist yet.
$(AM_V_GEN){ test ! -f $@ || cat $@; } >$@~ $(AM_V_GEN){ test ! -f $@ || cat $@; } >$@~
$(AM_V_at)test ! -f $@.tmp || rm -f $@.tmp $(AM_V_at)test ! -f $@.tmp || rm -f $@.tmp
$(AM_V_at)$(PERL) $(CROSS_OPTIONS_PL) $(top_srcdir)/src/scan-gram.l \ $(AM_V_at)src/bison$(EXEEXT) --help | \
<$(top_srcdir)/doc/bison.help >$@.tmp $(PERL) $(CROSS_OPTIONS_PL) $(top_srcdir)/src/scan-gram.l >$@.tmp
$(AM_V_at)diff -u $@~ $@.tmp || true $(AM_V_at)diff -u $@~ $@.tmp || true
$(AM_V_at)mv $@.tmp $@ $(AM_V_at)mv $@.tmp $@
MAINTAINERCLEANFILES = $(CROSS_OPTIONS_TEXI) MAINTAINERCLEANFILES = $(CROSS_OPTIONS_TEXI)
@@ -64,9 +57,9 @@ doc/refcard.pdf: doc/refcard.tex
## doc/bison.help. ## ## doc/bison.help. ##
## ---------------- ## ## ---------------- ##
# Some of our targets (cross-options.texi, bison.1) use "bison --help". # Some of our targets (cross-option.texi, bison.1) use "bison --help".
# Since we want to ship the generated file to avoid additional # Since we want to ship the generated file to avoid additional
# requirements over the user environment, we used to not depend on # requirements over the user environment, we used not depend on
# src/bison itself, but on src/getargs.c and other files. Yet, we # src/bison itself, but on src/getargs.c and other files. Yet, we
# need "bison --help" to work to make help2man happy, so we used to # need "bison --help" to work to make help2man happy, so we used to
# include "make src/bison" in the commands. Then we may have a # include "make src/bison" in the commands. Then we may have a
@@ -80,20 +73,15 @@ doc/refcard.pdf: doc/refcard.tex
# bison.help, which contains --version then --help. This file can # bison.help, which contains --version then --help. This file can
# depend on bison, which ensures its correctness. But update it # depend on bison, which ensures its correctness. But update it
# *only* if needed (content changes). This way, we avoid useless # *only* if needed (content changes). This way, we avoid useless
# compilations of cross-options.texi and bison.1. At the cost of # compilations of cross-option.texi and bison.1. At the cost of
# repeated builds of bison.help. # repeated builds of bison.help.
EXTRA_DIST += $(top_srcdir)/doc/bison.help EXTRA_DIST += $(top_srcdir)/doc/bison.help
if ! CROSS_COMPILING
MAINTAINERCLEANFILES += $(top_srcdir)/doc/bison.help MAINTAINERCLEANFILES += $(top_srcdir)/doc/bison.help
$(top_srcdir)/doc/bison.help: src/bison$(EXEEXT) $(top_srcdir)/doc/bison.help: src/bison$(EXEEXT)
$(AM_V_GEN)LC_ALL=C src/bison$(EXEEXT) --version >doc/bison.help.tmp $(AM_V_GEN)src/bison$(EXEEXT) --version >doc/bison.help.tmp
$(AM_V_at) LC_ALL=C src/bison$(EXEEXT) --help | \ $(AM_V_at) src/bison$(EXEEXT) --help >>doc/bison.help.tmp
## Avoid variations in the output depending on whether we are
## on a glibc system.
sed '/translation bugs/d' >>doc/bison.help.tmp
$(AM_V_at)$(top_srcdir)/build-aux/move-if-change doc/bison.help.tmp $@ $(AM_V_at)$(top_srcdir)/build-aux/move-if-change doc/bison.help.tmp $@
endif ! CROSS_COMPILING
## ----------- ## ## ----------- ##
@@ -110,53 +98,19 @@ remove_time_stamp = \
sed 's/^\(\.TH[^"]*"[^"]*"[^"]*\)"[^"]*"/\1/' sed 's/^\(\.TH[^"]*"[^"]*"[^"]*\)"[^"]*"/\1/'
# Depend on configure to get version number changes. # Depend on configure to get version number changes.
if ! CROSS_COMPILING $(top_srcdir)/doc/bison.1: doc/bison.help doc/bison.x $(top_srcdir)/configure
MAN_DEPS = doc/bison.help doc/bison.x $(top_srcdir)/configure
endif
$(top_srcdir)/doc/bison.1: $(MAN_DEPS)
$(AM_V_GEN)$(HELP2MAN) \ $(AM_V_GEN)$(HELP2MAN) \
--include=$(top_srcdir)/doc/bison.x \ --include=$(top_srcdir)/doc/bison.x \
--output=$@.tmp src/bison$(EXEEXT) --output=$@.t src/bison$(EXEEXT)
$(AM_V_at)if $(remove_time_stamp) $@ >$@a.tmp 2>/dev/null && \ $(AM_V_at)if $(remove_time_stamp) $@ >$@a.t 2>/dev/null && \
$(remove_time_stamp) $@.tmp | cmp $@a.tmp - >/dev/null 2>&1; then \ $(remove_time_stamp) $@.t | cmp $@a.t - >/dev/null 2>&1; then \
touch $@; \ touch $@; \
else \ else \
mv $@.tmp $@; \ mv $@.t $@; \
fi fi
$(AM_V_at)rm -f $@*.tmp $(AM_V_at)rm -f $@*.t
if ENABLE_YACC
nodist_man_MANS = doc/yacc.1 nodist_man_MANS = doc/yacc.1
endif
## ----------------------------- ##
## Graphviz examples generation. ##
## ----------------------------- ##
CLEANFILES += $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.png)
FIGS_GV = \
doc/figs/example.gv \
doc/figs/example-reduce.gv doc/figs/example-shift.gv
EXTRA_DIST += \
$(FIGS_GV) $(FIGS_GV:.gv=.txt) \
$(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.png)
SUFFIXES += .gv .eps .pdf .png
.gv.eps:
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
$(AM_V_at) $(DOT) -Gmargin=0 -Teps $< >$@.tmp
$(AM_V_at) mv $@.tmp $@
.gv.pdf:
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
$(AM_V_at) $(DOT) -Gmargin=0 -Tpdf $< >$@.tmp
$(AM_V_at) mv $@.tmp $@
.gv.png:
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
$(AM_V_at) $(DOT) -Gmargin=0 -Tpng $< >$@.tmp
$(AM_V_at) mv $@.tmp $@
## -------------- ## ## -------------- ##
## Doxygenation. ## ## Doxygenation. ##
+1 -2
View File
@@ -19,8 +19,7 @@
\def\finalout{\overfullrule=0pt} \def\finalout{\overfullrule=0pt}
%\finalout %\finalout
% Copyright (c) 1998, 2001, 2009-2015, 2018 Free Software Foundation, % Copyright (c) 1998, 2001, 2009-2012 Free Software Foundation, Inc.
% Inc.
% %
% This file is part of Bison. % This file is part of Bison.
% %
+1 -1
View File
@@ -16,7 +16,7 @@ straightforward use of _build/src/bison would.)
-- --
Copyright (C) 2006, 2009-2015, 2018 Free Software Foundation, Inc. Copyright (C) 2006, 2009-2012 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+27 -35
View File
@@ -1,6 +1,6 @@
#! /usr/bin/perl -w #! /usr/bin/perl -w
# Copyright (C) 2006, 2008-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2006, 2008-2012 Free Software Foundation, Inc.
# #
# This file is part of Bison, the GNU Compiler Compiler. # This file is part of Bison, the GNU Compiler Compiler.
# #
@@ -35,7 +35,6 @@ I<directives>:
| directives & directives -- Concatenation | directives & directives -- Concatenation
| [ directives> ] -- Optional | [ directives> ] -- Optional
| ( directives> ) -- Parentheses | ( directives> ) -- Parentheses
| %b PATH -- Use bison at PATH for this bench
| #d NAME[=VALUE] -- %code { #define NAME [VALUE] } | #d NAME[=VALUE] -- %code { #define NAME [VALUE] }
| %d NAME[=VALUE] -- %define NAME ["VALUE"] | %d NAME[=VALUE] -- %define NAME ["VALUE"]
| %s skeleton -- %skeleton "skeleton" | %s skeleton -- %skeleton "skeleton"
@@ -53,7 +52,7 @@ will generate eight different cases.
=item B<-b>, B<--bench> =item B<-b>, B<--bench>
Predefined benches, that is, combination between a grammar and a I<directives> Predefined benches, that is, combimation between a grammar and a I<directives>
request. request.
=over 4 =over 4
@@ -204,9 +203,9 @@ Format the list of directives for Bison for bench named C<$bench>.
sub directives($@) sub directives($@)
{ {
my ($bench, @directive) = @_; my ($bench, @directive) = @_;
my $res = "/* Directives for bench '$bench'. */\n"; my $res = "/* Directives for bench `$bench'. */\n";
$res .= join ("\n", @directive) . "\n"; $res .= join ("\n", @directive) . "\n";
$res .= "/* End of directives for bench '$bench'. */\n"; $res .= "/* End of directives for bench `$bench'. */\n";
return $res; return $res;
} }
@@ -580,7 +579,7 @@ sub generate_grammar_list ($$@)
my ($base, $max, @directive) = @_; my ($base, $max, @directive) = @_;
my $directives = directives ($base, @directive); my $directives = directives ($base, @directive);
my $variant = grep { /%define "?variant"?/ } @directive; my $variant = grep { /%define "?variant"?/ } @directive;
my $token_ctor = grep { /%define "?api.token.constructor"?/ } @directive; my $lex_symbol = grep { /%define "?lex_symbol"?/ } @directive;
my $out = new IO::File ">$base.y" my $out = new IO::File ">$base.y"
or die; or die;
print $out <<EOF; print $out <<EOF;
@@ -602,16 +601,16 @@ $directives
#define STAGE_MAX ($max * 10) // max = $max #define STAGE_MAX ($max * 10) // max = $max
#define USE_TOKEN_CTOR $token_ctor #define USE_LEX_SYMBOL $lex_symbol
#define USE_VARIANTS $variant #define USE_VARIANTS $variant
// Prototype of the yylex function providing subsequent tokens. // Prototype of the yylex function providing subsequent tokens.
static static
#if USE_TOKEN_CTOR #if USE_LEX_SYMBOL
yy::parser::symbol_type yylex(); yy::parser::symbol_type yylex();
#else #else
yy::parser::token_type yylex(yy::parser::semantic_type* yylvalp, yy::parser::token_type yylex(yy::parser::semantic_type* yylval,
yy::parser::location_type* yyllocp); yy::parser::location_type* yylloc);
#endif #endif
// Conversion to string. // Conversion to string.
@@ -679,11 +678,11 @@ EOF
# #
static static
#if USE_TOKEN_CTOR #if USE_LEX_SYMBOL
yy::parser::symbol_type yylex() yy::parser::symbol_type yylex()
#else #else
yy::parser::token_type yylex(yy::parser::semantic_type* yylvalp, yy::parser::token_type yylex(yy::parser::semantic_type* yylval,
yy::parser::location_type* yyllocp) yy::parser::location_type* yylloc)
#endif #endif
{ {
typedef yy::parser::location_type location_type; typedef yy::parser::location_type location_type;
@@ -692,42 +691,42 @@ yy::parser::token_type yylex(yy::parser::semantic_type* yylvalp,
++stage; ++stage;
if (stage == STAGE_MAX) if (stage == STAGE_MAX)
{ {
#if USE_TOKEN_CTOR #if USE_LEX_SYMBOL
return yy::parser::make_END_OF_FILE (location_type ()); return yy::parser::make_END_OF_FILE (location_type ());
#else #else
*yyllocp = location_type (); *yylloc = location_type ();
return token::END_OF_FILE; return token::END_OF_FILE;
#endif #endif
} }
else if (stage % 2) else if (stage % 2)
{ {
#if USE_TOKEN_CTOR #if USE_LEX_SYMBOL
return yy::parser::make_NUMBER (stage, location_type ()); return yy::parser::make_NUMBER (stage, location_type ());
#else #else
# if defined ONE_STAGE_BUILD # if defined ONE_STAGE_BUILD
yylvalp->build(stage); yylval->build(stage);
# elif USE_VARIANTS # elif USE_VARIANTS
yylvalp->build<int>() = stage; yylval->build<int>() = stage;
# else # else
yylvalp->ival = stage; yylval->ival = stage;
# endif # endif
*yyllocp = location_type (); *yylloc = location_type ();
return token::NUMBER; return token::NUMBER;
#endif #endif
} }
else else
{ {
#if USE_TOKEN_CTOR #if USE_LEX_SYMBOL
return yy::parser::make_TEXT ("A string.", location_type ()); return yy::parser::make_TEXT ("A string.", location_type ());
#else #else
# if defined ONE_STAGE_BUILD # if defined ONE_STAGE_BUILD
yylvalp->build(std::string("A string.")); yylval->build(std::string("A string."));
# elif USE_VARIANTS # elif USE_VARIANTS
yylvalp->build<std::string>() = std::string("A string."); yylval->build<std::string>() = std::string("A string.");
# else # else
yylvalp->sval = new std::string("A string."); yylval->sval = new std::string("A string.");
# endif # endif
*yyllocp = location_type (); *yylloc = location_type ();
return token::TEXT; return token::TEXT;
#endif #endif
} }
@@ -738,7 +737,7 @@ yy::parser::token_type yylex(yy::parser::semantic_type* yylvalp,
void void
yy::parser::error(const yy::parser::location_type& loc, const std::string& msg) yy::parser::error(const yy::parser::location_type& loc, const std::string& msg)
{ {
std::cerr << loc << ": " << msg << '\n'; std::cerr << loc << ": " << msg << std::endl;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@@ -807,8 +806,7 @@ sub compile ($)
my $compiler = $language eq 'C++' ? $cxx : $cc; my $compiler = $language eq 'C++' ? $cxx : $cc;
my $my_bison = `sed -ne '/%bison "\\(.*\\)"/{s//\\1/;p;q;}' $base.y`; run "$bison $base.y -o $base.c";
run ((length $my_bison ? $my_bison : $bison) . " $base.y -o $base.c");
run "$compiler -o $base $cflags $base.c"; run "$compiler -o $base $cflags $base.c";
} }
@@ -916,7 +914,7 @@ sub bench_variant_parser ()
[ [
%d variant %d variant
& &
[ #d ONE_STAGE_BUILD | %d api.token.constructor ] [ #d ONE_STAGE_BUILD | %d lex_symbol ]
] ]
) )
); );
@@ -1050,12 +1048,6 @@ sub parse_dirs ()
@res = ("%skeleton \"$token[0]\""); @res = ("%skeleton \"$token[0]\"");
shift @token; shift @token;
} }
elsif ($token[0] eq '%b')
{
shift @token;
@res = ("/*\n%bison \"$token[0]\"\\\n*/");
shift @token;
}
else else
{ {
@res = $token[0]; @res = $token[0];
+1 -1
View File
@@ -1,4 +1,4 @@
## Copyright (C) 2006, 2008-2015, 2018 Free Software Foundation, Inc. ## Copyright (C) 2006, 2008-2012 Free Software Foundation, Inc.
## This program is free software: you can redistribute it and/or modify ## 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 ## it under the terms of the GNU General Public License as published by
+220
View File
@@ -0,0 +1,220 @@
#! /usr/bin/perl -w
use strict;
use IO::File;
use Getopt::Long;
use File::Basename; # for dirname
my $VERSION = '2012-01-21 17:13'; # UTC
(my $ME = $0) =~ s|.*/||;
my $prefix;
my $lib_name;
sub usage ($)
{
my ($exit_code) = @_;
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
if ($exit_code != 0)
{
print $STREAM "Try '$ME --help' for more information.\n";
}
else
{
print $STREAM <<EOF;
Usage: $ME --lib-name=NAME FILE
or: $ME [--help|--version]
Rewrite a gnulib-tool-generated FILE like lib/gnulib.mk to work with
automake's subdir-objects.
OPTIONS:
This option must be specified:
--lib-name=NAME library name, often "lib\$project"
The following are optional:
--help display this help and exit
--version output version information and exit
EOF
}
exit $exit_code;
}
# contents ($FILE_NAME)
# ---------------------
sub contents ($)
{
my ($file) = @_;
local $/; # Turn on slurp-mode.
my $f = new IO::File "< $file" or die "$file";
my $contents = $f->getline or die "$file";
$f->close;
return $contents;
}
# prefix_word ($WORD)
# -------------------
# Do not prefix special words such as variable dereferences. Also,
# "Makefile" is really "Makefile", since precisely there is no
# lib/Makefile.
sub prefix_word ($)
{
local ($_) = @_;
$_ = $prefix . $_
unless /^-/ || m{^\$\(\w+\)} || $_ eq "Makefile" || $_ eq '\\';
return $_;
}
# prefix_words ($TEXT)
# --------------------
sub prefix_words ($)
{
local ($_) = @_;
s{(\S+)}{prefix_word($1)}gem;
return $_;
}
# prefix_assignment ($LHS-AND-ASSIGN-OP, $RHS)
# --------------------------------------------
sub prefix_assignment ($$)
{
my ($lhs_and_assign_op, $rhs) = @_;
my $res;
# Some variables are initialized by gnulib.mk, and we don't want
# that. Change '=' to '+='.
if ($lhs_and_assign_op =~ /^(SUBDIRS|EXTRA_DIST|BUILT_SOURCES|SUFFIXES|MOSTLYCLEANFILES|CLEANFILES|DISTCLEANFILES|MAINTAINERCLEANFILES|AM_CFLAGS|AM_CPPFLAGS|AM_GNU_GETTEXT) =/)
{
$lhs_and_assign_op =~ s/=/+=/;
}
# We don't want to inherit gnulib's AUTOMAKE_OPTIONS, comment them.
elsif ($lhs_and_assign_op =~ /^AUTOMAKE_OPTIONS =/)
{
$lhs_and_assign_op =~ s/^/# /;
}
# Don't touch suffixes.
elsif ($lhs_and_assign_op =~ /^SUFFIXES /)
{
}
# The words are (probably) paths to files in lib/: prefix them.
else
{
$rhs = prefix_words($rhs)
}
# Variables which name depend on the location: libbison_a_SOURCES =>
# lib_libbison_a_SOURCES.
$lhs_and_assign_op =~ s/($lib_name)/lib_$1/g;
return $lhs_and_assign_op . $rhs;
}
# prefix $CONTENTS
# ----------------
# $CONTENTS is a Makefile content. Post-process it so that each file-name
# is prefixed with $prefix (e.g., "lib/").
#
# Relies heavily on the regularity of the file generated by gnulib-tool.
sub prefix ($)
{
# Work on $_.
local ($_) = @_;
# Prefix all the occurrence of files in rules. If there is nothing
# after in the :, it's probably a phony target, or a suffix rule.
# Don't touch it.
s{^([-\w+/]+\.[-\w.]+ *: *\S.*)$}
{prefix_words($1)}gem;
# Prefix files in variables.
s{^([\w.]+\s*\+?=)(.*)$}
{prefix_assignment($1, $2)}gem;
# These three guys escape all the other regular rules.
s{(charset\.alias|ref-add\.sed|ref-del\.sed)}{$prefix$1}g;
# Unfortunately, as a result we sometimes have lib/lib.
s{($prefix){2}}{$1}g;
# $(srcdir) is actually $(top_srcdir)/lib.
s{\$\(srcdir\)}{\$(top_srcdir)/lib}g;
# Sometimes, t-$@ is used instead of $@-t, which, of course, does
# not work when we have a $@ with a directory in it.
s{t-\$\@}{\$\@-t}g;
# Some AC_SUBST patterns remain and would better be Make macros.
s{\@(MKDIR_P)\@}{\$($1)}g;
# Adjust paths in mkdir.
s{(\$\(MKDIR_P\))\s*(\w+)}{$1 $prefix$2}g;
return $_;
}
# process ($IN)
# -------------
sub process ($)
{
my ($file) = @_;
my ($bak) = "$file.bak";
rename ($file, $bak) or die;
my $contents = contents ($bak);
$contents = prefix ($contents);
my $out = new IO::File(">$file") or die;
print $out $contents;
}
{
GetOptions
(
'lib-name=s' => \$lib_name,
help => sub { usage 0 },
version => sub { print "$ME version $VERSION\n"; exit },
) or usage 1;
my $fail = 0;
defined $lib_name
or (warn "$ME: no library name; use --lib-name=NAME\n"), $fail = 1;
# There must be exactly one argument.
@ARGV == 0
and (warn "$ME: missing FILE argument\n"), $fail = 1;
1 < @ARGV
and (warn "$ME: too many arguments:\n", join ("\n", @ARGV), "\n"),
$fail = 1;
$fail
and usage 1;
my $file = $ARGV[0];
$prefix = (dirname $file) . '/';
warn "prefix=$prefix\n";
process $file;
}
### Setup "GNU" style for perl-mode and cperl-mode.
## Local Variables:
## perl-indent-level: 2
## perl-continued-statement-offset: 2
## perl-continued-brace-offset: 0
## perl-brace-offset: 0
## perl-brace-imaginary-offset: 0
## perl-label-offset: -2
## cperl-indent-level: 2
## cperl-brace-offset: 0
## cperl-continued-brace-offset: 0
## cperl-label-offset: -2
## cperl-extra-newline-before-brace: t
## cperl-merge-trailing-else: nil
## cperl-continued-statement-offset: 2
## eval: (add-hook 'write-file-hooks 'time-stamp)
## time-stamp-start: "my $VERSION = '"
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
## time-stamp-time-zone: "UTC"
## time-stamp-end: "'; # UTC"
## End:
-54
View File
@@ -1,54 +0,0 @@
This directory contains examples of Bison grammar files.
Most of them come from the documentation, which should be installed together
with Bison. The URLs are provided for convenience.
* Examples in C
** rpcalc - Reverse Polish Notation Calculator
The first example is that of a simple double-precision Reverse Polish
Notation calculator (a calculator using postfix operators). This example
provides a good starting point, since operator precedence is not an issue.
Extracted from the documentation: "Reverse Polish Notation Calculator"
https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html
** mfcalc - Multi-Function Calculator
A more complete C example: a multi-function calculator.
Extracted from the documentation: "Multi-Function Calculator: mfcalc".
https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html
* Examples in C++
** c++ - A directory of simple C++ examples
** calc++ - A Complete C++ Example
A fully featured C++ version of the canonical example for parsers: a
calculator. Also uses Flex for the scanner.
Extracted from the documentation: "A Complete C++ Example".
https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html
-----
Local Variables:
mode: outline
fill-column: 76
ispell-dictionary: "american"
End:
Copyright (C) 2018 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the "GNU Free
Documentation License" file as part of this distribution.
# LocalWords: mfcalc calc parsers yy
-21
View File
@@ -1,21 +0,0 @@
# This Makefile is designed to be simple and readable. It does not
# aim at portability. It requires GNU Make.
BISON = bison
CXX = g++
CXXFLAGS =
PROGS = simple variant variant-11
simple: CXXFLAGS = -std=c++14
variant-11: CXXFLAGS = -std=c++11
all: $(PROGS)
%.cc %.hh: %.yy
$(BISON) $(BISONFLAGS) -o $*.cc $<
%: %.cc
$(CXX) $(CXXFLAGS) -o$@ $<
clean:
rm -f $(PROGS:=.cc) $(PROGS)
-47
View File
@@ -1,47 +0,0 @@
This directory contains examples of Bison grammar files in C++.
* Examples in C++
You can run `make` to compile these examples. And `make clean` to tidy
afterwards.
** simple.yy - Simple example in C++14
A very simple example in C++, based on variants and symbol constructors.
Variants allow to use any C++ type as semantic value type, and symbol
constructors ensure consistency between declared token type and effective
semantic value.
Run as `./simple`.
Extracted from the documentation: "A Simple C++ 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
A variation of simple.yy, in C++98.
Run as `./variant`.
** variant-11.yy - Self-contained example in modern C++
Another variation of simple.yy, closely related to the previous one, but
exhibiting support for C++11's move semantics.
Run as `./variant` or `./variant NUMBER`.
-----
Local Variables:
mode: outline
fill-column: 76
ispell-dictionary: "american"
End:
Copyright (C) 2018 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the "GNU Free
Documentation License" file as part of this distribution.
# LocalWords: mfcalc calc parsers yy ispell american
-70
View File
@@ -1,70 +0,0 @@
## Copyright (C) 2018 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/>.
cxxdir = $(examplesdir)/c++
## -------- ##
## Simple. ##
## -------- ##
BUILT_SOURCES += $(simple_sources)
CLEANFILES += %D%/simple.[ch] %D%/simple.output
CLEANDIRS += %D%/*.dSYM
cxx_DATA = $(simple_extracted)
simple_extracted = %D%/simple.yy
simple_sources = $(simple_extracted)
extracted += $(simple_extracted)
if ENABLE_CXX14
check_PROGRAMS += %D%/simple
nodist_%C%_simple_SOURCES = $(simple_sources)
%C%_simple_CXXFLAGS = $(CXX11_CXXFLAGS) $(WARN_CXXFLAGS_TEST)
# Don't use gnulib's system headers.
%C%_simple_CPPFLAGS = -I$(top_builddir)
TESTS += %D%/simple.test
%D%/simple.cc: $(BISON_IN) $(dist_pkgdata_DATA)
endif
EXTRA_DIST += %D%/simple.test
## ---------- ##
## Variants. ##
## ---------- ##
if ENABLE_CXX
check_PROGRAMS += %D%/variant
nodist_%C%_variant_SOURCES = %D%/variant.yy
# Don't use gnulib's system headers.
%C%_variant_CPPFLAGS = -I$(top_builddir)
TESTS += %D%/variant.test
%D%/variant.cc: $(BISON_IN) $(dist_pkgdata_DATA)
endif
EXTRA_DIST += %D%/variant.test
if ENABLE_CXX11
check_PROGRAMS += %D%/variant-11
nodist_%C%_variant_11_SOURCES = %D%/variant-11.yy
%C%_variant_11_CXXFLAGS = $(CXX11_CXXFLAGS) $(WARN_CXXFLAGS_TEST)
# Don't use gnulib's system headers.
%C%_variant_11_CPPFLAGS = -I$(top_builddir)
TESTS += %D%/variant-11.test
%D%/variant-11.cc: $(BISON_IN) $(dist_pkgdata_DATA)
endif
EXTRA_DIST += %D%/variant-11.test
dist_cxx_DATA = %D%/README %D%/Makefile %D%/variant.yy %D%/variant-11.yy
CLEANFILES += %D%/simple.output %D%/variant.output %D%/variant-11.output
-4
View File
@@ -1,4 +0,0 @@
#! /bin/sh
: >input
run 0 "{I have three numbers for you., 1, 2, 3, And that's all!}"
-21
View File
@@ -1,21 +0,0 @@
#! /bin/sh
# Copyright (C) 2018 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/>.
: >input
run 0 "{I have numbers for you., 1, 2, 3, And that's all!}" 4
run 0 "{I have numbers for you., 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, And that's all!}" 1000
-154
View File
@@ -1,154 +0,0 @@
/*
Copyright (C) 2008-2015, 2018 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/>.
*/
%require "3.2"
%debug
%language "c++"
%define api.token.constructor
%define api.value.type variant
%define api.value.automove
%define api.location.file none
%define parse.assert
%locations
%code requires // *.hh
{
#include <memory> // std::unique_ptr
#include <string>
#include <vector>
using string_uptr = std::unique_ptr<std::string>;
using string_uptrs = std::vector<string_uptr>;
}
%code // *.cc
{
#include <climits> // INT_MIN, INT_MAX
#include <iostream>
#include <sstream>
namespace yy
{
// Prototype of the yylex function providing subsequent tokens.
static parser::symbol_type yylex ();
// Print a vector of strings.
std::ostream&
operator<< (std::ostream& o, const string_uptrs& ss)
{
o << '{';
const char *sep = "";
for (const auto& s: ss)
{
o << sep << *s;
sep = ", ";
}
return o << '}';
}
}
template <typename... Args>
string_uptr
make_string_uptr (Args&&... args)
{
// std::make_unique is C++14.
return string_uptr (new std::string{std::forward<Args> (args)...});
}
}
%token <string_uptr> TEXT;
%token <int> NUMBER;
%printer { yyo << '(' << &$$ << ") " << $$; } <*>;
%printer { yyo << *$$; } <string_uptr>;
%token END_OF_FILE 0;
%type <string_uptr> item;
%type <string_uptrs> list;
%%
result:
list { std::cout << $1 << '\n'; }
;
list:
%empty { /* Generates an empty string list */ }
| list item { $$ = $1; $$.emplace_back ($2); }
;
item:
TEXT
| NUMBER { $$ = make_string_uptr (std::to_string ($1)); }
;
%%
// The last number return by the scanner is max - 1.
int max = 4;
namespace yy
{
// The yylex function providing subsequent tokens:
// TEXT "I have three numbers for you."
// NUMBER 1
// NUMBER 2
// NUMBER ...
// NUMBER max - 1
// TEXT "And that's all!"
// END_OF_FILE
static
parser::symbol_type
yylex ()
{
static int count = 0;
const int stage = count;
++count;
auto loc = parser::location_type{nullptr, unsigned (stage + 1), unsigned (stage + 1)};
if (stage == 0)
return parser::make_TEXT (make_string_uptr ("I have numbers for you."), std::move (loc));
else if (stage < max)
return parser::make_NUMBER (stage, std::move (loc));
else if (stage == max)
return parser::make_TEXT (make_string_uptr ("And that's all!"), std::move (loc));
else
return parser::make_END_OF_FILE (std::move (loc));
}
// Mandatory error function
void
parser::error (const parser::location_type& loc, const std::string& msg)
{
std::cerr << loc << ": " << msg << '\n';
}
}
int
main (int argc, const char *argv[])
{
if (2 <= argc && isdigit (*argv[1]))
{
auto maxl = strtol (argv[1], nullptr, 10);
max = INT_MIN <= maxl && maxl <= INT_MAX ? int(maxl) : 4;
}
auto&& p = yy::parser{};
p.set_debug_level (!!getenv ("YYDEBUG"));
return p.parse ();
}
// Local Variables:
// mode: C++
// End:
-19
View File
@@ -1,19 +0,0 @@
#! /bin/sh
# Copyright (C) 2018 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/>.
: >input
run 0 "{I have three numbers for you., 1, 2, 3, And that's all!}"
-154
View File
@@ -1,154 +0,0 @@
/*
Copyright (C) 2008-2015, 2018 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/>.
*/
%require "3.2"
%debug
%language "c++"
%define api.token.constructor
%define api.value.type variant
%define api.location.file none
%define parse.assert
%locations
%code requires // *.hh
{
#include <string>
#include <vector>
typedef std::vector<std::string> strings_type;
}
%code // *.cc
{
#include <iostream>
#include <sstream>
namespace yy
{
// Prototype of the yylex function providing subsequent tokens.
static parser::symbol_type yylex ();
// Print a vector of strings.
std::ostream&
operator<< (std::ostream& o, const strings_type& ss)
{
o << '{';
const char *sep = "";
for (strings_type::const_iterator i = ss.begin (), end = ss.end ();
i != end; ++i)
{
o << sep << *i;
sep = ", ";
}
return o << '}';
}
}
// Convert to string.
template <typename T>
std::string
to_string (const T& t)
{
std::ostringstream o;
o << t;
return o.str ();
}
}
%token <::std::string> TEXT;
%token <int> NUMBER;
%printer { yyo << '(' << &$$ << ") " << $$; } <*>;
%token END_OF_FILE 0;
%type <::std::string> item;
%type <::std::vector<std::string>> list;
%%
result:
list { std::cout << $1 << '\n'; }
;
list:
%empty { /* Generates an empty string list */ }
| list item { std::swap ($$, $1); $$.push_back ($2); }
;
item:
TEXT
| NUMBER { $$ = to_string ($1); }
;
%%
namespace yy
{
// Use nullptr with pre-C++11.
#if !defined __cplusplus || __cplusplus < 201103L
# define NULLPTR 0
#else
# define NULLPTR nullptr
#endif
// The yylex function providing subsequent tokens:
// TEXT "I have three numbers for you."
// NUMBER 1
// NUMBER 2
// NUMBER 3
// TEXT "And that's all!"
// END_OF_FILE
static
parser::symbol_type
yylex ()
{
static int count = 0;
const int stage = count;
++count;
parser::location_type loc (NULLPTR, unsigned (stage + 1), unsigned (stage + 1));
switch (stage)
{
case 0:
return parser::make_TEXT ("I have three numbers for you.", loc);
case 1:
case 2:
case 3:
return parser::make_NUMBER (stage, loc);
case 4:
return parser::make_TEXT ("And that's all!", loc);
default:
return parser::make_END_OF_FILE (loc);
}
}
// Mandatory error function
void
parser::error (const parser::location_type& loc, const std::string& msg)
{
std::cerr << loc << ": " << msg << '\n';
}
}
int
main ()
{
yy::parser p;
p.set_debug_level (!!getenv ("YYDEBUG"));
return p.parse ();
}
// Local Variables:
// mode: C++
// End:
+9 -9
View File
@@ -2,18 +2,18 @@
/*.tmp /*.tmp
/.deps /.deps
/calc++ /calc++
/calc++-driver.cc
/calc++-driver.hh
/calc++-parser.cc
/calc++-parser.hh
/calc++-parser.output
/calc++-parser.stamp
/calc++-parser.yy
/calc++-scanner.cc
/calc++-scanner.ll
/calc++.cc /calc++.cc
/calc++.exe /calc++.exe
/calc.stamp /calc.stamp
/driver.cc
/driver.hh
/location.hh /location.hh
/parser.cc
/parser.hh
/parser.output
/parser.stamp
/parser.yy
/position.hh /position.hh
/scanner.cc
/scanner.ll
/stack.hh /stack.hh
-27
View File
@@ -1,27 +0,0 @@
# This Makefile is designed to be simple and readable. It does not
# aim at portability. It requires GNU Make.
BISON = bison
CXX = g++
FLEX = flex
all: calc++
%.cc %.hh: %.yy
$(BISON) $(BISONFLAGS) -o $*.cc $<
%.cc: %.ll
$(FLEX) $(FLEXFLAGS) -o$@ $<
%.o: %.cc
$(CXX) $(CXXFLAGS) -c -o$@ $<
calc++: calc++.o driver.o parser.o scanner.o
$(CXX) -o $@ $^
calc++.o: parser.hh
parser.o: parser.hh
scanner.o: parser.hh
clean:
rm -f calc++ *.o parser.hh parser.cc scanner.cc
-52
View File
@@ -1,52 +0,0 @@
This directory contains calc++, a simple Bison grammar file in C++.
Please, read the corresponding chapter in the documentation: "A Complete C++
Example". It is also available on line (maybe with a different version of
Bison):
https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html
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
several variable definitions, one per line, and then a single expression to
evaluate.
The program calc++ expects the file to parse as argument; pass `-` to read
the standard input (and then hit <Ctrl-d>, control-d, to end your input).
$ ./calc++ -
one := 1
two := 2
three := 3
(one + two * three) * two * three
<Ctrl-d>
42
You may pass `-p` to activate the parser debug traces, and `-s` to activate
the scanner's.
-----
Local Variables:
mode: outline
fill-column: 76
ispell-dictionary: "american"
End:
Copyright (C) 2018 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
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/>.
# LocalWords: mfcalc calc parsers yy MERCHANTABILITY Ctrl ispell american
+4 -12
View File
@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005-2012 Free Software Foundation, Inc.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -19,8 +19,7 @@ cat >input <<EOF
toto := 1 toto := 1
toto toto
EOF EOF
run 0 1 run 0 1 -s
run -noerr 0 1 -s
cat >input <<EOF cat >input <<EOF
@@ -31,7 +30,7 @@ d := a + b * c
d d
EOF EOF
run 0 7 run 0 7
run -noerr 0 7 -p run 0 7 -p
cat >input <<EOF cat >input <<EOF
@@ -48,11 +47,4 @@ cat >input <<EOF
a := 1 a := 1
d := a + b * c d := a + b * c
EOF EOF
run 1 'err: -:3.1: syntax error, unexpected end of file, expecting ( or identifier or number' run 1 ''
cat >input <<EOF
a := 072101108108111044032119111114108100033
a
EOF
run 1 'err: -:1.6-44: integer is out of range: 072101108108111044032119111114108100033'
+50 -61
View File
@@ -1,18 +1,17 @@
## Copyright (C) 2005-2006, 2008-2015, 2018 Free Software Foundation, # Copyright (C) 2005-2006, 2008-2012 Free Software Foundation, Inc.
## Inc. #
## # This program is free software: you can redistribute it and/or modify
## 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
## it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or
## the Free Software Foundation, either version 3 of the License, or # (at your option) any later version.
## (at your option) any later version. #
## # This program is distributed in the hope that it will be useful,
## This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of
## but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details.
## GNU General Public License for more details. #
## # 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/>.
## ------------------- ## ## ------------------- ##
## Parser generation. ## ## Parser generation. ##
@@ -20,7 +19,7 @@
# Don't depend on $(BISON) otherwise we would rebuild these files # Don't depend on $(BISON) otherwise we would rebuild these files
# in srcdir, including during distcheck, which is forbidden. # in srcdir, including during distcheck, which is forbidden.
%D%/parser.stamp: $(BISON_IN) examples/calc++/calc++-parser.stamp: $(BISON_IN)
SUFFIXES += .yy .stamp SUFFIXES += .yy .stamp
.yy.stamp: .yy.stamp:
$(AM_V_YACC)rm -f $@ $(AM_V_YACC)rm -f $@
@@ -28,57 +27,47 @@ SUFFIXES += .yy .stamp
$(AM_V_at)$(YACCCOMPILE) -o $*.cc $< $(AM_V_at)$(YACCCOMPILE) -o $*.cc $<
$(AM_V_at)mv -f $@.tmp $@ $(AM_V_at)mv -f $@.tmp $@
$(calcxx_sources_generated): %D%/parser.stamp $(calc_sources_generated): examples/calc++/calc++-parser.stamp
@test -f $@ || rm -f %D%/parser.stamp @test -f $@ || rm -f examples/calc++/calc++-parser.stamp
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/parser.stamp @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/calc++/calc++-parser.stamp
CLEANFILES += \ CLEANFILES += \
$(calcxx_sources_generated) \ $(calc_sources_generated) \
%D%/parser.output \ examples/calc++/calc++-parser.output \
%D%/parser.stamp \ examples/calc++/calc++-parser.stamp \
%D%/scanner.cc examples/calc++/calc++-scanner.cc
CLEANDIRS += %D%/*.dSYM
## -------------------- ## ## -------------------- ##
## Building & testing. ## ## Building & testing. ##
## -------------------- ## ## -------------------- ##
# Avoid using BUILT_SOURCES which is too global. # Avoid using BUILT_SOURCES which is too global.
$(%C%_calc___OBJECTS): $(calcxx_sources_generated) $(examples_calc___calc___OBJECTS): $(calc_sources_generated)
calcxx_sources_extracted = \ calc_sources_extracted = \
%D%/driver.cc \ examples/calc++/calc++-driver.cc \
%D%/driver.hh \ examples/calc++/calc++-driver.hh \
%D%/scanner.ll \ examples/calc++/calc++-scanner.ll \
%D%/calc++.cc examples/calc++/calc++.cc
calcxx_extracted = \ calc_extracted = \
$(calcxx_sources_extracted) \ $(calc_sources_extracted) \
%D%/parser.yy examples/calc++/calc++-parser.yy
extracted += $(calcxx_extracted) extracted += $(calc_extracted)
calcxx_sources_generated = \ calc_sources_generated = \
%D%/parser.cc \ examples/calc++/calc++-parser.cc \
%D%/parser.hh \ examples/calc++/calc++-parser.hh \
%D%/location.hh examples/calc++/location.hh \
calcxx_sources = \ examples/calc++/position.hh \
$(calcxx_sources_extracted) \ examples/calc++/stack.hh
$(calcxx_sources_generated) calc_sources = \
$(calc_sources_extracted) \
$(calc_sources_generated)
if FLEX_CXX_WORKS if BISON_CXX_WORKS
if ENABLE_CXX check_PROGRAMS += examples/calc++/calc++
check_PROGRAMS += %D%/calc++ nodist_examples_calc___calc___SOURCES = \
nodist_%C%_calc___SOURCES = $(calcxx_sources) $(calc_sources)
# Don't use gnulib's system headers.
%C%_calc___CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
%C%_calc___CXXFLAGS = $(AM_CXXFLAGS) $(FLEX_SCANNER_CXXFLAGS)
TESTS += %D%/calc++.test
endif ENABLE_CXX
endif FLEX_CXX_WORKS
EXTRA_DIST += %D%/calc++.test
examples_calc___calc___CPPFLAGS = -I$(top_builddir)/examples/calc++
## ------------ ## dist_TESTS += examples/calc++/calc++.test
## Installing. ## endif
## ------------ ##
calcxxdir = $(docdir)/examples/calc++
calcxx_DATA = $(calcxx_extracted)
dist_calcxx_DATA = %D%/README %D%/Makefile
+6
View File
@@ -0,0 +1,6 @@
// Work around an Automake 1.11.2 bug: it asks for the creation of
// y.tab.c and y.tab.h and then renames them as calc++-parser.cc and
// calc++-parser.h, but in the former it does not convert the
// #include "y.tab.h". We don't want this to show in the
// documentation.
#include "calc++-parser.hh"
+15 -51
View File
@@ -3,8 +3,8 @@
# This file is part of GNU Bison # This file is part of GNU Bison
# Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2015, 2018 Free # Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2012 Free Software
# Software Foundation, Inc. # Foundation, Inc.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
# 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/>.
# Usage: extexi [OPTION...] input-file.texi ... -- [FILES to extract] # Usage: extexi input-file.texi ... -- [FILES to extract]
# Look for @example environments preceded with lines such as: # Look for @example environments preceded with lines such as:
# #
@@ -32,27 +32,9 @@
# output before block 2, even if the latter appears before). The same # output before block 2, even if the latter appears before). The same
# number may be used several time, in which case the order of # number may be used several time, in which case the order of
# appearance is used. # appearance is used.
#
# Use @ignore for code to extract that must not be part of the
# documentation. For instance:
#
# @ignore
# @comment file: calc++/scanner.ll
# @example
# // Work around an incompatibility in Flex.
# # undef yywrap
# # define yywrap() 1
# @end example
# @end ignore
use strict; use strict;
use File::Basename qw(dirname);
use File::Path qw(make_path);
# Whether we generate synclines.
my $synclines = 0;
# normalize($block) # normalize($block)
# ----------------- # -----------------
# Remove Texinfo mark up. # Remove Texinfo mark up.
@@ -60,7 +42,7 @@ sub normalize($)
{ {
local ($_) = @_; local ($_) = @_;
s/^\@(c |comment|dots|end (ignore|group)|ignore|group).*\n//mg; s/^\@(c |comment|dots|end (ignore|group)|ignore|group).*//mg;
s/\@value\{VERSION\}/$ENV{VERSION}/g; s/\@value\{VERSION\}/$ENV{VERSION}/g;
s/^\@(error|result)\{\}//mg; s/^\@(error|result)\{\}//mg;
s/\@([{}@])/$1/g; s/\@([{}@])/$1/g;
@@ -80,24 +62,9 @@ sub message($)
} }
} }
# The list of files we should extract. # basename => full file name for files we should extract.
my @file_wanted; my %file_wanted;
# Whether we should extract that file, and then under which path.
sub file_wanted ($)
{
my ($f) = @_;
for my $file (@file_wanted)
{
# No endswith in Perl 5...
return $file if $f eq substr($file, -length($f));
}
undef
}
# process ($in)
# -------------
# Read input file $in, and generate the outputs.
sub process ($) sub process ($)
{ {
my ($in) = @_; my ($in) = @_;
@@ -119,9 +86,9 @@ sub process ($)
{ {
my $f = $1; my $f = $1;
$block = $2 || 1; $block = $2 || 1;
if (file_wanted($f)) if ($file_wanted{$f})
{ {
$file = file_wanted($f); $file = $file_wanted{$f};
message(" GEN $file"); message(" GEN $file");
} }
else else
@@ -135,14 +102,14 @@ sub process ($)
{ {
# Bison supports synclines, but not Flex. # Bison supports synclines, but not Flex.
$input .= sprintf ("#line %s \"$in\"\n", $. + 1) $input .= sprintf ("#line %s \"$in\"\n", $. + 1)
if $synclines && $file =~ /\.[chy]*$/; if $file =~ /\.[chy]*$/;
next;
} }
elsif (/^\@end (small)?example$/) elsif (/^\@end (small)?example$/)
{ {
die "no contents: $file" die "no contents: $file"
if $input eq ""; if $input eq "";
$file{$file}{$block} .= "\n" if defined $file{$file}{$block};
$file{$file}{$block} .= normalize($input); $file{$file}{$block} .= normalize($input);
$file = $input = undef; $file = $input = undef;
++$block; ++$block;
@@ -157,7 +124,7 @@ sub process ($)
# Output the files. # Output the files.
for my $file (keys %file) for my $file (keys %file)
{ {
make_path (dirname ($file)); # No spurious end of line: use printf.
my $o = new IO::File(">$file") my $o = new IO::File(">$file")
or die "$file: cannot create: $?"; or die "$file: cannot create: $?";
print $o $file{$file}{$_} print $o $file{$file}{$_}
@@ -169,17 +136,14 @@ my @input;
my $seen_dash = 0; my $seen_dash = 0;
for my $arg (@ARGV) for my $arg (@ARGV)
{ {
if ($seen_dash) if ($arg eq '--')
{
push @file_wanted, $arg;
}
elsif ($arg eq '--')
{ {
$seen_dash = 1; $seen_dash = 1;
} }
elsif ($arg eq '--synclines') elsif ($seen_dash)
{ {
$synclines = 1; use File::Basename;
$file_wanted{basename($arg)} = $arg;
} }
else else
{ {
+26 -67
View File
@@ -1,81 +1,40 @@
## Copyright (C) 2005, 2008-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005, 2008-2012 Free Software Foundation, Inc.
## #
## This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or # the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version. # (at your option) any later version.
## #
## This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details. # GNU General Public License for more details.
## #
## 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/>.
dist_noinst_SCRIPTS = %D%/extexi %D%/test dist_noinst_SCRIPTS = examples/extexi examples/test
TEST_LOG_COMPILER = $(top_srcdir)/%D%/test TEST_LOG_COMPILER = $(top_srcdir)/examples/test
AM_CXXFLAGS = \
$(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS)
## ------------ ## ## ------------ ##
## Extracting. ## ## Extracting. ##
## ------------ ## ## ------------ ##
doc = $(top_srcdir)/doc/bison.texi doc = $(top_srcdir)/doc/bison.texi
extexi = $(top_srcdir)/%D%/extexi extexi = $(top_srcdir)/examples/extexi
if ENABLE_GCC_WARNINGS extract = VERSION="$(VERSION)" $(PERL) -f $(extexi) $(doc) --
EXTEXIFLAGS = --synclines
endif
extract = VERSION="$(VERSION)" $(PERL) $(extexi) $(EXTEXIFLAGS) $(doc) --
extracted = extracted =
EXTRA_DIST += $(extracted) CLEANFILES += $(extracted) examples/extracted.stamp
MAINTAINERCLEANFILES += $(extracted) %D%/extracted.stamp examples/extracted.stamp: $(doc) $(extexi)
%D%/extracted.stamp: $(doc) $(extexi)
$(AM_V_GEN)rm -f $@ $@.tmp $(AM_V_GEN)rm -f $@ $@.tmp
$(AM_V_at)$(MKDIR_P) %D%
$(AM_V_at)touch $@.tmp $(AM_V_at)touch $@.tmp
$(AM_V_at)$(extract) $(extracted) $(AM_V_at)$(extract) $(extracted)
$(AM_V_at)mv $@.tmp $@ $(AM_V_at)mv $@.tmp $@
$(extracted): %D%/extracted.stamp $(extracted): examples/extracted.stamp
@test -f $@ || rm -f %D%/extracted.stamp @test -f $@ || rm -f examples/extracted.stamp
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/extracted.stamp @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/extracted.stamp
include examples/calc++/local.mk
## ------ ## include examples/mfcalc/local.mk
## Dist. ## include examples/rpcalc/local.mk
## ------ ##
# Ship the stamp file, otherwise it will be recreated, which is what
# we want to avoid.
EXTRA_DIST += %D%/extracted.stamp
# Suppress the #lines from the examples when rolling the tarball, so
# that regular users have readable examples even before installing
# Bison.
dist-hook: examples-unline
.PHONY: examples-unline
examples-unline:
for e in $(extracted); \
do \
e=$(distdir)/$$e; \
sed -e '/#line/d' $$e >$$e.tmp; \
mv -f $$e.tmp $$e; \
done
## ---------- ##
## Examples. ##
## ---------- ##
examplesdir = $(docdir)/examples
dist_examples_DATA = %D%/README
CLEANDIRS += %D%/*.dSYM
include %D%/calc++/local.mk
include %D%/c++/local.mk
include %D%/mfcalc/local.mk
include %D%/rpcalc/local.mk
+26 -32
View File
@@ -1,42 +1,36 @@
## Copyright (C) 2005-2006, 2008-2015, 2018 Free Software Foundation, # Copyright (C) 2005-2006, 2008-2012 Free Software Foundation, Inc.
## Inc. #
## # This program is free software: you can redistribute it and/or modify
## 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
## it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or
## the Free Software Foundation, either version 3 of the License, or # (at your option) any later version.
## (at your option) any later version. #
## # This program is distributed in the hope that it will be useful,
## This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of
## but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details.
## GNU General Public License for more details. #
## # 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/>.
## -------------------- ## ## -------------------- ##
## Building & testing. ## ## Building & testing. ##
## -------------------- ## ## -------------------- ##
BUILT_SOURCES += $(mfcalc_sources) BUILT_SOURCES += $(mfcalc_sources)
CLEANFILES += %D%/mfcalc.[ch] %D%/mfcalc.output CLEANFILES += examples/mfcalc/mfcalc.[ch] examples/mfcalc/mfcalc.output
CLEANDIRS += %D%/*.dSYM
mfcalc_extracted = %D%/calc.h %D%/mfcalc.y mfcalc_extracted = \
mfcalc_sources = $(mfcalc_extracted) examples/mfcalc/calc.h \
examples/mfcalc/mfcalc.y
mfcalc_sources = \
$(mfcalc_extracted)
extracted += $(mfcalc_extracted) extracted += $(mfcalc_extracted)
check_PROGRAMS += %D%/mfcalc check_PROGRAMS += examples/mfcalc/mfcalc
nodist_%C%_mfcalc_SOURCES = $(mfcalc_sources) examples_mfcalc_mfcalc_LDADD = -lm
# Don't use gnulib's system headers. nodist_examples_mfcalc_mfcalc_SOURCES = \
%C%_mfcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D% $(mfcalc_sources)
%C%_mfcalc_LDADD = -lm
dist_TESTS += %D%/mfcalc.test examples_mfcalc_mfcalc_CPPFLAGS = -I$(top_builddir)/examples/mfcalc
dist_TESTS += examples/mfcalc/mfcalc.test
## ------------ ##
## Installing. ##
## ------------ ##
mfcalcdir = $(docdir)/examples/mfcalc
mfcalc_DATA = $(mfcalc_extracted)
+2 -2
View File
@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005-2012 Free Software Foundation, Inc.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -24,4 +24,4 @@ cat >input <<EOF
(1+2) * 3 (1+2) * 3
EOF EOF
run 0 9 run 0 9
run -noerr 0 9 -p run 0 9 -p
-1
View File
@@ -1,5 +1,4 @@
/calc.h /calc.h
/rpcalc
/rpcalc.c /rpcalc.c
/rpcalc.h /rpcalc.h
/rpcalc.output /rpcalc.output
+25 -32
View File
@@ -1,42 +1,35 @@
## Copyright (C) 2005-2006, 2008-2015, 2018 Free Software Foundation, # Copyright (C) 2005-2006, 2008-2012 Free Software Foundation, Inc.
## Inc. #
## # This program is free software: you can redistribute it and/or modify
## 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
## it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or
## the Free Software Foundation, either version 3 of the License, or # (at your option) any later version.
## (at your option) any later version. #
## # This program is distributed in the hope that it will be useful,
## This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of
## but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details.
## GNU General Public License for more details. #
## # 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/>.
## -------------------- ## ## -------------------- ##
## Building & testing. ## ## Building & testing. ##
## -------------------- ## ## -------------------- ##
BUILT_SOURCES += $(rpcalc_sources) BUILT_SOURCES += $(rpcalc_sources)
CLEANFILES += %D%/rpcalc.[ch] %D%/rpcalc.output CLEANFILES += examples/rpcalc/rpcalc.[ch] examples/rpcalc/rpcalc.output
CLEANDIRS += %D%/*.dSYM
rpcalc_extracted = %D%/rpcalc.y rpcalc_extracted = \
rpcalc_sources = $(rpcalc_extracted) examples/rpcalc/rpcalc.y
rpcalc_sources = \
$(rpcalc_extracted)
extracted += $(rpcalc_extracted) extracted += $(rpcalc_extracted)
check_PROGRAMS += %D%/rpcalc check_PROGRAMS += examples/rpcalc/rpcalc
nodist_%C%_rpcalc_SOURCES = $(rpcalc_sources) examples_rpcalc_rpcalc_LDADD = -lm
# Don't use gnulib's system headers. nodist_examples_rpcalc_rpcalc_SOURCES = \
%C%_rpcalc_CPPFLAGS = -I$(top_builddir)/%D% $(rpcalc_sources)
%C%_rpcalc_LDADD = -lm
dist_TESTS += %D%/rpcalc.test examples_rpcalc_rpcalc_CPPFLAGS = -I$(top_builddir)/examples/rpcalc
dist_TESTS += examples/rpcalc/rpcalc.test
## ------------ ##
## Installing. ##
## ------------ ##
rpcalcdir = $(docdir)/examples/rpcalc
rpcalc_DATA = $(rpcalc_extracted)
+1 -1
View File
@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005-2012 Free Software Foundation, Inc.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
+15 -33
View File
@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Copyright (C) 2005-2015, 2018 Free Software Foundation, Inc. # Copyright (C) 2005-2012 Free Software Foundation, Inc.
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -15,8 +15,7 @@
# 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/>.
me=$(basename "$1" .test) me=`basename $1 .test`
medir=$(basename "$(dirname "$1")")
# Number of the current test. # Number of the current test.
number=1 number=1
@@ -24,28 +23,17 @@ number=1
# Exit status of this script. # Exit status of this script.
exit=true exit=true
# top_builddir. # top_buiddir.
cwd=$(pwd) cwd=`pwd`
# The exercised program. # The exercised program.
for p in "$cwd/examples/$medir/$me" "$cwd/examples/$me" prog=$cwd/examples/$me/$me
do
if test -x "$p"; then
prog=$p
break
fi
done
if test x"$prog" = x; then
echo "$me: ERROR: cannot find program to exercise"
exit 1
fi
# cleanup # cleanup
# ------- # -------
cleanup () cleanup ()
{ {
status=$? local status=$?
if test -z "$DEBUG"; then if test -z "$DEBUG"; then
cd $cwd cd $cwd
rm -rf $$.dir rm -rf $$.dir
@@ -56,27 +44,21 @@ trap cleanup 0 1 2 13 15
mkdir $$.dir mkdir $$.dir
cd $$.dir cd $$.dir
# run [-noerr] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] # run EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
# ------------------------------------------------------------------ # ---------------------------------------------------------
# -noerr: ignore stderr, otherwise merge it into effective output.
run () run ()
{ {
noerr=false
case $1 in
(-noerr) noerr=true; shift;;
esac
# Expected exit status. # Expected exit status.
sta_exp=$1 local sta_exp=$1
shift shift
# Expected output. # Expected output.
out_exp=$1 local out_exp=$1
shift shift
$prog "$@" - <input >out_eff
# Effective exit status. # Effective exit status.
sta_eff=0 local sta_eff=$?
$prog "$@" - <input >out_eff 2>err_eff || sta_eff=$? # Effective output.
# Combine effective output and error streams. local out_eff=`cat out_eff`
out_eff=$(cat out_eff && $noerr || sed -e 's/^/err: /g' err_eff)
if test $sta_eff -eq $sta_exp; then if test $sta_eff -eq $sta_exp; then
if test "$out_eff" = "$out_exp"; then if test "$out_eff" = "$out_exp"; then
echo "$me: PASS: $number" echo "$me: PASS: $number"
@@ -88,7 +70,7 @@ run ()
echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)" echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)"
exit=false exit=false
fi fi
number=$(expr $number + 1) number=`expr $number + 1`
} }
# We have cd'd one level deeper. # We have cd'd one level deeper.

Some files were not shown because too many files have changed in this diff Show More