Compare commits

..
Author SHA1 Message Date
Joel E. Denny 2d2a7d608e Version 2.4.1a delayed.
* NEWS (2.4.1a): Increment release date as there has been a
small delay in getting the announcements and tarballs out.
2010-01-22 13:02:31 -05:00
Joel E. Denny 5ea72c19da Version 2.4.1a.
* NEWS (2.4.2): Rename to...
(2.4.1a): ... this for now.  Set date.
* configure.ac (AM_INIT_AUTOMAKE): Disable gnits for now because
it does not like this version name.
2010-01-21 18:53:58 -05:00
Joel E. Denny 97d520633b * cfg.mk (gnulib_dir): Assume gnulib is a subdirectory. 2010-01-21 18:52:49 -05:00
Joel E. Denny af8a609a90 maint: automate PACKAGE_COPYRIGHT_YEAR update, and update it.
* HACKING (Release Procedure): Update notes on copyright years.
* Makefile.am (update-package-copyright-year): New target rule.
* build-aux/update-package-copyright-year: New file.
* cfg.mk (update-copyright): Add update-package-copyright-year
as a dependency.
2010-01-21 16:48:35 -05:00
Joel E. Denny 73edad9a25 * bootstrap: Import improvements from latest gnulib. 2010-01-20 00:26:05 -05:00
Joel E. Denny 9736697d6d build: require Automake 1.11.1 to avoid a security flaw.
* HACKING (Release Procedure): Don't document Automake security
flaw here.
* configure.ac (AM_INIT_AUTOMAKE): Require 1.11.1, and explain
why here.
2010-01-20 00:17:02 -05:00
Joel E. Denny e2f3fda11a gnulib: update to latest. 2010-01-19 14:20:12 -05:00
Joel E. Denny 3c0be43411 ChangeLog (2006-09-15): add Odd Arild Olsen's role for push.c.
(cherry picked from commit d6bdb90a2a)
2010-01-19 11:52:58 -05:00
Joel E. Denny d45708d418 Thank the developer of the initial push parser implementation.
This unfortunate oversight is several years old.
* THANKS (Odd Arild Olsen): Add.
(cherry picked from commit 326e5cf81e)
2010-01-15 13:45:08 -05:00
Joel E. Denny 219c26ea51 maint: run "make update-copyright" 2010-01-04 13:59:11 -05:00
Joel E. Denny f1ceed0774 POSIX: warn if %prec's token was not defined.
Reported by Florian Krohm at
<http://lists.gnu.org/archive/html/bug-bison/2009-12/msg00005.html>.
* NEWS (2.4.2): Document.
* src/reader.c (grammar_rule_check): Implement.
(grammar_current_rule_prec_set): Add comments explaining that we
here assume a %prec identifier is a token, but we still manage
to support POSIX.
* tests/input.at (%prec's token must be defined): New test
group.
2009-12-31 12:49:42 -05:00
Joel E. Denny d2829fdc04 * HACKING (Release Procedure): Recommend a secure automake. 2009-12-31 12:43:33 -05:00
Joel E. Denny 43dc3c8bc4 YYFAIL: deprecate.
* NEWS (2.4.2): Document deprecation and the phase-out plan.
* data/lalr1.java (parser::YYStack::YYFAIL): Add comment about
deprecation.
* data/yacc.c (YYFAIL): Likewise, and suppress warnings about
YYFAIL from GCC cpp's -Wunused-macros.
* doc/bison.texinfo (Java Action Features): Remove YYFAIL
documentation.
(cherry picked from commit 1625df5b18)

Conflicts:

	doc/bison.texinfo
	src/parse-gram.c
	src/parse-gram.h
2009-12-22 13:26:15 -05:00
Joel E. Denny 3d04b5673d Add gcc's -Wundef to test suite and fix another warning from it.
* NEWS (2.4.2): Update description of -Wundef fix.
* configure.ac (WARN_CXXFLAGS_TEST): New substitution.
(WARN_CFLAGS_TEST): New substitution.
* data/glr.c: Avoid warning about __STRICT_ANSI__.
* tests/atlocal.in (CFLAGS): Use WARN_CFLAGS_TEST instead of
WARN_CFLAGS.
(CXXFLAGS): Use WARN_CXXFLAGS_TEST instead of WARN_CXXFLAGS.
(cherry picked from commit a603c6e0bb)

Conflicts:

	tests/atlocal.in
2009-12-16 13:43:59 -05:00
Joel E. Denny 39c2566994 Document gcc -Wundef fix.
* NEWS (2.4.2): Here.
* THANKS (Jonathan Nieder): Add.
(cherry picked from commit c938d650db)
2009-12-16 01:58:38 -05:00
Jonathan Nieder 1694ac5cf2 Avoid warnings from gcc -Wundef y.tab.c.
* data/glr.c: Check if YYENABLE_NLS and YYLTYPE_IS_TRIVIAL are
defined before using them.
* data/lalr1.cc: Likewise.
* data/yacc.c: Likewise.
(cherry picked from commit ae93128c96)
2009-12-16 01:58:21 -05:00
Joel E. Denny dfff662817 Import M4 detection fix from Autoconf.
Reported by Eric Blake.
* m4/m4.m4: Copy serial 10.
2009-12-15 19:12:16 -05:00
Joel E. Denny adf1725fdb Enable assertion output and --disable-assert for configure.
* bootstrap.conf (gnulib_modules): Add assert module.
* src/system.h (aver): Define as assert, and summarize the
discussion on this issue.
(cherry picked from commit ca01f454f0)

Conflicts:

	src/system.h
2009-12-14 18:23:36 -05:00
Joel E. Denny 7aaf9ce758 portability: use va_start and va_end in the same function.
* src/complain.c (error_message): Move va_end from here...
(ERROR_MESSAGE): ... to here.
(cherry picked from commit 786578e394)
2009-10-11 16:34:44 -04:00
Joel E. Denny 2ceb8c617c tests: skip tests of file names that platform does not support.
Reported by Michael Raskin at
<http://lists.gnu.org/archive/html/bug-bison/2009-09/msg00001.html>.
* THANKS (Michael Raskin): Add.
* tests/output.at (AT_CHECK_OUTPUT_FILE_NAME): Fix.  Cygwin used
to fail at least for file names containing ":" or "\".
2009-10-04 23:14:29 -04:00
Akim Demaille 87b9c9bc43 doc: spell checking.
* doc/bison.texinfo: here.
(cherry picked from commit c781580d07)

Conflicts:

	doc/bison.texinfo
2009-09-25 23:36:46 -04:00
Joel E. Denny dc25ce6bb1 tests: clean up push.at test group titles.
* tests/push.at: Remove "Push Parsing: " from test group titles
because these are already under the banner "Push Parsing Tests".
(cherry picked from commit 00d80a9ced)
2009-09-13 15:26:34 -04:00
Akim Demaille ace92a2691 NEWS: Internationalization.
* NEWS (2.4.2): Add "Internationalization" item.
(cherry picked from commit 2755de8fec)
2009-09-03 11:09:15 +02:00
Akim Demaille 397bb3932f bootstrap: fix/improve find_tool.
* bootstrap (find_tool): Improve error messages.
	Fix typo about find_tool_names.
2009-09-03 11:08:57 +02:00
Eric Blake bbbbe221d7 scan-gram: avoid portability trap with ctype usage.
* src/scan-gram.l (<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>):
Avoid compiler warning.

Signed-off-by: Eric Blake <[email protected]>
2009-08-27 20:16:07 -06:00
Joel E. Denny 4d7b57b527 tests: use perl for printing special sequences to files.
And skip tests if perl is not available.  This is better than
playing tricks with shell portability.  Suggested by Akim
Demaille.
* tests/input.at (Bad escapes in literals): Use it here for special
characters.
(cherry picked from commit b70c7fb4e1)

Conflicts:

	tests/input.at
2009-08-27 03:59:06 -04:00
Joel E. Denny 321fe707f4 Use locale when quoting.
* src/scan-gram.l (SC_ESCAPED_STRING, SC_ESCAPED_CHARACTER): Use
quote rather than implementing quoting here.
(cherry picked from commit e6c849d82a)
2009-08-21 20:37:26 -04:00
Eric Blake 1266b63674 Make previous patch more robust.
* src/output.c (ARRAY_CARDINALITY): New macro, copied from
argmatch.h.
(output_skeleton): Use it.
Suggested by Akim Demaille.

Signed-off-by: Eric Blake <[email protected]>
2009-08-20 16:43:07 -06:00
Eric Blake b9ad39c1fb Import latest m4/m4.m4.
* m4/m4.m4: Copy from autoconf 2.64.
* configure.ac (M4_GNU_OPTION): New define.
* src/output.c (output_skeleton): Use it to resolve FIXME.
* NEWS: Mention this.

Signed-off-by: Eric Blake <[email protected]>
2009-08-20 08:44:40 -06:00
Joel E. Denny b1a4261e6d Fix complaints about escape sequences.
Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2009-08/msg00036.html>.
* src/scan-gram.l (SC_ESCAPED_STRING, SC_ESCAPED_CHARACTER):
For a \0 and similar escape sequences meaning the null
character, report an invalid escape sequence instead of an
invalid null character because the latter does not actually
appear in the user's input.
In all escape sequence complaints, don't escape the initial
backslash, and don't quote when the sequence appears at the end
of the complaint line unless there's whitespace that quotearg
won't escape.
Consistently say "invalid" not "unrecognized".
* tests/input.at (Bad escapes in literals): New.
(cherry picked from commit c2724603c9)

Conflicts:

	tests/input.at
2009-08-19 21:11:35 -04:00
Akim Demaille a022ff4186 doc: %initial-action to initialize yylloc.
Reported by Bill Allombert.
	* doc/bison.texinfo: Set fill-column to 76.
	(Location Type): Document the use of %initial-action to initialize
	yylloc.

(cherry picked from commit d59e456dbf)
2009-08-19 13:37:20 +02:00
Joel E. Denny b5b94bd5e6 maint: update for gnulib's recent update-copyright changes
* gnulib: Update.
* .x-update-copyright (COPYING): Add as it's no longer implied
when .x-update-copyright is present.
* cfg.mk (update-copyright-local): Remove, now ignored.
(update-copyright): Declare update-b4-copyright as a dependency.
(cherry picked from commit c67e466f9d)
2009-08-18 18:50:59 -04:00
Akim Demaille b9e42bb439 build: lower gettext requirements.
Bison was uselessly requiring the formatstring macros from
gettext, which resulted in mo files not being installed on systems
that perfectly supported Bison mo files.  Lower the requirement.
http://lists.gnu.org/archive/html/bug-bison/2009-08/msg00006.html

	* configure.ac: Require need-ngettext instead of
	need-formatstring-macros.
	Reported by Martin Jabocs.
	Suggested by Bruno Haible.
	* INSTALL: Restructure.
	(Internationalization): New.
2009-08-17 09:48:11 +02:00
Joel E. Denny 75ac158b82 maint: fix use of copyright year intervals.
* gnulib: Update.
* bootstrap.conf (gnulib_modules): Update getopt to getopt-gnu
as now recommended in gnulib/NEWS.
* build-aux/update-b4-copyright: Fix.
* cfg.mk (update-copyright-env): Configure update-copyright.
2009-08-14 18:46:16 -04:00
Akim Demaille f23cd66008 distcheck: fix.
* examples/calc++/Makefile.am: (EXTRA_DIST): Ship calc.stamp.
2009-08-12 14:09:15 +02:00
Joel E. Denny 9874460819 maint: run "make update-copyright"
But first...
* .x-update-copyright (^data/m4sugar/): Add, because these
files are from Autoconf.
2009-08-06 20:17:42 -04:00
Joel E. Denny 915becaa5d maint: make update-b4-copyright easier to use
* build-aux/update-b4-copyright: In warnings, report line
numbers rather than character positions.
* cfg.mk (update-copyright-local): Set to update-b4-copyright so
that update-copyright runs it.
* gnulib: Update.
(cherry picked from commit a1a9422d4a)
2009-08-06 19:29:01 -04:00
Joel E. Denny ae50972393 maint: clean up update-b4-copyright code
* build-aux/update-b4-copyright: Do not accept 2-digit
UPDATE_COPYRIGHT_YEAR, which was not handled correctly.
Don't accept a `[' in a b4_copyright argument.
Format code more consistently.
Don't assume b4*copyright never occurs.
(cherry picked from commit 0b61a8ec18)
2009-08-05 20:02:16 -04:00
Joel E. Denny c9e0a88079 maint: automate b4_copyright updates.
* Makefile.am (update-b4-copyright): New target rule.
* build-aux/Makefile.am (EXTRA_DIST): Add update-b4-copyright.
* build-aux/update-b4-copyright: New.
* data/yacc.c: Remove stray characters around b4_copyright
invocations.
(cherry picked from commit ac2def5602)

Conflicts:

	data/yacc.c
2009-08-04 21:44:25 -04:00
Joel E. Denny 50bcb22c4c maint: automate annual package-wide copyright-year update.
* .x-update-copyright: New.
* Makefile.am (EXTRA_DIST): Remove maint.mk.
* bootstrap.conf (gnulib_modules): Add maintainer-makefile and
update-copyright.  Remove gnumakefile, which is implied by
maintainer-makefile.
* cfg.mk (bootstrap-tools): Copy from old maint.mk.
* gnulib: Update.
* maint.mk: Remove, now copied from gnulib.
* examples/extexi: Add missing "(C)" in copyright statement so
update-copyright can recognize it.
* src/LR0.h: Likewise.
* src/print.h: Likewise.
* src/print_graph.h: Likewise.
* src/gram.c: Add missing comma in copyright statement.
* src/gram.h: Likewise.
2009-08-04 18:00:39 -04:00
Joel E. Denny cfc9e431c3 Fix "make distcheck".
* examples/calc++/Makefile.am: Say $(srcdir)/calc.stamp instead
of just calc.stamp.
2009-08-04 15:09:53 -04:00
Joel E. Denny 42f8609bbd Pacify "gcc -Wunused" for the input function from Flex.
Reported by Alex Rozenman.  This warning shows up with gcc-4.3.0
and later.
* src/scan-code.l: Add "%option noinput", which I cannot find in
the Flex manual, but which Flex has supported since at least as
far back as 2.5.4.  However, if any of our developers still use
Flex 2.5.4, they'll need to stop configuring with
--enable-gcc-warnings because "%option noinput" didn't work
correctly until Flex 2.5.6.
* src/scan-gram.l: Likewise.
* src/scan-skel.l: Likewise.
2009-08-01 18:03:45 -04:00
Akim Demaille 9e408f848d build: avoid concurrent extraction of calc++.
* examples/calc++/Makefile.am (calc.stamp): New.
	Depend on it to create the sources of calc++ so that concurrent
	builds don't launch several "extexi" in parallel.
	Not only this is inefficient, this also builds incorrect sources
	with several extractions mixed together.

Cherry-picked from 5ece73eaa1.
2009-06-29 20:41:55 +02:00
Akim Demaille 48578d6c12 hash: check insertion for memory exhaustion.
* src/uniqstr.c (uniqstr_new): New.
2009-06-25 06:57:26 +02:00
Akim Demaille 914e713d07 hash: check insertion for memory exhaustion.
* src/muscle-tab.c (muscle_insert, muscle_grow)
	* src/state.c (state_hash_insert): Check the return value of
	hash_insert.
2009-06-25 06:57:26 +02:00
Akim Demaille 94505fb7e2 gnulib: update.
* gnulib: Update to latest.
	* lib/.cvsignore, lib/.gitignore, m4/.cvsignore,
	* m4/.gitignore: Regen.
	* src/symtab.c (symbol_from_uniqstr, semantic_type_from_uniqstr):
	Call xalloc_die on hash_insert failures.
	Requested by the new __warn_unused_result__ attribute of
	hash_insert.
2009-06-25 06:57:25 +02:00
Joel E. Denny 1bcbca4368 * data/c++.m4: Update copyright year. 2009-05-22 01:49:01 -04:00
Joel E. Denny a17352a9da Handle a trailing `:' in a user-supplied C++ namespace better.
* data/c++.m4 (b4_namespace_close): Don't let it be printed
among the closing braces here.  This fix might make the
generated code easier to debug, but otherwise it should be
insignificant because a trailing `:' is a C++ error already.
(cherry picked from commit 8c221795af)
2009-05-19 18:21:07 -04:00
Akim Demaille c984dee8d1 doc: use C++ headers.
* doc/bison.texinfo (Calc++ Scanner): Prefer C++ headers to C
	headers.
2009-05-11 08:52:26 +02:00
Joel E. Denny cefb18280b Declare %code to be a permanent feature.
* NEWS (2.4.2): Here.
* doc/bison.texinfo (Prologue Alternatives): Don't say it's
experimental.
(Decl Summary): Likewise.
2009-05-01 02:51:31 -04:00
Akim Demaille 2f3064f08e doc: minor fixes.
* doc/bison.texinfo (Decl Summary): Fix entry about %debug.
	(Table of Symbols): Remove duplicate entry for %debug.
2009-04-14 08:27:55 +02:00
Eric Blake ab3a683f05 Work around autoconf 2.63b bug in testsuite.
* tests/output.at (AT_CHECK_OUTPUT_FILE_NAME): Avoid tripping
autoconf bug related to # in test.

Signed-off-by: Eric Blake <[email protected]>
2009-04-08 21:29:54 -06:00
Joel E. Denny ecd1b61cd4 Fix options documentation.
* build-aux/cross-options.pl: As in --help output, write optional
arguments as [=ARG] not =[ARG].
* doc/bison.texinfo (Bison Options): Add -W/--warnings argument.
2009-04-06 02:54:38 -04:00
Akim Demaille f67c40374e Fix --help.
* src/getargs.c (usage): Fix help string for -W.
(cherry picked from commit 9b9e0a7d46)
2009-04-06 00:54:55 -04:00
Akim Demaille 0213d65176 Handle more general types of option arguments.
* build-aux/cross-options.pl: The argument ends at the first
	space, not the first non-symbol character.
	Use @var for each word appearing the argument description.
(cherry picked from commit 74eae918c3)
2009-04-06 00:50:21 -04:00
Joel E. Denny c19178bfaf Remove spurious initial empty lines.
* data/location.cc: End the @output lines with an @.
2009-04-06 00:39:49 -04:00
Akim Demaille 0d2b2ab033 Remove spurious initial empty lines.
* data/glr.c, data/glr.cc, data/lalr1.cc, data/lalr1.java,
	* data/yacc.c: End the @output lines with an @.
2009-04-06 00:36:42 -04:00
Joel E. Denny 8ba62e3e10 Replace BISON_PROG_GNU_M4 with Autoconf's AC_PROG_GNU_M4.
If the first m4 in $PATH is wrong, it keeps looking.  Moreover, its
requirements for a correct m4 are stricter.
* m4/m4.m4: Replace with Autoconf 2.63's m4/m4.m4.
* configure.ac: Update to use AC_PROG_GNU_M4.
Reported by Eric Blake.
2009-04-04 21:12:23 -04:00
Joel E. Denny f490771b4b * ChangeLog: Update copyright. 2009-04-04 02:46:19 -04:00
Joel E. Denny 5bc993d947 Help with updating web manual.
* HACKING: Incorporate instructions from gnulib/doc/README.
* bootstrap.conf (gnulib_modules): Add gendocs.
2009-04-03 18:46:58 -04:00
Joel E. Denny 580c075d7f Fix strange %define locations for default values.
Reported by Akim Demaille at
<http://lists.gnu.org/archive/html/bug-bison/2007-12/msg00001.html>
and discussed again starting at
<http://lists.gnu.org/archive/html/bison-patches/2008-11/msg00102.html>.
* data/bison.m4 (b4_percent_define_default): Leave syncline blank
because location information is bogus.
Use angle brackets to delimit fake file name because square brackets
look like over-quoted m4.  Choose a better fake file name.
Use negative line numbers.
* src/muscle_tab.c (muscle_percent_define_default): Likewise.
* src/location.c (location_print): If line for a boundary is negative,
only print that boundary's file name.
* src/location.h: Document that.
* tests/skeletons.at (%define Boolean variables: invalid skeleton
defaults): Update output.
2009-04-03 03:56:58 -04:00
Akim Demaille 5d3a1ecbbe Locations without columns for command line arguments.
* src/location.c (location_print): Don't display negative columns.
	* src/location.h: Document this.
(cherry picked from commit 56c5eca973)
2009-04-03 02:24:48 -04:00
Joel E. Denny 015e86a7b2 Add reminder about uploading public key to keys.gnupg.net.
* HACKING (Release Procedure): Here.
(cherry picked from commit 06c3084fb5)
2009-04-02 18:14:52 -04:00
Akim Demaille c1455babda bootstrap: --help to stdout.
* bootstrap (usage): Don't send --help to stderr.
	Use a here doc instead of a long string.
2009-03-31 10:44:33 +02:00
Akim Demaille 2075a82a18 bootstrap: README-hacking no longer exists
* bootstrap (checkout_only_file): Set to HACKING.
2009-03-31 10:44:00 +02:00
Akim Demaille 26fccd4d7b doc: merge HACKING and README-hacking.
Two files is confusing.
Reported by Alexandre Duret-Lutz.

	* README-hacking: Merge into...
	* HACKING (Working from the repository): here.
2009-03-26 23:52:00 +01:00
Akim Demaille 6469c4d72b doc: update README-hacking.
* README-hacking: We now use git and git submodules.
	Reported by Ralf Wildenhues and Alexandre Duret-Lutz.
2009-03-26 23:48:46 +01:00
Akim Demaille b328890a9e lalr1.cc: avoid GCC 4.3 warnings.
GCC 4.3 now warns about "a || b && c" and asks for explicit
parentheses.
Reported by Alexandre Duret-Lutz.
	* data/location.cc: Update copyright years.
	(Position::operator==): Use parens to make precedence explicit.
	Compare lines and columns first, as they are more likely to be
	different, and they are faster to compare.
2009-03-26 23:45:25 +01:00
Akim Demaille f307943941 gnulib: update.
* gnulib: Update to latest.
	* lib/Makefile.am (AM_CPPFLAGS): It is now defined by gnulib, so
	use +=.
2009-03-26 23:41:12 +01:00
Akim Demaille 5339158d01 Update gnulib. 2009-02-12 09:51:53 +01:00
Akim Demaille 8defe11bfa Fix grep portability issues.
Grep on Solaris does not support -q.
Reported by Summum Bonum.

	* NEWS: Add a stub for 2.4.2.
	* THANKS: Add Summum Bonum.
	* tests/atlocal.in (EGREP): New.
	(CC, CXX, XSLTPROC): Make it possible to override them via
	envvars.
	* tests/java.at: Use $EGREP instead of egrep.
	Use AT_CHECK's ignore instead of grep's -q.
2009-01-08 09:46:40 +01:00
Joel E. Denny 41930e7ad8 Version 2.4.1.
* NEWS: Set version and date.
* lib/Makefile.am: Update copyright year.
* tests/atlocal.in: Update copyright year.
2008-12-11 16:07:47 -05:00
Joel E. Denny d07932ef3d Semicolon feature removal is not about future language support.
* NEWS: The semicolon feature is no longer active for newer languages,
so don't claim that it causes trouble for them.
2008-12-11 15:37:24 -05:00
Joel E. Denny 0364b3344f * gnulib: Update submodule to HEAD. 2008-12-11 15:14:35 -05:00
Akim Demaille 876fd8357a Update data/README.
* data/README: Document glr.cc, lalr1.java, m4sugar and xslt.
2008-12-09 13:24:18 +01:00
Akim Demaille 1eb0b14659 Spelling fixes.
* NEWS: s/than/that/.
2008-12-09 13:19:44 +01:00
Eric Blake bee1df15b2 Build testsuite with newer autoconf.
* tests/output.at (m4_expand): Don't override in newer autoconf,
where the underlying implementation changed.
* tests/cxx-type.at (_AT_RESOLVED_GLR_OUTPUT)
(_AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_AMBIG_GLR_OUTPUT)
(_AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR)
(_AT_VERBOSE_GLR_STDERR): Expand to double-quoted strings,
since some of them contain unbalanced ')'.

Signed-off-by: Eric Blake <[email protected]>
2008-12-05 09:27:19 -07:00
Joel E. Denny 7e6d1e2296 * NEWS: Clarify a little. 2008-11-19 12:14:37 -05:00
Joel E. Denny a957d06cef * NEWS: Update for recent changes. 2008-11-19 12:06:34 -05:00
Joel E. Denny 462503f825 Fix unexpanded macros in GLR defines file.
Reported by Csaba Raduly at
<http://lists.gnu.org/archive/html/bug-bison/2008-11/msg00048.html>.
* THANKS (Csaba Raduly): Add.
* data/glr.c: Fix overquoting on b4_prefix for yylval and yylloc.
* tests/calc.at (_AT_DATA_CALC_Y): If %defines is specified, generate
lexer in a separate module that includes the defines file.
(AT_CHECK_CALC): Use AT_FULL_COMPILE and request compilation of lexer
source.
* tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Push AT_DEFINES_IF.
Adjust AT_LOC and AT_VAL to use AT_NAME_PREFIX.
(AT_BISON_OPTION_POPDEFS): Pop AT_DEFINES_IF.
(AT_DATA_SOURCE_PROLOGUE): New.
(AT_DATA_GRAMMAR_PROLOGUE): Use AT_DATA_SOURCE_PROLOGUE.
(AT_DATA_SOURCE): New.
(AT_FULL_COMPILE): New, copied from master branch and extended to
support an additional output file.
2008-11-19 00:38:14 -05:00
Joel E. Denny bf151b75ff Don't let maintainer-*-check targets force a version update.
* cfg.mk (_is-dist-target): Implement.  maintainer-check* was already
handled.
2008-11-17 09:44:04 -05:00
Di-an Jan f56274a8f9 Fix formatting and content of bison.texinfo menus
* doc/bison.texinfo: Synchronize ``Detail Node Listing''.
Align menus.  Adjust word wrapping.  Use node names for menu names.
(Examples): Don't abbreviate node names.
(LocalWords): Remove abbreviations.
(Copying): Make description a sentence.
(Java Action Features): Remove period to match the rest of menu.
2008-11-17 11:08:09 +01:00
Paolo Bonzini b5775a81c1 Replace m4/warning.m4 with warnings module.
* bootstrap.conf: Replace m4/warning.m4 with warnings module.
* configure.ac: Adjust usage.
* lib/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS).
* src/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS).
* tests/atlocal.in: Replace $(WARNING_*FLAGS) with $(WARN_*FLAGS).
2008-11-12 15:55:01 +01:00
Joel E. Denny 7ed73f82ad Don't add a semicolon to actions for %skeleton or %language.
It breaks Java test cases as reported by Akim Demaille.
* src/scan-code.l: Implement.
2008-11-07 16:48:57 -05:00
Joel E. Denny 4b1ebc495b Clean up %skeleton and %language priority implementation.
* src/getargs.c (skeleton_prio): Use default_prio rather than 2, and
remove static qualifier because others will soon need to see it.
(language_prio): Likewise.
(getargs): Use command_line_prio rather than 0.
* src/getargs.h (command_line_prio, grammar_prio, default_prio): New
enum fields.
(skeleton_prio): Extern it.
(language_prio): Extern it.
* src/parse-gram.y: Use grammar_prio rather than 1.
2008-11-07 16:48:31 -05:00
Akim Demaille 738cde3e93 Mention the trailing semicolon in action.
* NEWS: Mention the trailing semicolon in action.
2008-11-04 22:26:39 +01:00
Akim Demaille d6fb461dd8 Reformat NEWS.
* NEWS: Use more outline-mode markup.
	Suggested by Jim Meyering.
2008-11-04 22:19:33 +01:00
Joel E. Denny 14da0cdd07 Fix user actions without a trailing semicolon.
Reported by Sergei Steshenko at
<http://lists.gnu.org/archive/html/bug-bison/2008-11/msg00001.html>.
* THANKS (Sergei Steshenko): Add.
* src/scan-code.l (SC_RULE_ACTION): Fix it.
* tests/regression.at (Fix user actions without a trailing semicolon):
New test case.
2008-11-04 13:30:38 -05:00
230 changed files with 8568 additions and 18656 deletions
-3
View File
@@ -1,6 +1,3 @@
[submodule "gnulib"] [submodule "gnulib"]
path = gnulib path = gnulib
url = git://git.savannah.gnu.org/gnulib.git url = git://git.savannah.gnu.org/gnulib.git
[submodule "submodules/autoconf"]
path = submodules/autoconf
url = git://git.sv.gnu.org/autoconf.git
+1
View File
@@ -3,3 +3,4 @@ COPYING
^doc/gpl-3\.0\.texi$ ^doc/gpl-3\.0\.texi$
^doc/yacc\.1\.in$ ^doc/yacc\.1\.in$
^src/parse-gram\.h$ ^src/parse-gram\.h$
^data/m4sugar/
+236 -3103
View File
File diff suppressed because it is too large Load Diff
+12 -8
View File
@@ -210,9 +210,17 @@ causes it to be rejected by recent Gettext releases; please report
these to the Translation Project. these to the Translation Project.
** Update README ** Update README
Make sure the information in this file 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.
We update years in copyright statements throughout Bison once at the
start of every year by running `make update-copyright'. However, before
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 the skeletons insert into generated parsers, and check all
occurrences of PACKAGE_COPYRIGHT_YEAR in configure.ac.
** Update NEWS ** Update NEWS
The version number, *and* the date of the release (including for The version number, *and* the date of the release (including for
@@ -221,9 +229,6 @@ betas).
** Update ChangeLog ** Update ChangeLog
Should have an entry similar to `Version 1.49b.'. Should have an entry similar to `Version 1.49b.'.
** Update configure.ac
Be sure PACKAGE_COPYRIGHT_YEAR is up-to-date.
** Tag the release ** Tag the release
Before Bison will build with the right version number, you must tag the release Before Bison will build with the right version number, you must tag the release
in git. Do this after all other changes. The command is similar to: in git. Do this after all other changes. The command is similar to:
@@ -354,8 +359,7 @@ Push these changes.
----- -----
Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009 Copyright (C) 2002-2005, 2007-2010 Free Software Foundation, Inc.
Free Software Foundation, Inc.
This file is part of GNU Bison. This file is part of GNU Bison.
+36 -39
View File
@@ -1,51 +1,46 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*- ## Process this file with automake to produce Makefile.in -*-Makefile-*-
## Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 ## Copyright (C) 2001-2010 Free Software Foundation, Inc.
## 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/>.
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
SUBDIRS = po runtime-po . SUBDIRS = build-aux po runtime-po lib data src doc examples tests etc
if BISON_CXX_WORKS
SUBDIRS += examples/calc++
endif
# Files installed for use by Automake. # Files installed for use by Automake.
aclocaldir = @aclocaldir@ aclocaldir = @aclocaldir@
aclocal_DATA = m4/bison-i18n.m4 aclocal_DATA = m4/bison-i18n.m4
EXTRA_DIST = .prev-version .version \ EXTRA_DIST = .prev-version .version cfg.mk \
cfg.mk \ OChangeLog PACKAGING \
OChangeLog PACKAGING djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \
djgpp/config.sed djgpp/config.site djgpp/config_h.sed \
djgpp/subpipe.c djgpp/subpipe.h djgpp/djunpack.bat \
djgpp/fnchange.lst djgpp/testsuite.sed
# Initialization before completion by local.mk's.
AM_CFLAGS = $(WARN_CFLAGS) .PHONY: maintainer-check
AM_CPPFLAGS = maintainer-check:
BUILT_SOURCES = cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
DISTCLEANFILES =
MOSTLYCLEANFILES = .PHONY: maintainer-push-check
SUFFIXES = maintainer-push-check:
include build-aux/local.mk cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
include data/local.mk
include djgpp/local.mk .PHONY: maintainer-xml-check
include doc/local.mk maintainer-xml-check:
include etc/local.mk cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
include examples/local.mk
include lib/local.mk
include src/local.mk
include tests/local.mk
# 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
@@ -56,15 +51,17 @@ include tests/local.mk
# a developer might naively reference .version in a test case while the bison # a developer might naively reference .version in a test case while the bison
# executable still compiles with VERSION, and so the test case might fail or # executable still compiles with VERSION, and so the test case might fail or
# pass incorrectly. # pass incorrectly.
BUILT_SOURCES += $(top_srcdir)/.version BUILT_SOURCES = $(top_srcdir)/.version
$(top_srcdir)/.version: configure $(top_srcdir)/.version: configure
echo $(VERSION) > $@-t && mv $@-t $@ echo $(VERSION) > $@-t && mv $@-t $@
dist-hook: dist-hook:
echo $(VERSION) > $(distdir)/.tarball-version echo $(VERSION) > $(distdir)/.tarball-version
.PHONY: update-b4-copyright .PHONY: update-b4-copyright update-package-copyright-year
update-b4-copyright: update-b4-copyright:
find data -type f \ find data -type f \
| grep -v -E '^data/bison.m4$$' \ | grep -v -E '^data/bison.m4$$' \
| xargs $(build_aux)/$@ | 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:
$(build_aux)/$@ configure.ac
+59 -155
View File
@@ -1,164 +1,24 @@
Bison News Bison News
---------- ----------
* Changes in version ?.? (????-??-??): * Changes in version 2.4.1a (2010-01-22):
** Java skeleton improvements: ** `%prec IDENTIFIER' requires IDENTIFIER to be defined separately.
The constants for token names were moved to the Lexer interface. POSIX specifies that an error be reported for any identifier that does
Also, it is possible to add code to the parser's constructors using not appear on the LHS of a grammar rule and that is not defined by
"%code init" and "%define init_throws". %token, %left, %right, or %nonassoc. Bison 2.3b and later lost this
error report for the case when an identifier appears only after a
** Variable api.tokens.prefix %prec directive. It is now restored. However, for backward
compatibility with recent Bison releases, it is only a warning for
The variable api.tokens.prefix changes the way tokens are identified in now. In Bison 2.5 and later, it will return to being an error.
the generated files. This is especially useful to avoid collisions
with identifiers in the target language. For instance
%token FILE for ERROR
%define api.tokens.prefix "TOK_"
%%
start: FILE for ERROR;
will generate the definition of the symbols TOK_FILE, TOK_for, and
TOK_ERROR in the generated sources. In particular, the scanner must
use these prefixed token names, although the grammar itself still
uses the short names (as in the sample rule given above).
** Variable api.namespace
The "namespace" variable is renamed "api.namespace". Backward
compatibility is ensured, but upgrading is recommended.
** Variable parse.error
The variable error controls the verbosity of error messages. The
use of the %error-verbose directive is deprecated in favor of
%define parse.error "verbose".
* Changes in version 2.5 (????-??-??):
** IELR(1) and Canonical LR(1) Support
IELR(1) is a minimal LR(1) parser table generation algorithm. That
is, given any context-free grammar, IELR(1) generates parser tables
with the full language recognition power of canonical LR(1) but with
nearly the same number of parser states as LALR(1). This reduction in
parser states is often an order of magnitude. More importantly,
because canonical LR(1)'s extra parser states may contain duplicate
conflicts in the case of non-LR(1) grammars, the number of conflicts
for IELR(1) is often an order of magnitude less as well. This can
significantly reduce the complexity of developing of a grammar.
Bison can now generate IELR(1) and canonical LR(1) parser tables in
place of its traditional LALR(1) parser tables, which remain the
default. You can specify the type of parser tables in the grammar
file with these directives:
%define lr.type "LALR"
%define lr.type "IELR"
%define lr.type "canonical LR"
The default reduction optimization in the parser tables can also be
adjusted using `%define lr.default-reductions'. See the documentation
for `%define lr.type' and `%define lr.default-reductions' in the
section `Bison Declaration Summary' in the Bison manual for the
details.
These features are experimental. More user feedback will help to
stabilize them.
** Multiple %define's for any variable is now an error not a warning.
** %define can now be invoked via the command line.
Each of these command-line options
-D NAME[=VALUE]
--define=NAME[=VALUE]
-F NAME[=VALUE]
--force-define=NAME[=VALUE]
is equivalent to this grammar file declaration
%define NAME ["VALUE"]
except that the manner in which Bison processes multiple definitions
for the same NAME differs. Most importantly, -F and --force-define
quietly override %define, but -D and --define do not. For further
details, see the section "Bison Options" in the Bison manual.
** %define variables renamed.
The following %define variables
api.push_pull
lr.keep_unreachable_states
have been renamed to
api.push-pull
lr.keep-unreachable-states
The old names are now deprecated but will be maintained indefinitely
for backward compatibility.
** Symbols names
Consistently with directives (such as %error-verbose) and variables
(e.g. push-pull), symbol names may include dashes in any position,
similarly to periods and underscores. This is GNU extension over
POSIX Yacc whose use is reported by -Wyacc, and rejected in Yacc
mode (--yacc).
** Temporary hack for adding a semicolon to the user action.
Previously, Bison appended a semicolon to every user action for
reductions when the output language defaulted to C (specifically, when
neither %yacc, %language, %skeleton, or equivalent command-line
options were specified). This allowed actions such as
exp: exp "+" exp { $$ = $1 + $3 };
instead of
exp: exp "+" exp { $$ = $1 + $3; };
As a first step in removing this misfeature, Bison now issues a
warning when it appends a semicolon. Moreover, in cases where Bison
cannot easily determine whether a semicolon is needed (for example, an
action ending with a cpp directive or a braced compound initializer),
it no longer appends one. Thus, the C compiler might now complain
about a missing semicolon where it did not before. Future releases of
Bison will cease to append semicolons entirely.
** Character literals not of length one.
Previously, Bison quietly converted all character literals to length
one. For example, without warning, Bison interpreted the operators in
the following grammar to be the same token:
exp: exp '++'
| exp '+' exp
;
Bison now warns when a character literal is not of length one. In
some future release, Bison will report an error instead.
** Verbose error messages fixed for nonassociative tokens.
When %error-verbose is specified, syntax error messages produced by
the generated parser include the unexpected token as well as a list of
expected tokens. Previously, this list erroneously included tokens
that would actually induce a syntax error because conflicts for them
were resolved with %nonassoc. Such tokens are now properly omitted
from the list.
* Changes in version 2.4.2 (????-??-??):
** Detection of GNU M4 1.4.6 or newer during configure is improved. ** Detection of GNU M4 1.4.6 or newer during configure is improved.
** Warnings from gcc's -Wundef option about undefined YYENABLE_NLS,
YYLTYPE_IS_TRIVIAL, and __STRICT_ANSI__ in C/C++ parsers are now
avoided.
** %code is now a permanent feature. ** %code is now a permanent feature.
A traditional Yacc prologue directive is written in the form: A traditional Yacc prologue directive is written in the form:
@@ -182,6 +42,51 @@ Bison News
Bison's Java feature as a whole including its current usage of %code Bison's Java feature as a whole including its current usage of %code
is still considered experimental. is still considered experimental.
** YYFAIL is deprecated and will eventually be removed.
YYFAIL has existed for many years as an undocumented feature of
deterministic parsers in C generated by Bison. Previously, it was
documented for Bison's experimental Java parsers. YYFAIL is no longer
documented for Java parsers and is formally deprecated in both cases.
Users are strongly encouraged to migrate to YYERROR, which is
specified by POSIX.
Like YYERROR, you can invoke YYFAIL from a semantic action in order to
induce a syntax error. The most obvious difference from YYERROR is
that YYFAIL will automatically invoke yyerror to report the syntax
error so that you don't have to. However, there are several other
subtle differences between YYERROR and YYFAIL, and YYFAIL suffers from
inherent flaws when %error-verbose or `#define YYERROR_VERBOSE' is
used. For a more detailed discussion, see:
http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html
The upcoming Bison 2.5 will remove YYFAIL from Java parsers, but
deterministic parsers in C will continue to implement it. However,
because YYFAIL is already flawed, it seems futile to try to make new
Bison features compatible with it. Thus, during parser generation,
Bison 2.5 will produce a warning whenever it discovers YYFAIL in a
rule action. In a later release, YYFAIL will be disabled for
%error-verbose and `#define YYERROR_VERBOSE'. Eventually, YYFAIL will
be removed altogether.
There exists at least one case where Bison 2.5's YYFAIL warning will
be a false positive. Some projects add phony uses of YYFAIL and other
Bison-defined macros for the sole purpose of suppressing C
preprocessor warnings (from GCC cpp's -Wunused-macros, for example).
To avoid Bison's future warning, such YYFAIL uses can be moved to the
epilogue (that is, after the second `%%') in the Bison input file. In
this release (2.4.1a), Bison already generates its own code to suppress
C preprocessor warnings for YYFAIL, so projects can remove their own
phony uses of YYFAIL if compatibility with Bison releases prior to
2.4.1a is not necessary.
** Internationalization.
Fix a regression introduced in Bison 2.4: Under some circumstances,
message translations were not installed although supported by the
host system.
* Changes in version 2.4.1 (2008-12-11): * Changes in version 2.4.1 (2008-12-11):
** In the GLR defines file, unexpanded M4 macros in the yylval and yylloc ** In the GLR defines file, unexpanded M4 macros in the yylval and yylloc
@@ -1229,8 +1134,7 @@ End:
----- -----
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, Copyright (C) 1995-2010 Free Software Foundation, Inc.
2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of Bison, the GNU Parser Generator. This file is part of Bison, the GNU Parser Generator.
+1 -1
View File
@@ -36,7 +36,7 @@ to the bison package.
----- -----
Copyright (C) 2002, 2005, 2009 Free Software Foundation, Inc. Copyright (C) 2002, 2005, 2009-2010 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+2 -2
View File
@@ -40,8 +40,8 @@ End:
----- -----
Copyright (C) 1992, 1998, 1999, 2003, 2004, 2005, 2008-2009 Free Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2010 Free Software
Software Foundation, Inc. Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+1 -1
View File
@@ -12,7 +12,7 @@ the problems you encounter.
----- -----
Copyright (C) 2002, 2004, 2009 Free Software Foundation, Inc. Copyright (C) 2002, 2004, 2009-2010 Free Software Foundation, Inc.
This file is part of GNU Bison. This file is part of GNU Bison.
+3 -2
View File
@@ -46,6 +46,7 @@ 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]
Jonathan Nieder [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]
@@ -58,7 +59,7 @@ Martin Nylin [email protected]
Matt Kraai [email protected] Matt Kraai [email protected]
Matt Rosing [email protected] Matt Rosing [email protected]
Michael Hayes [email protected] Michael Hayes [email protected]
Michiel De Wilde mdewilde.agilent@gmail.com Michael Raskin 7c6f434c@mail.ru
Mickael Labau [email protected] Mickael Labau [email protected]
Mike Castle [email protected] Mike Castle [email protected]
Neil Booth [email protected] Neil Booth [email protected]
@@ -66,6 +67,7 @@ Nelson H. F. Beebe [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]
Oleg Smolsky [email protected] Oleg Smolsky [email protected]
Paolo Bonzini [email protected] Paolo Bonzini [email protected]
Pascal Bart [email protected] Pascal Bart [email protected]
@@ -75,7 +77,6 @@ Per Allansson [email protected]
Peter Fales [email protected] Peter Fales [email protected]
Peter Hamorsky [email protected] Peter Hamorsky [email protected]
Piotr Gackiewicz [email protected] Piotr Gackiewicz [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]
+45 -184
View File
@@ -1,179 +1,5 @@
-*- outline -*- -*- outline -*-
* Short term
** Use b4_symbol in all the skeleton
Then remove the older system, including the tables generated by
output.c
** Update the documentation on gnu.org
** Get rid of fake #lines [Bison: ...]
Possibly as simple as checking whether the column number is nonnegative.
I have seen messages like the following from GCC.
<built-in>:0: fatal error: opening dependency file .deps/libltdl/argz.Tpo: No such file or directory
** Discuss about %printer/%destroy in the case of C++.
It would be very nice to provide the symbol classes with an operator<<
and a destructor. Unfortunately the syntax we have chosen for
%destroy and %printer make them hard to reuse. For instance, the user
is invited to write something like
%printer { debug_stream() << $$; } <my_type>;
which is hard to reuse elsewhere since it wants to use
"debug_stream()" to find the stream to use. The same applies to
%destroy: we told the user she could use the members of the Parser
class in the printers/destructors, which is not good for an operator<<
since it is no longer bound to a particular parser, it's just a
(standalone symbol).
** Rename LR0.cc
as lr0.cc, why upper case?
** bench several bisons.
Enhance bench.pl with %b to run different bisons.
** Use b4_symbol everywhere.
Move its definition in the more standard places and deploy it in other
skeletons.
* Various
** YYPRINT
glr.c inherits its symbol_print function from c.m4, which supports
YYPRINT. But to use YYPRINT yytoknum is needed, which not defined by
glr.c.
Anyway, IMHO YYPRINT is obsolete and should be restricted to yacc.c.
** YYERRCODE
Defined to 256, but not used, not documented. Probably the token
number for the error token, which POSIX wants to be 256, but which
Bison might renumber if the user used number 256. Keep fix and doc?
Throw away?
Also, why don't we output the token name of the error token in the
output? It is explicitly skipped:
/* Skip error token and tokens without identifier. */
if (sym != errtoken && id)
Of course there are issues with name spaces, but if we disable we have
something which seems to be more simpler and more consistent instead
of the special case YYERRCODE.
enum yytokentype {
error = 256,
// ...
};
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
toknum:
const unsigned short int
parser::yytoken_number_[] =
{
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
while here
enum yytokentype {
TOK_EOF = 0,
TOK_EQ = 258,
so both 256 and 257 are "mysterious".
const char*
const parser::yytname_[] =
{
"\"end of command\"", "error", "$undefined", "\"=\"", "\"break\"",
** YYFAIL
It is seems to be *really* obsolete now, shall we remove it?
** YYBACKUP
There is no test about it, no examples in the doc, and I'm not sure
what it should look like. For instance what follows crashes.
%error-verbose
%debug
%pure-parser
%code {
# include <stdio.h>
# include <stdlib.h>
# include <assert.h>
static void yyerror (const char *msg);
static int yylex (YYSTYPE *yylval);
}
%%
exp:
'a' { printf ("a: %d\n", $1); }
| 'b' { YYBACKUP('a', 123); }
;
%%
static int
yylex (YYSTYPE *yylval)
{
static char const input[] = "b";
static size_t toknum;
assert (toknum < sizeof input);
*yylval = (toknum + 1) * 10;
return input[toknum++];
}
static void
yyerror (const char *msg)
{
fprintf (stderr, "%s\n", msg);
}
int
main (void)
{
yydebug = !!getenv("YYDEBUG");
return yyparse ();
}
** yychar == yyempty_
The code in yyerrlab reads:
if (yychar <= YYEOF)
{
/* Return failure if at end of input. */
if (yychar == YYEOF)
YYABORT;
}
There are only two yychar that can be <= YYEOF: YYEMPTY and YYEOF.
But I can't produce the situation where yychar is YYEMPTY here, is it
really possible? The test suite does not exercise this case.
This shows that it would be interesting to manage to install skeleton
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
** Single stack
Merging the three stacks in lalr1.cc simplified the code, prompted for
other improvements and also made it faster (probably because memory
management is performed once instead of three times). I suggest that
we do the same in yacc.c.
** yysyntax_error
The code bw glr.c and yacc.c is really alike, we can certainly factor
some parts.
* Header guards * Header guards
From Franc,ois: should we keep the directory part in the CPP guard? From Franc,ois: should we keep the directory part in the CPP guard?
@@ -192,6 +18,13 @@ find something clean (not like YYLSP_NEEDED...).
Before releasing, make sure the documentation ("Understanding your Before releasing, make sure the documentation ("Understanding your
parser") refers to the current `output' format. parser") refers to the current `output' format.
* lalr1.cc
** vector
Move to using vector, drop stack.hh.
** I18n
Catch up with yacc.c.
* Report * Report
** GLR ** GLR
@@ -266,6 +99,9 @@ must be in the scanner: we must not parse what is in a switched off
part of %if. Akim Demaille thinks it should be in the parser, so as part of %if. Akim Demaille thinks it should be in the parser, so as
to avoid falling into another CPP mistake. to avoid falling into another CPP mistake.
** -D, --define-muscle NAME=VALUE
To define muscles via cli. Or maybe support directly NAME=VALUE?
** XML Output ** XML Output
There are couple of available extensions of Bison targeting some XML There are couple of available extensions of Bison targeting some XML
output. Some day we should consider including them. One issue is output. Some day we should consider including them. One issue is
@@ -306,8 +142,7 @@ this issue. Does anybody have it?
Some history of Bison and some bibliography would be most welcome. Some history of Bison and some bibliography would be most welcome.
Are there any Texinfo standards for bibliography? Are there any Texinfo standards for bibliography?
** %printer
Wow, %printer is not documented. Clearly mark YYPRINT as obsolete.
* Java, Fortran, etc. * Java, Fortran, etc.
@@ -337,14 +172,15 @@ Show reductions.
** Skeleton strategy ** Skeleton strategy
Must we keep %token-table? Must we keep %token-table?
* src/print_graph.c
Find the best graph parameters.
* BTYacc * BTYacc
See if we can integrate backtracking in Bison. Charles-Henri de See if we can integrate backtracking in Bison. Charles-Henri de
Boysson <[email protected]> has been working on this, but never gave Boysson <[email protected]> is working on this, and already has some
the results. results. Vadim Maslow, the maintainer of BTYacc was contacted, and we
stay in touch with him. Adjusting the Bison grammar parser will be
Vadim Maslow, the maintainer of BTYacc was once contacted. Adjusting needed to support some extra BTYacc features. This is less urgent.
the Bison grammar parser will be needed to support some extra BTYacc
features. This is less urgent.
** Keeping the conflicted actions ** Keeping the conflicted actions
First, analyze the differences between byacc and btyacc (I'm referring First, analyze the differences between byacc and btyacc (I'm referring
@@ -359,6 +195,9 @@ very feasible to use the very same conflict tables.
** Adjust the skeletons ** Adjust the skeletons
Import the skeletons for C and C++. Import the skeletons for C and C++.
** Improve the skeletons
Have them support yysymprint, yydestruct and so forth.
* Precedence * Precedence
@@ -367,6 +206,15 @@ It is unfortunate that there is a total order for precedence. It
makes it impossible to have modular precedence information. We should makes it impossible to have modular precedence information. We should
move to partial orders (sounds like series/parallel orders to me). move to partial orders (sounds like series/parallel orders to me).
** Correlation b/w precedence and associativity
Also, I fail to understand why we have to assign the same
associativity to operators with the same precedence. For instance,
why can't I decide that the precedence of * and / is the same, but the
latter is nonassoc?
If there is really no profound motivation, we should find a new syntax
to allow specifying this.
** RR conflicts ** RR conflicts
See if we can use precedence between rules to solve RR conflicts. See See if we can use precedence between rules to solve RR conflicts. See
what POSIX says. what POSIX says.
@@ -395,6 +243,20 @@ $<type_name>$ = $<type_name>1. I therefore think that one should implement
a Bison option where every typed default rule is explicitly written out a Bison option where every typed default rule is explicitly written out
(same typed ruled can of course be grouped together). (same typed ruled can of course be grouped together).
Note: Robert Anisko handles this. He knows how to do it.
* Warnings
It would be nice to have warning support. See how Autoconf handles
them, it is fairly well described there. It would be very nice to
implement this in such a way that other programs could use
lib/warnings.[ch].
Don't work on this without first announcing you do, as I already have
thought about it, and know many of the components that can be used to
implement it.
* Pre and post actions. * Pre and post actions.
From: Florian Krohm <[email protected]> From: Florian Krohm <[email protected]>
Subject: YYACT_EPILOGUE Subject: YYACT_EPILOGUE
@@ -428,8 +290,7 @@ Equip the parser with a means to create the (visual) parse tree.
----- -----
Copyright (C) 2001, 2002, 2003, 2004, 2006, 2008-2009 Free Software Copyright (C) 2001-2004, 2006, 2009-2010 Free Software Foundation, Inc.
Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+328 -165
View File
@@ -2,8 +2,7 @@
# Bootstrap this package from checked-out sources. # Bootstrap this package from checked-out sources.
# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Copyright (C) 2003-2010 Free Software Foundation, Inc.
# 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
@@ -42,20 +41,21 @@ Bootstrap this package from the checked-out sources.
Options: Options:
--gnulib-srcdir=DIRNAME Specify the local directory where gnulib --gnulib-srcdir=DIRNAME Specify the local directory where gnulib
sources reside. Use this if you already sources reside. Use this if you already
have gnulib sources on your machine, and have gnulib sources on your machine, and
do not want to waste your bandwidth downloading do not want to waste your bandwidth downloading
them again. them again.
--copy Copy files instead of creating symbolic links. --copy Copy files instead of creating symbolic links.
--force Attempt to bootstrap even if the sources seem --force Attempt to bootstrap even if the sources seem
not to have been checked out. not to have been checked out.
--skip-po Do not download po files. --skip-po Do not download po files.
--cvs-user=USERNAME Set the username to use when checking out
sources from the gnulib repository.
If the file bootstrap.conf exists in the current working directory, its If the file $0.conf exists in the same directory as this script, its
contents are read as shell variables to configure the bootstrap. contents are read as shell variables to configure the bootstrap.
For build prerequisites, environment variables like \$AUTOCONF and \$AMTAR
are honored.
Running without arguments will suffice in most cases. Running without arguments will suffice in most cases.
EOF EOF
} }
@@ -71,6 +71,10 @@ gnulib_modules=
# Any gnulib files needed that are not in modules. # Any gnulib files needed that are not in modules.
gnulib_files= gnulib_files=
# A function to be called after everything else in this script.
# Override it via your own definition in bootstrap.conf.
bootstrap_epilogue() { :; }
# The command to download all .po files for a specified domain into # The command to download all .po files for a specified domain into
# a specified directory. Fill in the first %s is the domain name, and # a specified directory. Fill in the first %s is the domain name, and
# the second with the destination directory. Use rsync's -L and -r # the second with the destination directory. Use rsync's -L and -r
@@ -81,9 +85,10 @@ po_download_command_format=\
extract_package_name=' extract_package_name='
/^AC_INIT(/{ /^AC_INIT(/{
/.*,.*,.*,/{ /.*,.*,.*, */{
s/// s///
s/[][]//g s/[][]//g
s/)$//
p p
q q
} }
@@ -99,16 +104,21 @@ package=`sed -n "$extract_package_name" configure.ac` || exit
gnulib_name=lib$package gnulib_name=lib$package
build_aux=build-aux build_aux=build-aux
source_base=lib
m4_base=m4
doc_base=doc
tests_base=tests
# Extra files from gnulib, which override files from other sources. # Extra files from gnulib, which override files from other sources.
gnulib_extra_files=" gnulib_extra_files="
$build_aux/install-sh $build_aux/install-sh
$build_aux/missing $build_aux/missing
$build_aux/mdate-sh $build_aux/mdate-sh
$build_aux/texinfo.tex $build_aux/texinfo.tex
$build_aux/depcomp $build_aux/depcomp
$build_aux/config.guess $build_aux/config.guess
$build_aux/config.sub $build_aux/config.sub
doc/INSTALL doc/INSTALL
" "
# Additional gnulib-tool options to use. Use "\newline" to break lines. # Additional gnulib-tool options to use. Use "\newline" to break lines.
@@ -124,6 +134,9 @@ XGETTEXT_OPTIONS='\\\
--flag=error:3:c-format --flag=error_at_line:5:c-format\\\ --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
' '
# Package bug report address for gettext files
[email protected]
# Files we don't want to import. # Files we don't want to import.
excluded_files= excluded_files=
@@ -142,29 +155,37 @@ vc_ignore=auto
# find_tool ENVVAR NAMES... # find_tool ENVVAR NAMES...
# ------------------------- # -------------------------
# Search for a required program. Use the value of ENVVAR, if set,
# otherwise find the first of the NAMES that can be run (i.e.,
# supports --version). If found, set ENVVAR to the program name,
# die otherwise.
find_tool () find_tool ()
{ {
# Find sha1sum, named gsha1sum on MacPorts.
find_tool_envvar=$1 find_tool_envvar=$1
shift shift
find_tool_name=$@ find_tool_names=$@
if eval test x"\$$find_tool_envvar" = x; then eval "find_tool_res=\$$find_tool_envvar"
if test x"$find_tool_res" = x; then
for i for i
do do
if ($i --version </dev/null) >/dev/null 2>&1; then if ($i --version </dev/null) >/dev/null 2>&1; then
find_tool_res=$i find_tool_res=$i
break break
fi fi
done done
else
find_tool_error_prefix="\$$find_tool_envvar: "
fi fi
if test x"$find_tool_res" = x; then if test x"$find_tool_res" = x; then
echo >&2 "$0: one of these is required: $find_tool_names" echo >&2 "$0: one of these is required: $find_tool_names"
exit 1 exit 1
fi fi
($find_tool_res --version </dev/null) >/dev/null 2>&1 || { ($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
echo >&2 "$0: cannot run $find_tool_res --version" echo >&2 "$0: ${find_tool_error_prefix}cannot run $find_tool_res --version"
exit 1 exit 1
} }
eval "$find_tool_envvar=\"$find_tool_res\"" eval "$find_tool_envvar=\$find_tool_res"
eval "export $find_tool_envvar" eval "export $find_tool_envvar"
} }
@@ -172,7 +193,13 @@ find_tool ()
find_tool SHA1SUM sha1sum gsha1sum find_tool SHA1SUM sha1sum gsha1sum
# Override the default configuration, if necessary. # Override the default configuration, if necessary.
test -r bootstrap.conf && . ./bootstrap.conf # Make sure that bootstrap.conf is sourced from the current directory
# if we were invoked as "sh bootstrap".
case "$0" in
*/*) test -r "$0.conf" && . "$0.conf" ;;
*) test -r "$0.conf" && . ./"$0.conf" ;;
esac
if test "$vc_ignore" = auto; then if test "$vc_ignore" = auto; then
vc_ignore= vc_ignore=
@@ -191,9 +218,7 @@ do
usage usage
exit;; exit;;
--gnulib-srcdir=*) --gnulib-srcdir=*)
GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;; GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
--cvs-user=*)
CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
--skip-po) --skip-po)
SKIP_PO=t;; SKIP_PO=t;;
--force) --force)
@@ -211,13 +236,13 @@ if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
exit 1 exit 1
fi fi
# If each line in $STR is not already on a line by itself in $FILE, insert it, # If $STR is not already on a line by itself in $FILE, insert it,
# sorting the new contents of the file and replacing $FILE with the result. # sorting the new contents of the file and replacing $FILE with the result.
insert_sorted_if_absent() { insert_sorted_if_absent() {
file=$1 file=$1
str=$2 str=$2
test -f $file || touch $file test -f $file || touch $file
echo "$str" | sort -u - $file | cmp -s - $file \ echo "$str" | sort -u - $file | cmp - $file > /dev/null \
|| echo "$str" | sort -u - $file -o $file \ || echo "$str" | sort -u - $file -o $file \
|| exit 1 || exit 1
} }
@@ -259,16 +284,113 @@ if test ! -d $build_aux; then
done done
fi fi
echo "$0: Bootstrapping from checked-out $package sources..." # Note this deviates from the version comparison in automake
# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
# but this should suffice as we won't be specifying old
# version formats or redundant trailing .0 in bootstrap.conf.
# If we did want full compatibility then we should probably
# use m4_version_compare from autoconf.
sort_ver() { # sort -V is not generally available
ver1="$1"
ver2="$2"
cleanup_gnulib() { # split on '.' and compare each component
status=$? i=1
rm -fr gnulib while : ; do
exit $status p1=$(echo "$ver1" | cut -d. -f$i)
p2=$(echo "$ver2" | cut -d. -f$i)
if [ ! "$p1" ]; then
echo "$1 $2"
break
elif [ ! "$p2" ]; then
echo "$2 $1"
break
elif [ ! "$p1" = "$p2" ]; then
if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison
echo "$2 $1"
elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison
echo "$1 $2"
else # numeric, then lexicographic comparison
lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1)
if [ "$lp" = "$p2" ]; then
echo "$1 $2"
else
echo "$2 $1"
fi
fi
break
fi
i=$(($i+1))
done
} }
# See if we can use gnulib's git-merge-changelog merge driver. get_version() {
app=$1
$app --version >/dev/null 2>&1 || return 1
$app --version 2>&1 |
sed -n '# extract version within line
s/.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
t done
# extract version at start of line
s/^\([0-9]\{1,\}\.[.a-z0-9-]*\).*/\1/
t done
d
:done
#the following essentially does s/5.005/5.5/
s/\.0*\([1-9]\)/.\1/g
p
q'
}
check_versions() {
ret=0
while read app req_ver; do
# Honor $APP variables ($TAR, $AUTOCONF, etc.)
appvar=`echo $app | tr '[a-z]' '[A-Z]'`
test "$appvar" = TAR && appvar=AMTAR
eval "app=\${$appvar-$app}"
inst_ver=$(get_version $app)
if [ ! "$inst_ver" ]; then
echo "Error: '$app' not found" >&2
ret=1
elif [ ! "$req_ver" = "-" ]; then
latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
if [ ! "$latest_ver" = "$inst_ver" ]; then
echo "Error: '$app' version == $inst_ver is too old" >&2
echo " '$app' version >= $req_ver is required" >&2
ret=1
fi
fi
done
return $ret
}
print_versions() {
echo "Program Min_version"
echo "----------------------"
printf "$buildreq"
echo "----------------------"
# can't depend on column -t
}
if ! printf "$buildreq" | check_versions; then
test -f README-prereq &&
echo "See README-prereq for notes on obtaining these prerequisite programs:" >&2
echo
print_versions
exit 1
fi
echo "$0: Bootstrapping from checked-out $package sources..."
# See if we can use gnulib's git-merge-changelog merge driver.
if test -d .git && (git --version) >/dev/null 2>/dev/null ; 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
: :
@@ -281,35 +403,52 @@ if test -d .git && (git --version) >/dev/null 2>/dev/null ; then
fi fi
fi fi
cleanup_gnulib() {
status=$?
rm -fr gnulib
exit $status
}
git_modules_config () {
test -f .gitmodules && git config --file .gitmodules "$@"
}
# Get gnulib files. # Get gnulib files.
case ${GNULIB_SRCDIR--} in case ${GNULIB_SRCDIR--} in
-) -)
if [ ! -d gnulib ]; then if git_modules_config submodule.gnulib.url >/dev/null; then
echo "$0: getting gnulib files..." echo "$0: getting gnulib files..."
git submodule init || exit $?
git submodule update || exit $?
case ${CVS_AUTH-pserver} in elif [ ! -d gnulib ]; then
pserver) echo "$0: getting gnulib files..."
CVS_PREFIX=':pserver:anonymous@';;
ssh)
CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
*)
echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
exit 1;;
esac
case $CVS_RSH in
'') CVS_RSH=ssh; export CVS_RSH;;
esac
trap cleanup_gnulib 1 2 13 15 trap cleanup_gnulib 1 2 13 15
cvs -z3 -q -d ${CVS_PREFIX}pserver.git.sv.gnu.org:/gnulib.git co -d gnulib HEAD || git clone --help|grep depth > /dev/null && shallow='--depth 2' || shallow=
git clone $shallow git://git.sv.gnu.org/gnulib ||
cleanup_gnulib cleanup_gnulib
trap - 1 2 13 15 trap - 1 2 13 15
fi fi
GNULIB_SRCDIR=gnulib GNULIB_SRCDIR=gnulib
;;
*)
# Redirect the gnulib submodule to the directory on the command line
# if possible.
if test -d "$GNULIB_SRCDIR"/.git && \
git_modules_config submodule.gnulib.url >/dev/null; then
git submodule init
GNULIB_SRCDIR=`cd $GNULIB_SRCDIR && pwd`
git_modules_config --replace-all submodule.gnulib.url $GNULIB_SRCDIR
echo "$0: getting gnulib files..."
git submodule update || exit $?
GNULIB_SRCDIR=gnulib
fi
;;
esac esac
gnulib_tool=$GNULIB_SRCDIR/gnulib-tool gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
@@ -342,13 +481,20 @@ update_po_files() {
&& ls "$ref_po_dir"/*.po 2>/dev/null | && ls "$ref_po_dir"/*.po 2>/dev/null |
sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
new_po="$ref_po_dir/$po.po" test "$langs" = '*' && langs=x
cksum_file="$ref_po_dir/$po.s1" for po in $langs; do
if ! "$SHA1SUM" -c --status "$cksum_file" < "$new_po" > /dev/null; then case $po in x) continue;; esac
echo "updated $po_dir/$po.po..." new_po="$ref_po_dir/$po.po"
cp "$new_po" "$po_dir/$po.po" && "$SHA1SUM" < "$new_po" > "$cksum_file" cksum_file="$ref_po_dir/$po.s1"
fi if ! test -f "$cksum_file" ||
! test -f "$po_dir/$po.po" ||
! $SHA1SUM -c --status "$cksum_file" \
< "$new_po" > /dev/null; then
echo "updated $po_dir/$po.po..."
cp "$new_po" "$po_dir/$po.po" \
&& $SHA1SUM < "$new_po" > "$cksum_file"
fi
done done
} }
@@ -395,37 +541,37 @@ symlink_to_dir()
if $copy; then if $copy; then
{ {
test ! -h "$dst" || { test ! -h "$dst" || {
echo "$0: rm -f $dst" && echo "$0: rm -f $dst" &&
rm -f "$dst" rm -f "$dst"
} }
} && } &&
test -f "$dst" && test -f "$dst" &&
cmp -s "$src" "$dst" || { cmp -s "$src" "$dst" || {
echo "$0: cp -fp $src $dst" && echo "$0: cp -fp $src $dst" &&
cp -fp "$src" "$dst" cp -fp "$src" "$dst"
} }
else else
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 &&
test "$src_i" = "$dst_i" || { test "$src_i" = "$dst_i" || {
dot_dots= dot_dots=
case $src in case $src in
/*) ;; /*) ;;
*) *)
case /$dst/ in case /$dst/ in
*//* | */../* | */./* | /*/*/*/*/*/) *//* | */../* | */./* | /*/*/*/*/*/)
echo >&2 "$0: invalid symlink calculation: $src -> $dst" echo >&2 "$0: invalid symlink calculation: $src -> $dst"
exit 1;; exit 1;;
/*/*/*/*/) dot_dots=../../../;; /*/*/*/*/) dot_dots=../../../;;
/*/*/*/) dot_dots=../../;; /*/*/*/) dot_dots=../../;;
/*/*/) dot_dots=../;; /*/*/) dot_dots=../;;
esac;; esac;;
esac esac
echo "$0: ln -fs $dot_dots$src $dst" && echo "$0: ln -fs $dot_dots$src $dst" &&
ln -fs "$dot_dots$src" "$dst" ln -fs "$dot_dots$src" "$dst"
} }
fi fi
} }
@@ -450,9 +596,13 @@ cp_mark_as_generated()
if test -z "$c1"; then if test -z "$c1"; then
cmp -s "$cp_src" "$cp_dst" || { cmp -s "$cp_src" "$cp_dst" || {
echo "$0: cp -f $cp_src $cp_dst" && # Copy the file first to get proper permissions if it
rm -f "$cp_dst" && # doesn't already exist. Then overwrite the copy.
sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst" echo "$0: cp -f $cp_src $cp_dst" &&
rm -f "$cp_dst" &&
cp "$cp_src" "$cp_dst-t" &&
sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst-t" &&
mv -f "$cp_dst-t" "$cp_dst"
} }
else else
check_dst_dir "$cp_dst" check_dst_dir "$cp_dst"
@@ -460,15 +610,15 @@ cp_mark_as_generated()
# doesn't already exist. Then overwrite the copy. # doesn't already exist. Then overwrite the copy.
cp "$cp_src" "$cp_dst-t" && cp "$cp_src" "$cp_dst-t" &&
( (
echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" && echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" && echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
sed "s!$bt_regex/!!g" "$cp_src" sed "s!$bt_regex/!!g" "$cp_src"
) > $cp_dst-t && ) > $cp_dst-t &&
if cmp -s "$cp_dst-t" "$cp_dst"; then if cmp -s "$cp_dst-t" "$cp_dst"; then
rm -f "$cp_dst-t" rm -f "$cp_dst-t"
else else
echo "$0: cp $cp_src $cp_dst # with edits" && echo "$0: cp $cp_src $cp_dst # with edits" &&
mv -f "$cp_dst-t" "$cp_dst" mv -f "$cp_dst-t" "$cp_dst"
fi fi
fi fi
fi fi
@@ -480,9 +630,11 @@ version_controlled_file() {
found=no found=no
if test -d CVS; then if test -d CVS; then
grep -F "/$file/" $dir/CVS/Entries 2>/dev/null | grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
grep '^/[^/]*/[0-9]' > /dev/null && found=yes grep '^/[^/]*/[0-9]' > /dev/null && found=yes
elif test -d .git; then elif test -d .git; then
git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
elif test -d .svn; then
svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
else else
echo "$0: no version control for $dir/$file?" >&2 echo "$0: no version control for $dir/$file?" >&2
fi fi
@@ -500,34 +652,35 @@ slurp() {
esac esac
test -d $1/$dir/$file && continue test -d $1/$dir/$file && continue
for excluded_file in $excluded_files; do for excluded_file in $excluded_files; do
test "$dir/$file" = "$excluded_file" && continue 2 test "$dir/$file" = "$excluded_file" && continue 2
done done
if test $file = Makefile.am; then if test $file = Makefile.am; then
copied=$copied${sep}$gnulib_mk; sep=$nl copied=$copied${sep}$gnulib_mk; sep=$nl
remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g" remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." sed "$remove_intl" $1/$dir/$file | cmp - $dir/$gnulib_mk > /dev/null || {
rm -f $dir/$gnulib_mk echo "$0: Copying $1/$dir/$file to $dir/$gnulib_mk ..." &&
sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk rm -f $dir/$gnulib_mk &&
etc/prefix-gnulib-mk $dir/$gnulib_mk sed "$remove_intl" $1/$dir/$file >$dir/$gnulib_mk
}
elif { test "${2+set}" = set && test -r $2/$dir/$file; } || elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
version_controlled_file $dir $file; then version_controlled_file $dir $file; then
echo "$0: $dir/$file overrides $1/$dir/$file" echo "$0: $dir/$file overrides $1/$dir/$file"
else else
copied=$copied$sep$file; sep=$nl copied=$copied$sep$file; sep=$nl
if test $file = gettext.m4; then if test $file = gettext.m4; then
echo "$0: patching m4/gettext.m4 to remove need for intl/* ..." echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
rm -f $dir/$file rm -f $dir/$file
sed ' sed '
/^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\ /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
AC_DEFUN([AM_INTL_SUBDIR], [ AC_DEFUN([AM_INTL_SUBDIR], [
/^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\ /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
AC_DEFUN([gt_INTL_SUBDIR_CORE], []) AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
$a\ $a\
AC_DEFUN([gl_LOCK_EARLY], []) AC_DEFUN([gl_LOCK_EARLY], [])
' $1/$dir/$file >$dir/$file ' $1/$dir/$file >$dir/$file
else else
cp_mark_as_generated $1/$dir/$file $dir/$file cp_mark_as_generated $1/$dir/$file $dir/$file
fi fi
fi || exit fi || exit
done done
@@ -535,18 +688,18 @@ slurp() {
test $dot_ig = x && continue test $dot_ig = x && continue
ig=$dir/$dot_ig ig=$dir/$dot_ig
if test -n "$copied"; then if test -n "$copied"; then
insert_vc_ignore $ig "$copied" insert_vc_ignore $ig "$copied"
# If an ignored file name ends with _.h, then also add # If an ignored file name ends with .in.h, then also add
# the name with just ".h". Many gnulib headers are generated, # the name with just ".h". Many gnulib headers are generated,
# e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc. # e.g., stdint.in.h -> stdint.h, dirent.in.h ->..., etc.
# Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed # Likewise for .gperf -> .h, .y -> .c, and .sin -> .sed
f=`echo "$copied"|sed 's/_\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'` f=`echo "$copied"|sed 's/\.in\.h$/.h/;s/\.sin$/.sed/;s/\.y$/.c/;s/\.gperf$/.h/'`
insert_vc_ignore $ig "$f" insert_vc_ignore $ig "$f"
# For files like sys_stat_.h and sys_time_.h, record as # For files like sys_stat.in.h and sys_time.in.h, record as
# ignorable the directory we might eventually create: sys/. # ignorable the directory we might eventually create: sys/.
f=`echo "$copied"|sed 's/sys_.*_\.h$/sys/'` f=`echo "$copied"|sed 's/sys_.*\.in\.h$/sys/'`
insert_vc_ignore $ig "$f" insert_vc_ignore $ig "$f"
fi fi
done done
done done
@@ -563,13 +716,13 @@ gnulib_tool_options="\
--import\ --import\
--no-changelog\ --no-changelog\
--aux-dir $bt/$build_aux\ --aux-dir $bt/$build_aux\
--doc-base $bt/doc\ --doc-base $bt/$doc_base\
--lib $gnulib_name\ --lib $gnulib_name\
--m4-base $bt/m4/\ --m4-base $bt/$m4_base/\
--source-base $bt/lib/\ --source-base $bt/$source_base/\
--tests-base $bt/tests\ --tests-base $bt/$tests_base\
--local-dir $local_gl_dir\ --local-dir $local_gl_dir\
$gnulib_tool_option_extras\ $gnulib_tool_option_extras\
" "
echo "$0: $gnulib_tool $gnulib_tool_options --import ..." echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
$gnulib_tool $gnulib_tool_options --import $gnulib_modules && $gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
@@ -586,46 +739,50 @@ grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
with_gettext=no with_gettext=no
if test $with_gettext = yes; then if test $with_gettext = yes; then
echo "$0: (cd $bt2; autopoint) ..." echo "$0: (cd $bt2; ${AUTOPOINT-autopoint}) ..."
cp configure.ac $bt2 && cp configure.ac $bt2 &&
(cd $bt2 && autopoint && rm configure.ac) && (cd $bt2 && ${AUTOPOINT-autopoint} && rm configure.ac) &&
slurp $bt2 $bt || exit slurp $bt2 $bt || exit
rm -fr $bt $bt2 || exit
fi fi
rm -fr $bt $bt2 || exit
# Coreutils is unusual in that it generates some of its test-related # Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
# Makefile.am files. That must be done before invoking automake. # gnulib-populated directories. Such .m4 files would cause aclocal to fail.
mam_template=tests/Makefile.am.in # The following requires GNU find 4.2.3 or newer. Considering the usual
if test -f $mam_template; then # portability constraints of this script, that may seem a very demanding
PERL=perl # requirement, but it should be ok. Ignore any failure, which is fine,
for tool in cut head join pr sort tac tail test tr uniq wc; do # since this is only a convenience to help developers avoid the relatively
m=tests/$tool/Makefile.am # unusual case in which a symlinked-to .m4 file is git-removed from gnulib
t=${m}t # between successive runs of this script.
rm -f $m $t find "$m4_base" "$source_base" \
sed -n '1,/^##test-files-begin/p' $mam_template > $t -depth \( -name '*.m4' -o -name '*.[ch]' \) \
echo "x = $tool" >> $t -type l -xtype l -delete > /dev/null 2>&1
srcdir=tests/$tool
$PERL -I$srcdir -w -- tests/mk-script $srcdir --list >> $t
sed -n '/^##test-files-end/,$p' $mam_template >> $t
chmod -w $t
mv $t $m
done
fi
# Reconfigure, getting other files. # Reconfigure, getting other files.
# Skip autoheader if it's not needed.
grep -E '^[ ]*AC_CONFIG_HEADERS?\>' configure.ac >/dev/null ||
AUTOHEADER=true
for command in \ for command in \
libtool \ libtool \
'aclocal --force -I m4' \ "${ACLOCAL-aclocal} --force -I m4" \
'autoconf --force' \ "${AUTOCONF-autoconf} --force" \
'autoheader --force' \ "${AUTOHEADER-autoheader} --force" \
'automake --add-missing --copy --force-missing'; "${AUTOMAKE-automake} --add-missing --copy --force-missing"
do do
if test "$command" = libtool; then if test "$command" = libtool; then
grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null || use_libtool=0
continue # We'd like to use grep -E, to see if any of LT_INIT,
command='libtoolize -c -f' # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
# but that's not portable enough (e.g., for Solaris).
grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
&& use_libtool=1
grep '^[ ]*LT_INIT' configure.ac >/dev/null \
&& use_libtool=1
test $use_libtool = 0 \
&& continue
command="${LIBTOOLIZE-libtoolize} -c -f"
fi fi
echo "$0: $command ..." echo "$0: $command ..."
$command || exit $command || exit
@@ -648,11 +805,11 @@ if test $with_gettext = yes; then
rm -f po/Makevars rm -f po/Makevars
sed ' sed '
/^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/ /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/ /^MSGID_BUGS_ADDRESS *=/s/=.*/= '"$MSGID_BUGS_ADDRESS"'/
/^XGETTEXT_OPTIONS *=/{ /^XGETTEXT_OPTIONS *=/{
s/$/ \\/ s/$/ \\/
a\ a\
'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+} '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
} }
' po/Makevars.template >po/Makevars ' po/Makevars.template >po/Makevars
@@ -664,9 +821,9 @@ if test $with_gettext = yes; then
/^subdir *=.*/s/=.*/= runtime-po/ /^subdir *=.*/s/=.*/= runtime-po/
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/ /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
/^XGETTEXT_OPTIONS *=/{ /^XGETTEXT_OPTIONS *=/{
s/$/ \\/ s/$/ \\/
a\ a\
'"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+} '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
} }
' <po/Makevars.template >runtime-po/Makevars ' <po/Makevars.template >runtime-po/Makevars
@@ -675,4 +832,10 @@ if test $with_gettext = yes; then
fi fi
fi fi
bootstrap_epilogue
echo "$0: done. Now you can run './configure'." echo "$0: done. Now you can run './configure'."
# Local Variables:
# indent-tabs-mode: nil
# End:
+7 -7
View File
@@ -1,6 +1,6 @@
# Bootstrap configuration. # Bootstrap configuration.
# Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # Copyright (C) 2006-2010 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,12 +17,12 @@
# gnulib modules used by this package. # gnulib modules used by this package.
gnulib_modules=' gnulib_modules='
announce-gen argmatch config-h c-strcase configmake dirname error announce-gen argmatch assert config-h c-strcase configmake dirname
extensions fopen-safer gendocs getopt-gnu gettext git-version-gen hash error extensions fopen-safer gendocs getopt-gnu gettext
inttypes javacomp-script javaexec-script maintainer-makefile malloc git-version-gen hash inttypes javacomp-script javaexec-script
mbswidth obstack quote quotearg stdbool stpcpy strerror strtoul maintainer-makefile malloc mbswidth obstack quote quotearg stdbool
strverscmp unistd unistd-safer unlocked-io update-copyright unsetenv stpcpy strerror strtoul strverscmp unistd unistd-safer unlocked-io
verify warnings xalloc xalloc-die xstrndup update-copyright unsetenv verify warnings xalloc xalloc-die xstrndup
' '
# Additional xgettext options to use. Use "\\\newline" to break lines. # Additional xgettext options to use. Use "\\\newline" to break lines.
+4
View File
@@ -1,4 +1,7 @@
Makefile
Makefile.in
announce-gen announce-gen
arg-nonnull.h
compile compile
config.guess config.guess
config.rpath config.rpath
@@ -16,4 +19,5 @@ 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
+4
View File
@@ -1,4 +1,7 @@
/Makefile
/Makefile.in
/announce-gen /announce-gen
/arg-nonnull.h
/compile /compile
/config.guess /config.guess
/config.rpath /config.rpath
@@ -16,4 +19,5 @@
/update-copyright /update-copyright
/useless-if-before-free /useless-if-before-free
/vc-list-files /vc-list-files
/warn-on-use.h
/ylwrap /ylwrap
+2
View File
@@ -0,0 +1,2 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*-
EXTRA_DIST = prev-version.txt cross-options.pl update-b4-copyright
+10 -38
View File
@@ -5,10 +5,7 @@ use 5.005;
use strict; use strict;
my %option; my %option;
my %directive; while (<>)
my $scanner = `grep -i '"%[a-z]' $ARGV[0]`;
$scanner =~ s/"\[-_\]"/-/g;
while (<STDIN>)
{ {
if (/^\s* # Initial spaces. if (/^\s* # Initial spaces.
(?:(-\w),\s+)? # $1: $short: Possible short option. (?:(-\w),\s+)? # $1: $short: Possible short option.
@@ -19,14 +16,7 @@ while (<STDIN>)
/x) /x)
{ {
my ($short, $long, $opt, $arg) = ($1, $2, $3, $4); my ($short, $long, $opt, $arg) = ($1, $2, $3, $4);
$short = '' if ! defined $short; $short = defined $short ? '@option{' . $short . '}' : '';
$short = '-d' if $long eq '--defines' && ! $short;
my $dir = '%' . substr($long, 2);
if (index ($scanner, "\"$dir\"") < 0)
{
if ($long eq '--force-define') { $dir = '%define'; }
else { $dir = ''; }
}
if ($arg) if ($arg)
{ {
# if $opt, $arg contains the closing ]. # if $opt, $arg contains the closing ].
@@ -34,7 +24,6 @@ while (<STDIN>)
if $opt eq '['; if $opt eq '[';
$arg =~ s/^=//; $arg =~ s/^=//;
$arg = lc ($arg); $arg = lc ($arg);
my $dir_arg = $arg;
# If the argument is compite (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]}].
@@ -44,36 +33,19 @@ while (<STDIN>)
$long_arg = "[$long_arg]"; $long_arg = "[$long_arg]";
$arg = "[$arg]"; $arg = "[$arg]";
} }
# For arguments of directives: this only works if all arguments $option{"$long$long_arg"} = $short ? "$short $arg" : '';
# are strings and have the same syntax as on the command line. }
if ($dir_arg eq 'name[=value]') else
{ {
$dir_arg = '@var{name} ["@var{value}"]'; $option{"$long"} = "$short";
}
else
{
$dir_arg =~ s/(\w+)/\@var{"$1"}/g;
$dir_arg = '[' . $dir_arg . ']'
if $opt eq '[';
}
$long = "$long$long_arg";
$short = "$short $arg" if $short && $short ne '-d';
$dir = "$dir $dir_arg" if $dir;
} }
$option{$long} = $short;
$directive{$long} = $dir;
} }
} }
my $sep = '';
foreach my $long (sort keys %option) foreach my $long (sort keys %option)
{ {
# Avoid trailing spaces. # Avoid trailing spaces.
print $sep; printf ("\@item %-40s \@tab%s\n",
$sep = "\n"; '@option{' . $long . '}',
print '@item @option{', $long, "}\n\@tab"; $option{$long} ? " $option{$long}" : "");
print ' @option{', $option{$long}, '}' if $option{$long};
print "\n\@tab";
print ' @code{', $directive{$long}, '}' if $directive{$long};
print "\n";
} }
-5
View File
@@ -1,5 +0,0 @@
EXTRA_DIST += \
build-aux/cross-options.pl \
build-aux/move-if-change \
build-aux/prev-version.txt \
build-aux/update-b4-copyright
-1
View File
@@ -1 +0,0 @@
../gnulib/build-aux/move-if-change
+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 Free Software Foundation, Inc. # Copyright (C) 2009-2010 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
+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/perl -0777 -pi
# In configure.ac, update PACKAGE_COPYRIGHT_YEAR to the current year.
# Copyright (C) 2010 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, 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/>.
use strict;
use warnings;
my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR};
if (!$this_year || $this_year !~ m/^\d{4}$/)
{
my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ());
$this_year = $year + 1900;
}
my $old_re = <<'EOF'
(
MACRO\(
\[PACKAGE_COPYRIGHT_YEAR],
\s*\[
)
(\d{4})
(?=])
EOF
;
foreach my $macro ("AC_DEFINE", "AC_SUBST")
{
my $this_old_re = $old_re;
$this_old_re =~ s/MACRO/$macro/;
if (!s/$this_old_re/$1$this_year/x)
{
print STDERR
"$ARGV: warning: failed to update PACKAGE_COPYRIGHT_YEAR in"
. " $macro.\n";
}
}
+3 -3
View File
@@ -1,5 +1,5 @@
# Customize maint.mk -*- makefile -*- # Customize maint.mk -*- makefile -*-
# Copyright (C) 2008-2009 Free Software Foundation, Inc. # Copyright (C) 2008-2010 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
@@ -39,10 +39,10 @@ local-checks-to-skip = changelog-check
# The local directory containing the checked-out copy of gnulib used in # The local directory containing the checked-out copy of gnulib used in
# this release. Used solely to get a date for the "announcement" target. # this release. Used solely to get a date for the "announcement" target.
gnulib_dir = $(srcdir)/../../gnulib gnulib_dir = $(srcdir)/gnulib
bootstrap-tools = autoconf,automake,flex,gnulib bootstrap-tools = autoconf,automake,flex,gnulib
update-copyright: update-b4-copyright 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
+33 -26
View File
@@ -1,7 +1,6 @@
# Configure template for GNU Bison. -*-Autoconf-*- # Configure template for GNU Bison. -*-Autoconf-*-
# #
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Copyright (C) 2001-2010 Free Software Foundation, Inc.
# 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,25 +15,30 @@
# 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/>.
# testsuite -C appears in 2.62. # We have strange test case titles, so we need Autoconf 2.61 or better.
AC_PREREQ(2.62) AC_PREREQ(2.61)
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_DEFINE([PACKAGE_COPYRIGHT_YEAR], [2008], AC_DEFINE([PACKAGE_COPYRIGHT_YEAR], [2010],
[The copyright year for this package]) [The copyright year for this package])
AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2008]) AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2010])
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
# We don't have a file m4/Makefile.am, so we need Automake 1.8 or later. # 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 formal release so that we can, # We want gnits strictness only when rolling a formal release so that we can,
# for example, run make dist at other times without being required to add a # for example, run make dist at other times without being required to add a
# bogus NEWS entry. # bogus NEWS entry.
AM_INIT_AUTOMAKE([1.8 dist-bzip2] AM_INIT_AUTOMAKE([1.11.1 dist-bzip2]
m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [-], [gnu], [gnits])) m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [-], [gnu], [gnu]))
AC_CONFIG_HEADERS([lib/config.h:lib/config.hin]) AC_CONFIG_HEADERS([lib/config.h:lib/config.hin])
# Checks for the compiler. # Checks for the compiler.
@@ -68,6 +72,12 @@ if test "${enableval}" = yes; then
gl_WARN_ADD([-Wshadow]) gl_WARN_ADD([-Wshadow])
gl_WARN_ADD([-Wstrict-prototypes]) gl_WARN_ADD([-Wstrict-prototypes])
AC_SUBST([WARN_CFLAGS]) AC_SUBST([WARN_CFLAGS])
# Warnings for the test suite only.
gl_WARN_ADD([-Wundef], [WARN_CFLAGS_TEST])
WARN_CXXFLAGS_TEST="$WARN_CXXFLAGS $WARN_CFLAGS_TEST"
WARN_CFLAGS_TEST="$WARN_CFLAGS $WARN_CFLAGS_TEST"
AC_SUBST([WARN_CXXFLAGS_TEST])
AC_SUBST([WARN_CFLAGS_TEST])
AC_DEFINE([lint], 1, [Define to 1 if the compiler is checking for lint.]) AC_DEFINE([lint], 1, [Define to 1 if the compiler is checking for lint.])
fi fi
@@ -79,8 +89,8 @@ AC_ARG_ENABLE([yacc],
, [enable_yacc=yes]) , [enable_yacc=yes])
case $enable_yacc in case $enable_yacc in
yes) yes)
YACC_SCRIPT=src/yacc YACC_SCRIPT=yacc
YACC_LIBRARY=lib/liby.a;; YACC_LIBRARY=liby.a;;
*) *)
YACC_SCRIPT= YACC_SCRIPT=
YACC_LIBRARY=;; YACC_LIBRARY=;;
@@ -117,10 +127,9 @@ BISON_PREREQ_SUBPIPE
BISON_PREREQ_TIMEVAR BISON_PREREQ_TIMEVAR
# Gettext. # Gettext.
# We use gnulib, which is only guaranteed to work properly with the # We've never tested with gettext versions before 0.15, so play it safe.
# latest Gettext.
AM_GNU_GETTEXT([external], [need-ngettext]) AM_GNU_GETTEXT([external], [need-ngettext])
AM_GNU_GETTEXT_VERSION([0.17]) AM_GNU_GETTEXT_VERSION([0.15])
BISON_I18N BISON_I18N
# Internationalized parsers. # Internationalized parsers.
@@ -134,7 +143,7 @@ AC_CONFIG_FILES([etc/bench.pl], [chmod +x etc/bench.pl])
# Initialize the test suite. # Initialize the test suite.
AC_CONFIG_TESTDIR(tests) AC_CONFIG_TESTDIR(tests)
AC_CONFIG_FILES([tests/atlocal]) AC_CONFIG_FILES([tests/Makefile 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])
AC_PROG_CXX AC_PROG_CXX
@@ -145,19 +154,17 @@ AC_SUBST([GCC])
AC_SUBST([O0CFLAGS], [`echo $CFLAGS | sed 's/-O[[0-9]] *//'`]) AC_SUBST([O0CFLAGS], [`echo $CFLAGS | sed 's/-O[[0-9]] *//'`])
AC_SUBST([O0CXXFLAGS], [`echo $CXXFLAGS | sed 's/-O[[0-9]] *//'`]) AC_SUBST([O0CXXFLAGS], [`echo $CXXFLAGS | sed 's/-O[[0-9]] *//'`])
gt_JAVACOMP([1.3], [1.4]) gt_JAVACOMP([1.3])
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'`
for ac_var in ALLOCA_H ERRNO_H FCNTL_H GETOPT_H INTTYPES_H \
STDBOOL_H STDINT_H SYS_WAIT_H WCHAR_H WCTYPE_H
do
eval "test 'x$ac_var' = x || $ac_var=lib/\$$ac_var"
done
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile
build-aux/Makefile
po/Makefile.in po/Makefile.in
examples/calc++/Makefile data/Makefile
doc/yacc.1]) etc/Makefile
examples/Makefile
examples/calc++/Makefile
lib/Makefile src/Makefile
doc/Makefile
doc/yacc.1])
AC_OUTPUT AC_OUTPUT
+2
View File
@@ -0,0 +1,2 @@
Makefile.in
Makefile
+2
View File
@@ -0,0 +1,2 @@
/Makefile.in
/Makefile
+29
View File
@@ -0,0 +1,29 @@
## Copyright (C) 2002, 2005-2010 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/>.
dist_pkgdata_DATA = README bison.m4 \
c-skel.m4 c.m4 yacc.c glr.c \
c++-skel.m4 c++.m4 location.cc lalr1.cc glr.cc \
java-skel.m4 java.m4 lalr1.java
m4sugardir = $(pkgdatadir)/m4sugar
dist_m4sugar_DATA = m4sugar/m4sugar.m4 m4sugar/foreach.m4
xsltdir = $(pkgdatadir)/xslt
dist_xslt_DATA = \
xslt/bison.xsl \
xslt/xml2dot.xsl \
xslt/xml2text.xsl \
xslt/xml2xhtml.xsl
+1 -1
View File
@@ -52,7 +52,7 @@ into various formats.
----- -----
Copyright (C) 2002, 2008-2009 Free Software Foundation, Inc. Copyright (C) 2002, 2008-2010 Free Software Foundation, Inc.
This file is part of GNU Bison. This file is part of GNU Bison.
+16 -279
View File
@@ -1,8 +1,7 @@
-*- Autoconf -*- -*- Autoconf -*-
# Language-independent M4 Macros for Bison. # Language-independent M4 Macros for Bison.
# Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009 # Copyright (C) 2002, 2004-2010 Free Software Foundation, Inc.
# 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 +21,14 @@
## Identification. ## ## Identification. ##
## ---------------- ## ## ---------------- ##
# b4_copyright(TITLE, [YEARS]) # b4_copyright(TITLE, YEARS)
# ---------------------------- # --------------------------
# If YEARS are not defined, use b4_copyright_years.
m4_define([b4_copyright], m4_define([b4_copyright],
[b4_comment([A Bison parser, made by GNU Bison b4_version.]) [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_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [ ])
]m4_ifval([$2], [[$2]], [m4_defn([b4_copyright_years])])[
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
@@ -212,87 +208,6 @@ m4_define([b4_ints_in],
[m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])]) [m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])])
# b4_subtract(LHS, RHS)
# ---------------------
# Evaluate LHS - RHS if they are integer literals, otherwise expand
# to (LHS) - (RHS).
m4_define([b4_subtract],
[m4_bmatch([$1$2], [^[0123456789]*$],
[m4_eval([$1 - $2])],
[($1) - ($2)])])
# b4_args(ARG1, ...)
# _b4_args(ARG1, ...)
# -------------------
# Join with comma, skipping empty arguments.
# b4_args calls itself recursively until it sees the first non-empty
# argument, then calls _b4_args which prepends each non-empty argument
# with a comma.
m4_define([b4_args],
[m4_if([$#$1],
[1], [],
[m4_ifval([$1],
[$1[]_$0(m4_shift($@))],
[$0(m4_shift($@))])])])
# _b4_args(ARGS1, ...)
# --------------------
m4_define([_b4_args],
[m4_if([$#$1],
[1], [],
[m4_ifval([$1], [, $1])[]$0(m4_shift($@))])])
# b4_integral_parser_tables_map(MACRO)
# -------------------------------------
# Map MACRO on all the integral tables. MACRO is expected to have
# the signature MACRO(TABLE-NAME, CONTENT, COMMENT).
m4_define([b4_integral_parser_tables_map],
[$1([pact], [b4_pact],
[[YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM.]])
$1([defact], [b4_defact],
[[YYDEFACT[S] -- default reduction number in state S. Performed when
YYTABLE does not specify something else to do. Zero means the default
is an error.]])
$1([pgoto], [b4_pgoto], [[YYPGOTO[NTERM-NUM].]])
$1([defgoto], [b4_defgoto], [[YYDEFGOTO[NTERM-NUM].]])
$1([table], [b4_table],
[[YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If YYTABLE_NINF, syntax error.]])
$1([check], [b4_check])
$1([stos], [b4_stos],
[[STOS_[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM.]])
$1([r1], [b4_r1],
[[YYR1[YYN] -- Symbol number of symbol that rule YYN derives.]])
$1([r2], [b4_r2],
[[YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.]])
])
# b4_parser_tables_declare
# b4_parser_tables_define
# ------------------------
# Define/declare the (deterministic) parser tables.
m4_define([b4_parser_tables_declare],
[b4_integral_parser_tables_map([b4_integral_parser_table_declare])])
m4_define([b4_parser_tables_define],
[b4_integral_parser_tables_map([b4_integral_parser_table_define])])
## ------------------ ## ## ------------------ ##
## Decoding options. ## ## Decoding options. ##
@@ -331,120 +246,16 @@ m4_define([b4_$3_if],
# ----------------------------- # -----------------------------
# Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise. # Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise.
b4_define_flag_if([defines]) # Whether headers are requested. b4_define_flag_if([defines]) # Whether headers are requested.
b4_define_flag_if([error_verbose]) # Whether error are verbose.
b4_define_flag_if([glr]) # Whether a GLR parser is requested. b4_define_flag_if([glr]) # Whether a GLR parser is requested.
b4_define_flag_if([locations]) # Whether locations are tracked.
b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled. b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled.
b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated.
## --------- ## ## ------------------------- ##
## Symbols. ## ## Assigning token numbers. ##
## --------- ## ## ------------------------- ##
# b4_symbol_(NUM, FIELD)
# ----------------------
# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if
# undefined.
m4_define([b4_symbol_],
[m4_indir([b4_symbol($1, $2)])])
# b4_symbol(NUM, FIELD)
# ---------------------
# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if
# undefined. If FIELD = id, prepend the prefix.
m4_define([b4_symbol],
[m4_case([$2],
[id], [m4_do([b4_percent_define_get([api.tokens.prefix])],
[b4_symbol_([$1], [id])])],
[b4_symbol_($@)])])
# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
# -------------------------------------------
# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE.
# Otherwise an error.
m4_define([b4_symbol_if],
[m4_case(b4_symbol([$1], [$2]),
[1], [$3],
[0], [$4],
[m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
# b4_symbol_action_location(SYMBOL-NUM, KIND)
# -------------------------------------------
# Report the location of the KIND action as FILE:LINE.
m4_define([b4_symbol_action_location],
[b4_symbol([$1], [$2_file]):b4_syncline([b4_symbol([$1], [$2_line])])])
# b4_symbol_action(SYMBOL-NUM, KIND)
# ----------------------------------
# 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],
[b4_symbol_if([$1], [has_$2],
[m4_pushdef([b4_dollar_dollar],
[b4_symbol_value([(*yyvaluep)],
b4_symbol_if([$1], [has_type],
[b4_symbol([$1], [type])]))])dnl
m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
b4_symbol_case_([$1])
b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
b4_symbol([$1], [$2])
b4_syncline([@oline@], [@ofile@])
break;
m4_popdef([b4_at_dollar])dnl
m4_popdef([b4_dollar_dollar])dnl
])])
# b4_symbol_destructor(SYMBOL-NUM)
# b4_symbol_printer(SYMBOL-NUM)
# --------------------------------
m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])])
m4_define([b4_symbol_printer], [b4_symbol_action([$1], [printer])])
# b4_symbol_case_(SYMBOL-NUM)
# ---------------------------
# Issue a "case NUM" for SYMBOL-NUM.
m4_define([b4_symbol_case_],
[ case b4_symbol([$1], [number]): // b4_symbol([$1], [tag])
])
# b4_symbol_foreach(MACRO)
# ------------------------
# Invoke MACRO(SYMBOL-NUM) for each SYMBOL-NUM.
m4_define([b4_symbol_foreach],
[m4_map([$1], m4_defn([b4_symbol_numbers]))])
## ------- ##
## Types. ##
## ------- ##
# b4_type_action_(NUMS)
# ---------------------
# Run actions for the symbol NUMS that all have the same type-name.
# Skip NUMS that have no type-name.
m4_define([b4_type_action_],
[b4_symbol_if([$1], [has_type],
[m4_map([b4_symbol_case_], [$@])[]dnl
b4_dollar_dollar([b4_symbol([$1], [number])],
[b4_symbol([$1], [tag])],
[b4_symbol([$1], [type])]);
break;
])])
# b4_type_foreach(MACRO)
# ----------------------
# Invoke MACRO(SYMBOL-NUMS) for each set of SYMBOL-NUMS for each type set.
m4_define([b4_type_foreach],
[m4_map([$1], m4_defn([b4_type_names]))])
## ----------- ## ## ----------- ##
@@ -462,8 +273,8 @@ m4_define([b4_basename],
# b4_syncline(LINE, FILE) # b4_syncline(LINE, FILE)
# ----------------------- # -----------------------
m4_define([b4_syncline], m4_define([b4_syncline],
[b4_flag_if([synclines], [b4_flag_if([synclines], [
[b4_sync_end([__line__], [b4_basename(m4_quote(__file__))]) b4_sync_end([__line__], [b4_basename(m4_quote(__file__))])
b4_sync_start([$1], [$2])])]) b4_sync_start([$1], [$2])])])
m4_define([b4_sync_end], [b4_comment([Line $1 of $2])]) m4_define([b4_sync_end], [b4_comment([Line $1 of $2])])
@@ -505,8 +316,8 @@ b4_define_user_code([stype])
# but is not used by Bison (as recorded by macros in the namespace # but is not used by Bison (as recorded by macros in the namespace
# BISON-NAMESPACE). # BISON-NAMESPACE).
# #
# USER-LIST must expand to a list specifying all user occurrences of all names # USER-LIST must expand to a list specifying all grammar occurrences of all
# of type WHAT. Each item in the list must be a triplet specifying one # names of type WHAT. Each item in the list must be a triplet specifying one
# occurrence: name, start boundary, and end boundary. Empty string names are # occurrence: name, start boundary, and end boundary. Empty string names are
# fine. An empty list is fine. # fine. An empty list is fine.
# #
@@ -550,20 +361,6 @@ m4_popdef([b4_start])dnl
m4_popdef([b4_end])dnl m4_popdef([b4_end])dnl
])]) ])])
## --------------------- ##
## b4_percent_define_*. ##
## --------------------- ##
# b4_percent_define_use(VARIABLE)
# -------------------------------
# Declare that VARIABLE was used.
m4_define([b4_percent_define_use],
[m4_define([b4_percent_define_bison_variables(]$1[)])dnl
])
# b4_percent_define_get(VARIABLE) # b4_percent_define_get(VARIABLE)
# ------------------------------- # -------------------------------
# Mimic muscle_percent_define_get in ../src/muscle_tab.h exactly. That is, if # Mimic muscle_percent_define_get in ../src/muscle_tab.h exactly. That is, if
@@ -575,7 +372,7 @@ 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 [m4_define([b4_percent_define_bison_variables(]$1[)])dnl
m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])]) m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])])
# b4_percent_define_get_loc(VARIABLE) # b4_percent_define_get_loc(VARIABLE)
@@ -626,15 +423,9 @@ m4_define([b4_percent_define_get_syncline],
# 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],
[m4_ifdef([b4_percent_define(]$1[)], [m4_ifdef([b4_percent_define(]$1[)],
[b4_percent_define_use([$1])$2], [m4_define([b4_percent_define_bison_variables(]$1[)])$2],
[$3])]) [$3])])
## --------- ##
## Options. ##
## --------- ##
# b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE]) # b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE])
# -------------------------------------------------------- # --------------------------------------------------------
# Mimic muscle_percent_define_flag_if in ../src/muscle_tab.h exactly. That is, # Mimic muscle_percent_define_flag_if in ../src/muscle_tab.h exactly. That is,
@@ -658,7 +449,6 @@ m4_define([b4_percent_define_flag_if],
[[b4_percent_define_flag_if($1)]])])], [[b4_percent_define_flag_if($1)]])])],
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_flag_if]], [$1])])]) [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_flag_if]], [$1])])])
# b4_percent_define_default(VARIABLE, DEFAULT) # 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,
@@ -677,20 +467,6 @@ m4_define([b4_percent_define_default],
[[<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(VARIABLE)
# -------------------------------------
# Define b4_VARIABLE_if that executes its $1 or $2 depending whether
# VARIABLE was %defined. The characters `.' and `-' in VARIABLE are mapped
# to `_'.
m4_define([b4_percent_define_if_define_],
[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]),
[b4_percent_define_flag_if([$1], [$2], [$3])])])
m4_define([b4_percent_define_if_define],
[b4_percent_define_default([[$1]], [[false]])
b4_percent_define_if_define_([$1], $[1], $[2])])
# b4_percent_define_check_values(VALUES) # b4_percent_define_check_values(VALUES)
# -------------------------------------- # --------------------------------------
# Mimic muscle_percent_define_check_values in ../src/muscle_tab.h exactly # Mimic muscle_percent_define_check_values in ../src/muscle_tab.h exactly
@@ -722,11 +498,7 @@ m4_define([_b4_percent_define_check_values],
[b4_complain_at(b4_percent_define_get_loc([$1]), [b4_complain_at(b4_percent_define_get_loc([$1]),
[[invalid value for %%define variable `%s': `%s']], [[invalid value for %%define variable `%s': `%s']],
[$1], [$1],
m4_dquote(m4_indir([b4_percent_define(]$1[)]))) m4_dquote(m4_indir([b4_percent_define(]$1[)])))])dnl
m4_foreach([b4_value], m4_dquote(m4_shift($@)),
[b4_complain_at(b4_percent_define_get_loc([$1]),
[[accepted value: `%s']],
m4_dquote(b4_value))])])dnl
m4_popdef([b4_good_value])], m4_popdef([b4_good_value])],
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_check_values]], [$1])])]) [b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_check_values]], [$1])])])
@@ -765,41 +537,6 @@ m4_define([b4_percent_code_ifdef],
[$3])]) [$3])])
## ------------------ ##
## 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_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [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([lex_symbol])
b4_percent_define_if_define([locations]) # Whether locations are tracked.
b4_percent_define_if_define([parse.assert])
b4_percent_define_if_define([parse.trace])
b4_percent_define_if_define([variant])
# b4_error_verbose_if([IF-ERRORS-ARE-VERBOSE], [IF-NOT])
# ------------------------------------------------------
# Map %define parse.error "(simple|verbose)" to b4_error_verbose_if and
# b4_error_verbose_flag.
b4_percent_define_default([[parse.error]], [[simple]])
b4_percent_define_check_values([[[[parse.error]],
[[simple]], [[verbose]]]])
m4_define([b4_error_verbose_flag],
m4_case(b4_percent_define_get([[parse.error]]),
[simple], [[0]],
[verbose], [[1]]))
b4_define_flag_if([error_verbose])
## ----------------------------------------------------------- ## ## ----------------------------------------------------------- ##
## 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. ##
+1 -1
View File
@@ -1,7 +1,7 @@
-*- Autoconf -*- -*- Autoconf -*-
# C++ skeleton dispatching for Bison. # C++ skeleton dispatching for Bison.
# Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. # Copyright (C) 2006-2007, 2009-2010 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
+13 -312
View File
@@ -2,8 +2,7 @@
# C++ skeleton for Bison # C++ skeleton for Bison
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Copyright (C) 2002-2010 Free Software Foundation, Inc.
# 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,24 +23,22 @@ m4_include(b4_pkgdatadir/[c.m4])
## Default values. ## ## Default values. ##
## ---------------- ## ## ---------------- ##
# Default parser class name.
b4_percent_define_default([[parser_class_name]], [[parser]]) b4_percent_define_default([[parser_class_name]], [[parser]])
b4_percent_define_default([[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]])
b4_percent_define_default([[api.namespace]], m4_defn([b4_prefix])) b4_percent_define_default([[namespace]], m4_defn([b4_prefix]))
b4_percent_define_default([[global_tokens_and_yystype]], [[false]]) b4_percent_define_default([[global_tokens_and_yystype]], [[false]])
b4_percent_define_default([[define_location_comparison]], b4_percent_define_default([[define_location_comparison]],
[m4_if(b4_percent_define_get([[filename_type]]), [m4_if(b4_percent_define_get([[filename_type]]),
[std::string], [[true]], [[false]])]) [std::string], [[true]], [[false]])])
## ----------- ## ## ----------- ##
## Namespace. ## ## Namespace. ##
## ----------- ## ## ----------- ##
m4_define([b4_namespace_ref], [b4_percent_define_get([[api.namespace]])]) m4_define([b4_namespace_ref], [b4_percent_define_get([[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.
@@ -51,7 +48,7 @@ m4_define([b4_namespace_ref], [b4_percent_define_get([[api.namespace]])])
# include the header, which is always generated. If we ever need to permit # include the header, which is always generated. If we ever need to permit
# internal linkage somehow, surely we can find a cleaner approach. # internal linkage somehow, surely we can find a cleaner approach.
m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [], m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [],
[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), [b4_complain_at(b4_percent_define_get_loc([[namespace]]),
[[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
@@ -62,24 +59,24 @@ m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [],
# Specifically, don't allow empty names as b4_namespace_open would just convert # Specifically, don't allow empty names as b4_namespace_open would just convert
# those into anonymous namespaces, and that might tempt some users. # those into anonymous namespaces, and that might tempt some users.
m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*::]), [-1], [], m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*::]), [-1], [],
[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), [b4_complain_at(b4_percent_define_get_loc([[namespace]]),
[[namespace reference has consecutive "::"]])]) [[namespace reference has consecutive "::"]])])
m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*$]), [-1], [], m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*$]), [-1], [],
[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), [b4_complain_at(b4_percent_define_get_loc([[namespace]]),
[[namespace reference has a trailing "::"]])]) [[namespace reference has a trailing "::"]])])
m4_define([b4_namespace_open], m4_define([b4_namespace_open],
[b4_user_code([b4_percent_define_get_syncline([[api.namespace]]) [b4_user_code([b4_percent_define_get_syncline([[namespace]])
[namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref), [namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref),
[^\(.\)[ ]*::], [\1])), [^\(.\)[ ]*::], [\1])),
[::], [ { namespace ])[ {]])]) [::], [ { namespace ])[ {]])])
m4_define([b4_namespace_close], m4_define([b4_namespace_close],
[b4_user_code([b4_percent_define_get_syncline([[api.namespace]]) [b4_user_code([b4_percent_define_get_syncline([[namespace]])
m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]), m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
[^\(.\)[ ]*\(::\)?\([^][:]\|:[^:]\)*], [^\(.\)[ ]*\(::\)?\([^][:]\|:[^][:]\)*],
[\1])), [\1])),
[::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])]) [::\([^][:]\|:[^][:]\)*], [} ])[} // ]b4_namespace_ref])])
# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) # b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
@@ -99,307 +96,12 @@ m4_map_sep([ b4_token_enum], [,
## Semantic Values. ## ## Semantic Values. ##
## ----------------- ## ## ----------------- ##
# b4_semantic_type_declare
# ------------------------
# Declare semantic_type.
m4_define([b4_semantic_type_declare],
[ /// Symbol semantic values.
m4_ifdef([b4_stype],
[ union semantic_type
{b4_user_stype
};],
[m4_if(b4_tag_seen_flag, 0,
[[ typedef int semantic_type;]],
[[ typedef YYSTYPE semantic_type;]])])])
# b4_public_types_declare
# -----------------------
# Define the public types: token, semantic value, location, and so forth.
# Depending on %define token_lex, may be output in the header or source file.
m4_define([b4_public_types_declare],
[[#ifndef YYSTYPE
]b4_semantic_type_declare[
#else
typedef YYSTYPE semantic_type;
#endif]b4_locations_if([
/// Symbol locations.
typedef b4_percent_define_get([[location_type]]) location_type;])[
/// Tokens.
struct token
{
]b4_token_enums(b4_tokens)[
};
/// Token type.
typedef token::yytokentype token_type;
/// A complete symbol, with its type.
template <typename Exact>
struct symbol_base_type
{
/// Default constructor.
inline symbol_base_type ();
/// Constructor.]b4_locations_if([
inline symbol_base_type (const location_type& l)])[;
inline symbol_base_type (]b4_args(
[const semantic_type& v],
b4_locations_if([const location_type& l]))[);
/// Release the memory allocated to members.
/// Reclaim the semantic value using the %destructor directive.
void clear ();
/// Print the semantic value using the %printer directive.
std::ostream& print (std::ostream& o) const;
/// Print everything about the symbol (type, value, location).
std::ostream& dump (std::ostream& o) const;
/// Return this with its exact type.
const Exact& self () const;
Exact& self ();
/// Return the type of this symbol.
int type_get () const;
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
/// The name for the type.
const char *type_name () const;
#endif
/// The semantic value.
semantic_type value;]b4_locations_if([
/// The location.
location_type location;])[
};
/// External form of a symbol: its type and attributes.
struct symbol_type : symbol_base_type<symbol_type>
{
/// The parent class.
typedef symbol_base_type<symbol_type> super_type;
/// Default constructor.
inline symbol_type ();
/// Constructor.
inline symbol_type (]b4_args([int t],
[const semantic_type& v],
b4_locations_if([const location_type& l]))[);
inline symbol_type (]b4_args([int t],
b4_locations_if([const location_type& l]))[);
/// The symbol type.
int type;
/// Return the type corresponding to this state.
inline int type_get_ () const;
/// Its token.
token_type token () const;
};
]b4_symbol_constructor_declare])
# b4_public_types_define
# ----------------------
# Provide the implementation needed by the public types.
m4_define([b4_public_types_define],
[[ // symbol_base_type.
template <typename Exact>
]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type ()
: value()]b4_locations_if([
, location()])[
{
}]b4_locations_if([[
template <typename Exact>
]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type (const location_type& l)
: value()
, location(l)
{
}]])[
template <typename Exact>
]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)])[
{
}
template <typename Exact>
void
]b4_parser_class_name[::symbol_base_type<Exact>::clear ()
{
int yytype = type_get ();
// User destructor.
switch (yytype)
{
]b4_symbol_foreach([b4_symbol_destructor])dnl
[ default:
break;
}]b4_variant_if([
// Type destructor.
b4_symbol_variant([[yytype]], [[value]], [[template destroy]])])[
}
template <typename Exact>
std::ostream&
]b4_parser_class_name[::symbol_base_type<Exact>::print (std::ostream& yystream) const
{
#define debug_stream() yystream
switch (type_get ())
{
]b4_symbol_foreach([b4_symbol_printer])dnl
[ default:
break;
}
#undef debug_stream
return yystream;
}
template <typename Exact>
std::ostream&
]b4_parser_class_name[::symbol_base_type<Exact>::dump (std::ostream& yystream) const
{
int yytype = type_get ();
yystream << (yytype < yyntokens_ ? "token" : "nterm")
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
<< ' ' << type_name ()
#endif
<< " ("]b4_locations_if([
<< location << ": "])[;
print (yystream);
return yystream << ')';
}
template <typename Exact>
const Exact&
]b4_parser_class_name[::symbol_base_type<Exact>::self () const
{
return static_cast<const Exact&>(*this);
}
template <typename Exact>
Exact&
]b4_parser_class_name[::symbol_base_type<Exact>::self ()
{
return static_cast<Exact&>(*this);
}
template <typename Exact>
int
]b4_parser_class_name[::symbol_base_type<Exact>::type_get () const
{
return self ().type_get_ ();
}
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
template <typename Exact>
const char *
]b4_parser_class_name[::symbol_base_type<Exact>::type_name () const
{
return ]b4_parser_class_name[::yytname_[type_get ()];
}
#endif
// symbol_type.
]b4_parser_class_name[::symbol_type::symbol_type ()
: super_type ()
, type ()
{
}
]b4_parser_class_name[::symbol_type::symbol_type (]b4_args(
[int t],
b4_locations_if([const location_type& l]))[)
: super_type (]b4_locations_if([l])[)
, type (t)
{
}
]b4_parser_class_name[::symbol_type::symbol_type (]b4_args(
[int t],
[const semantic_type& v],
b4_locations_if([const location_type& l]))[)
: super_type (v]b4_locations_if([, l])[)
, type (t)
{
}
int
]b4_parser_class_name[::symbol_type::type_get_ () const
{
return type;
}
]b4_lex_symbol_if([[
]b4_parser_class_name[::token_type
]b4_parser_class_name[::symbol_type::token () const
{
// YYTOKNUM[NUM] -- (External) token number corresponding to the
// (internal) symbol number NUM (which must be that of a token). */
static
const ]b4_int_type_for([b4_toknum])[
yytoken_number_[] =
{
]b4_toknum[
};
return static_cast<token_type> (yytoken_number_[type]);
}
]])[]dnl
b4_symbol_constructor_define])
# b4_symbol_constructor_declare
# b4_symbol_constructor_define
# -----------------------------
# Declare/define symbol constructors for all the value types.
# Use at class-level. Redefined in variant.hh.
m4_define([b4_symbol_constructor_declare], [])
m4_define([b4_symbol_constructor_define], [])
# b4_yytranslate_define
# ---------------------
# Define yytranslate_. Sometimes used in the header file,
# sometimes in the cc file.
m4_define([b4_yytranslate_define],
[[ // Symbol number corresponding to token number t.
]b4_parser_class_name[::token_number_type
]b4_parser_class_name[::yytranslate_ (]b4_lex_symbol_if([token_type],
[int])[ t)
{
static
const token_number_type
translate_table[] =
{
]b4_translate[
};
const unsigned int user_token_number_max_ = ]b4_user_token_number_max[;
const token_number_type undef_token_ = ]b4_undef_token_number[;
if (static_cast<int>(t) <= yyeof_)
return yyeof_;
else if (static_cast<unsigned int> (t) <= user_token_number_max_)
return translate_table[t];
else
return undef_token_;
}
]])
# b4_lhs_value([TYPE]) # b4_lhs_value([TYPE])
# -------------------- # --------------------
# Expansion of $<TYPE>$. # Expansion of $<TYPE>$.
m4_define([b4_lhs_value], m4_define([b4_lhs_value],
[b4_symbol_value([yyval], [$1])]) [(yyval[]m4_ifval([$1], [.$1]))])
# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
@@ -407,8 +109,7 @@ m4_define([b4_lhs_value],
# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
# symbols on RHS. # symbols on RHS.
m4_define([b4_rhs_value], m4_define([b4_rhs_value],
[b4_symbol_value([yysemantic_stack_@{($1) - ($2)@}], [$3])]) [(yysemantic_stack_@{($1) - ($2)@}m4_ifval([$3], [.$3]))])
# b4_lhs_location() # b4_lhs_location()
# ----------------- # -----------------
+1 -1
View File
@@ -1,7 +1,7 @@
-*- Autoconf -*- -*- Autoconf -*-
# C skeleton dispatching for Bison. # C skeleton dispatching for Bison.
# Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. # Copyright (C) 2006-2007, 2009-2010 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
+31 -76
View File
@@ -1,8 +1,7 @@
-*- Autoconf -*- -*- Autoconf -*-
# C M4 Macros for Bison. # C M4 Macros for Bison.
# Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008, 2009 # Copyright (C) 2002, 2004-2010 Free Software Foundation, Inc.
# 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
@@ -21,40 +20,17 @@
## Identification. ## ## Identification. ##
## ---------------- ## ## ---------------- ##
# b4_comment_(TEXT, OPEN, CONTINUE, END) # b4_comment(TEXT)
# ------------------------------------- # ----------------
# Put TEXT in comment. Avoid trailing spaces: don't indent empty lines. m4_define([b4_comment], [/* m4_bpatsubst([$1], [
# 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
# b4_pull_flag if they use the values of the %define variables api.pure or # b4_pull_flag if they use the values of the %define variables api.pure or
# api.push-pull. # api.push_pull.
m4_define([b4_identification], m4_define([b4_identification],
[[/* Identify Bison output. */ [[/* Identify Bison output. */
#define YYBISON 1 #define YYBISON 1
@@ -75,7 +51,7 @@ m4_define([b4_identification],
#define YYPULL ]b4_pull_flag])[ #define YYPULL ]b4_pull_flag])[
/* Using locations. */ /* Using locations. */
#define YYLSP_NEEDED ]b4_locations_if([1], [0])[ #define YYLSP_NEEDED ]b4_locations_flag[
]]) ]])
@@ -157,17 +133,6 @@ m4_define([b4_int_type_for],
[b4_int_type($1_min, $1_max)]) [b4_int_type($1_min, $1_max)])
# b4_table_value_equals(TABLE, VALUE, LITERAL)
# --------------------------------------------
# Without inducing a comparison warning from the compiler, check if the
# literal value LITERAL equals VALUE from table TABLE, which must have
# 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_if(m4_eval($3 < m4_indir([b4_]$1[_min])
|| m4_indir([b4_]$1[_max]) < $3), [1],
[[YYID (0)]],
[[((]$2[) == (]$3[))]])])
## ---------## ## ---------##
## Values. ## ## Values. ##
@@ -180,17 +145,6 @@ m4_define([b4_table_value_equals],
m4_define([b4_null], [0]) m4_define([b4_null], [0])
# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
# -------------------------------------------------------------
# Define "yy<TABLE-NAME>" which contents is CONTENT.
m4_define([b4_integral_parser_table_define],
[m4_ifval([$3], [b4_c_comment([$3], [ ])
])dnl
static const b4_int_type_for([$2]) yy$1[[]] =
{
$2
};dnl
])
## ------------------------- ## ## ------------------------- ##
@@ -201,7 +155,7 @@ static const b4_int_type_for([$2]) yy$1[[]] =
# ----------------------------------------- # -----------------------------------------
# Output the definition of this token as #define. # Output the definition of this token as #define.
m4_define([b4_token_define], m4_define([b4_token_define],
[#define b4_percent_define_get([api.tokens.prefix])$1 $2 [#define $1 $2
]) ])
@@ -219,7 +173,7 @@ m4_map([b4_token_define], [$@])])
# --------------------------------------- # ---------------------------------------
# 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_percent_define_get([api.tokens.prefix])$1 = $2]) [$1 = $2])
# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) # b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
@@ -250,21 +204,6 @@ m4_define([b4_token_enums_defines],
]) ])
## ----------------- ##
## Semantic Values. ##
## ----------------- ##
# b4_symbol_value(VAL, [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
# used safetly, it is put in parens to avoid nasty precedence issues.
# TYPE is *not* put in braces, provide some if needed.
m4_define([b4_symbol_value],
[($1[]m4_ifval([$2], [.$2]))])
## --------------------------------------------- ## ## --------------------------------------------- ##
## Defining C functions in both K&R and ANSI-C. ## ## Defining C functions in both K&R and ANSI-C. ##
@@ -353,7 +292,7 @@ m4_define([b4_c_knr_formal_decl],
# ----------------------------------------------------------- # -----------------------------------------------------------
# Declare the function NAME. # Declare the function NAME.
m4_define([b4_c_function_decl], m4_define([b4_c_function_decl],
[#if b4_c_modern [#if defined __STDC__ || defined __cplusplus
b4_c_ansi_function_decl($@) b4_c_ansi_function_decl($@)
#else #else
$2 $1 (); $2 $1 ();
@@ -412,9 +351,25 @@ m4_define([b4_sync_start], [[#]line $1 $2])
m4_define([b4_case], m4_define([b4_case],
[ case $1: [ case $1:
$2 $2
b4_syncline([@oline@], [@ofile@])
break;]) break;])
# b4_symbol_actions(FILENAME, LINENO,
# SYMBOL-TAG, SYMBOL-NUM,
# SYMBOL-ACTION, SYMBOL-TYPENAME)
# -------------------------------------------------
m4_define([b4_symbol_actions],
[m4_pushdef([b4_dollar_dollar],
[m4_ifval([$6], [(yyvaluep->$6)], [(*yyvaluep)])])dnl
m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
case $4: /* $3 */
b4_syncline([$2], [$1])
$5;
b4_syncline([@oline@], [@ofile@])
break;
m4_popdef([b4_at_dollar])dnl
m4_popdef([b4_dollar_dollar])dnl
])
# b4_yydestruct_generate(FUNCTION-DECLARATOR) # b4_yydestruct_generate(FUNCTION-DECLARATOR)
# ------------------------------------------- # -------------------------------------------
@@ -446,8 +401,8 @@ b4_parse_param_use[]dnl
switch (yytype) switch (yytype)
{ {
]b4_symbol_foreach([b4_symbol_destructor])dnl ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
[ default: default:
break; break;
} }
}]dnl }]dnl
@@ -487,7 +442,7 @@ b4_parse_param_use[]dnl
# endif # endif
switch (yytype) switch (yytype)
{ {
]b4_symbol_foreach([b4_symbol_printer])dnl ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
[ default: [ default:
break; break;
} }
+163 -102
View File
@@ -1,8 +1,7 @@
-*- C -*- -*- C -*-
# GLR skeleton for Bison # GLR skeleton for Bison
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free # Copyright (C) 2002-2010 Free Software Foundation, Inc.
# 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
@@ -109,15 +108,7 @@ m4_define([b4_pure_formals],
# -------------------- # --------------------
# Expansion of $<TYPE>$. # Expansion of $<TYPE>$.
m4_define([b4_lhs_value], m4_define([b4_lhs_value],
[b4_symbol_value([(*yyvalp)], [$1])]) [((*yyvalp)[]m4_ifval([$1], [.$1]))])
# b4_rhs_data(RULE-LENGTH, NUM)
# -----------------------------
# Expand to the semantic stack place that contains value and location
# of symbol number NUM in a rule of length RULE-LENGTH.
m4_define([b4_rhs_data],
[((yyGLRStackItem const *)yyvsp)@{YYFILL (b4_subtract([$2], [$1]))@}.yystate])
# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
@@ -125,7 +116,7 @@ m4_define([b4_rhs_data],
# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
# symbols on RHS. # symbols on RHS.
m4_define([b4_rhs_value], m4_define([b4_rhs_value],
[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yysval], [$3])]) [(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))])
@@ -145,7 +136,7 @@ m4_define([b4_lhs_location],
# Expansion of @NUM, where the current rule has RULE-LENGTH symbols # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
# on RHS. # on RHS.
m4_define([b4_rhs_location], m4_define([b4_rhs_location],
[(b4_rhs_data([$1], [$2]).yyloc)]) [(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)])
@@ -158,7 +149,7 @@ m4_changecom()
m4_divert_push(0)dnl m4_divert_push(0)dnl
@output(b4_parser_file_name@)@ @output(b4_parser_file_name@)@
b4_copyright([Skeleton implementation for Bison GLR parsers in C], b4_copyright([Skeleton implementation for Bison GLR parsers in C],
[2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009]) [2002-2006, 2009-2010])
[ [
/* C GLR parser skeleton written by Paul Hilfinger. */ /* C GLR parser skeleton written by Paul Hilfinger. */
@@ -224,7 +215,7 @@ b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
/* Enabling traces. */ /* Enabling traces. */
#ifndef YYDEBUG #ifndef YYDEBUG
# define YYDEBUG ]b4_parse_trace_if([1], [0])[ # define YYDEBUG ]b4_debug_flag[
#endif #endif
/* Enabling verbose error messages. */ /* Enabling verbose error messages. */
@@ -232,7 +223,7 @@ b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
# undef YYERROR_VERBOSE # undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1 # define YYERROR_VERBOSE 1
#else #else
# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ # define YYERROR_VERBOSE ]b4_error_verbose_flag[
#endif #endif
/* Enabling the token table. */ /* Enabling the token table. */
@@ -256,7 +247,7 @@ b4_percent_code_get[]dnl
#include <string.h> #include <string.h>
#ifndef YY_ #ifndef YY_
# if YYENABLE_NLS # if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS # if ENABLE_NLS
# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
# define YY_(msgid) dgettext ("bison-runtime", msgid) # define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -318,7 +309,8 @@ b4_percent_code_get[]dnl
#ifndef __attribute__ #ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later. */ /* This feature is available in gcc versions 2.5 and later. */
# if (! defined __GNUC__ || __GNUC__ < 2 \ # if (! defined __GNUC__ || __GNUC__ < 2 \
|| (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) \
|| (defined __STRICT_ANSI__ && __STRICT_ANSI__))
# define __attribute__(Spec) /* empty */ # define __attribute__(Spec) /* empty */
# endif # endif
#endif #endif
@@ -367,6 +359,19 @@ static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
}; };
#if YYDEBUG #if YYDEBUG
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
YYRHS. */
static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
{
]b4_prhs[
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
{
]b4_rhs[
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const ]b4_int_type_for([b4_rline])[ yyrline[] = static const ]b4_int_type_for([b4_rline])[ yyrline[] =
{ {
@@ -383,10 +388,17 @@ static const char *const yytname[] =
}; };
#endif #endif
#define YYPACT_NINF ]b4_pact_ninf[ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
#define YYTABLE_NINF ]b4_table_ninf[ static const ]b4_int_type_for([b4_r1])[ yyr1[] =
{
]b4_r1[
};
]b4_parser_tables_define[ /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
static const ]b4_int_type_for([b4_r2])[ yyr2[] =
{
]b4_r2[
};
/* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */
static const ]b4_int_type_for([b4_dprec])[ yydprec[] = static const ]b4_int_type_for([b4_dprec])[ yydprec[] =
@@ -400,6 +412,44 @@ static const ]b4_int_type_for([b4_merger])[ yymerger[] =
]b4_merger[ ]b4_merger[
}; };
/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
doesn't specify something else to do. Zero means the default is an
error. */
static const ]b4_int_type_for([b4_defact])[ yydefact[] =
{
]b4_defact[
};
/* YYPDEFGOTO[NTERM-NUM]. */
static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
{
]b4_defgoto[
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
#define YYPACT_NINF ]b4_pact_ninf[
static const ]b4_int_type_for([b4_pact])[ yypact[] =
{
]b4_pact[
};
/* YYPGOTO[NTERM-NUM]. */
static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
{
]b4_pgoto[
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
#define YYTABLE_NINF ]b4_table_ninf[
static const ]b4_int_type_for([b4_table])[ yytable[] =
{
]b4_table[
};
/* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
list of conflicting reductions corresponding to action entry for list of conflicting reductions corresponding to action entry for
state STATE-NUM in yytable. 0 means no conflicts. The list in state STATE-NUM in yytable. 0 means no conflicts. The list in
@@ -418,6 +468,19 @@ dnl We probably ought to introduce a type for confl.
{ {
]b4_conflicting_rules[ ]b4_conflicting_rules[
}; };
static const ]b4_int_type_for([b4_check])[ yycheck[] =
{
]b4_check[
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const ]b4_int_type_for([b4_stos])[ yystos[] =
{
]b4_stos[
};
/* Prevent warning if -Wmissing-prototypes. */ /* Prevent warning if -Wmissing-prototypes. */
]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[ ]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[
@@ -500,12 +563,9 @@ static const int YYEMPTY = -2;
typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
#define YYCHK(YYE) \ #define YYCHK(YYE) \
do { \ do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \
YYRESULTTAG yyflag = YYE; \ while (YYID (0))
if (yyflag != yyok) \
return yyflag; \
} while (YYID (0))
#if YYDEBUG #if YYDEBUG
@@ -514,23 +574,23 @@ typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
# endif # endif
# define YYDPRINTF(Args) \ # define YYDPRINTF(Args) \
do { \ do { \
if (yydebug) \ if (yydebug) \
YYFPRINTF Args; \ YYFPRINTF Args; \
} while (YYID (0)) } while (YYID (0))
]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[ ]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
do { \ do { \
if (yydebug) \ if (yydebug) \
{ \ { \
YYFPRINTF (stderr, "%s ", Title); \ YYFPRINTF (stderr, "%s ", Title); \
yy_symbol_print (stderr, Type, \ yy_symbol_print (stderr, Type, \
Value]b4_locations_if([, Location])[]b4_user_args[); \ Value]b4_locations_if([, Location])[]b4_user_args[); \
YYFPRINTF (stderr, "\n"); \ YYFPRINTF (stderr, "\n"); \
} \ } \
} while (YYID (0)) } while (YYID (0))
/* Nonzero means print parse trace. It is left uninitialized so that /* Nonzero means print parse trace. It is left uninitialized so that
multiple parsers can coexist. */ multiple parsers can coexist. */
@@ -953,15 +1013,17 @@ yylhsNonterm (yyRuleNum yyrule)
return yyr1[yyrule]; return yyr1[yyrule];
} }
#define yypact_value_is_default(yystate) \ #define yyis_pact_ninf(yystate) \
]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf])[ ]m4_if(m4_eval(b4_pact_ninf < b4_pact_min), [1],
[0],
[((yystate) == YYPACT_NINF)])[
/** True iff LR state STATE has only a default reduction (regardless /** True iff LR state STATE has only a default reduction (regardless
* of token). */ * of token). */
static inline yybool static inline yybool
yyisDefaultedState (yyStateNum yystate) yyisDefaultedState (yyStateNum yystate)
{ {
return yypact_value_is_default (yypact[yystate]); return yyis_pact_ninf (yypact[yystate]);
} }
/** The default reduction for STATE, assuming it has one. */ /** The default reduction for STATE, assuming it has one. */
@@ -971,8 +1033,10 @@ yydefaultAction (yyStateNum yystate)
return yydefact[yystate]; return yydefact[yystate];
} }
#define yytable_value_is_error(yytable_value) \ #define yyis_table_ninf(yytable_value) \
]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[ ]m4_if(m4_eval(b4_table_ninf < b4_table_min), [1],
[YYID (0)],
[((yytable_value) == YYTABLE_NINF)])[
/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN. /** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN.
* Result R means * Result R means
@@ -987,13 +1051,12 @@ yygetLRActions (yyStateNum yystate, int yytoken,
int* yyaction, const short int** yyconflicts) int* yyaction, const short int** yyconflicts)
{ {
int yyindex = yypact[yystate] + yytoken; int yyindex = yypact[yystate] + yytoken;
if (yypact_value_is_default (yypact[yystate]) if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
|| yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken)
{ {
*yyaction = -yydefact[yystate]; *yyaction = -yydefact[yystate];
*yyconflicts = yyconfl; *yyconflicts = yyconfl;
} }
else if (! yytable_value_is_error (yytable[yyindex])) else if (! yyis_table_ninf (yytable[yyindex]))
{ {
*yyaction = yytable[yyindex]; *yyaction = yytable[yyindex];
*yyconflicts = yyconfl + yyconflp[yyindex]; *yyconflicts = yyconfl + yyconflp[yyindex];
@@ -1008,7 +1071,8 @@ yygetLRActions (yyStateNum yystate, int yytoken,
static inline yyStateNum static inline yyStateNum
yyLRgotoState (yyStateNum yystate, yySymbol yylhs) yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
{ {
int yyr = yypgoto[yylhs - YYNTOKENS] + yystate; int yyr;
yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
return yytable[yyr]; return yytable[yyr];
else else
@@ -1049,11 +1113,11 @@ yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState)
* stack #K of *STACKP. */ * stack #K of *STACKP. */
static void static void
yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate, yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate,
yyGLRState* yyrhs, yyRuleNum yyrule) yyGLRState* rhs, yyRuleNum yyrule)
{ {
yySemanticOption* yynewOption = yySemanticOption* yynewOption =
&yynewGLRStackItem (yystackp, yyfalse)->yyoption; &yynewGLRStackItem (yystackp, yyfalse)->yyoption;
yynewOption->yystate = yyrhs; yynewOption->yystate = rhs;
yynewOption->yyrule = yyrule; yynewOption->yyrule = yyrule;
if (yystackp->yytops.yylookaheadNeeds[yyk]) if (yystackp->yytops.yylookaheadNeeds[yyk])
{ {
@@ -1284,7 +1348,7 @@ yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
* semantic value of YYRHS under the action for YYRULE. */ * semantic value of YYRHS under the action for YYRULE. */
static inline void static inline void
yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule) size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
{ {
yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate; yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
@@ -1296,7 +1360,7 @@ yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
yystackp->yytops.yystates[yyk] = yynewState; yystackp->yytops.yystates[yyk] = yynewState;
/* Invokes YY_RESERVE_GLRSTACK. */ /* Invokes YY_RESERVE_GLRSTACK. */
yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule); yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule);
} }
/** Pop the symbols consumed by reduction #RULE from the top of stack /** Pop the symbols consumed by reduction #RULE from the top of stack
@@ -1314,12 +1378,12 @@ yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
if (yystackp->yysplitPoint == NULL) if (yystackp->yysplitPoint == NULL)
{ {
/* Standard special case: single stack. */ /* Standard special case: single stack. */
yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
YYASSERT (yyk == 0); YYASSERT (yyk == 0);
yystackp->yynextFree -= yynrhs; yystackp->yynextFree -= yynrhs;
yystackp->yyspaceLeft += yynrhs; yystackp->yyspaceLeft += yynrhs;
yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate; yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate;
return yyuserAction (yyrule, yynrhs, yyrhs, return yyuserAction (yyrule, yynrhs, rhs,
yyvalp, yylocp, yystackp]b4_user_args[); yyvalp, yylocp, yystackp]b4_user_args[);
} }
else else
@@ -1362,7 +1426,8 @@ do { \
`----------------------------------------------------------*/ `----------------------------------------------------------*/
/*ARGSUSED*/ static inline void /*ARGSUSED*/ static inline void
yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule]b4_user_formals[) yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
{ {
int yynrhs = yyrhsLength (yyrule); int yynrhs = yyrhsLength (yyrule);
yybool yynormal __attribute__ ((__unused__)) = yybool yynormal __attribute__ ((__unused__)) =
@@ -1370,6 +1435,8 @@ yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule]b4_user_form
yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
int yylow = 1; int yylow = 1;
int yyi; int yyi;
YYUSE (yyvalp);
YYUSE (yylocp);
]b4_parse_param_use[]dnl ]b4_parse_param_use[]dnl
[ YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n", [ YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
(unsigned long int) yyk, yyrule - 1, (unsigned long int) yyk, yyrule - 1,
@@ -1378,8 +1445,7 @@ yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule]b4_user_form
for (yyi = 0; yyi < yynrhs; yyi++) for (yyi = 0; yyi < yynrhs; yyi++)
{ {
YYFPRINTF (stderr, " $%d = ", yyi + 1); YYFPRINTF (stderr, " $%d = ", yyi + 1);
yy_symbol_print (stderr, yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
]yystos@{b4_rhs_data(yynrhs, yyi + 1).yylrState@}[,
&]b4_rhs_value(yynrhs, yyi + 1)[ &]b4_rhs_value(yynrhs, yyi + 1)[
]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
b4_user_args[); b4_user_args[);
@@ -1410,7 +1476,7 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
YYSTYPE yysval; YYSTYPE yysval;
YYLTYPE yyloc; YYLTYPE yyloc;
YY_REDUCE_PRINT ((yystackp, yyk, yyrule]b4_user_args[)); YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval, &yyloc]b4_user_args[));
YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval, YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval,
&yyloc]b4_user_args[)); &yyloc]b4_user_args[));
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc); YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc);
@@ -1708,11 +1774,11 @@ yyreportTree (yySemanticOption* yyx, int yyindent)
{ {
if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn) if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "", YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
yytokenName (yystos[yystates[yyi-1]->yylrState])); yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]));
else else
YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "", YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "",
yytokenName (yystos[yystates[yyi-1]->yylrState]), yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]),
(unsigned long int) (yystates[yyi-1]->yyposn + 1), (unsigned long int) (yystates[yyi - 1]->yyposn + 1),
(unsigned long int) yystates[yyi]->yyposn); (unsigned long int) yystates[yyi]->yyposn);
} }
else else
@@ -2039,58 +2105,51 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
yybool yysize_overflow = yyfalse; yybool yysize_overflow = yyfalse;
char* yymsg = NULL; char* yymsg = NULL;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
/* Internationalized format string. */
const char *yyformat = 0;
/* Arguments of yyformat. */
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
int yyx;
char *yyfmt;
char const *yyf;
static char const yyunexpected[] = "syntax error, unexpected %s";
static char const yyexpecting[] = ", expecting %s";
static char const yyor[] = " or %s";
char yyformat[sizeof yyunexpected
+ sizeof yyexpecting - 1
+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
* (sizeof yyor - 1))];
char const *yyprefix = yyexpecting;
/* Start YYX at -YYN if negative to avoid negative indexes in /* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. In other words, skip the first -YYN actions for this YYCHECK. */
state because they are default actions. */
int yyxbegin = yyn < 0 ? -yyn : 0; int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */ /* Stay within bounds of both yycheck and yytname. */
int yychecklim = YYLAST - yyn + 1; int yychecklim = YYLAST - yyn + 1;
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
int yycount = 1;
/* Number of reported tokens (one for the "unexpected", one per yyarg[0] = yytokenName (yytoken);
"expected"). */ yyfmt = yystpcpy (yyformat, yyunexpected);
int yycount = 0;
int yyx;
yyarg[yycount++] = yytokenName (yytoken);
for (yyx = yyxbegin; yyx < yyxend; ++yyx) for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
&& !yytable_value_is_error (yytable[yyx + yyn]))
{ {
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
{ {
yycount = 1; yycount = 1;
yysize = yysize0; yysize = yysize0;
yyformat[sizeof yyunexpected - 1] = '\0';
break; break;
} }
yyarg[yycount++] = yytokenName (yyx); yyarg[yycount++] = yytokenName (yyx);
yysize1 = yysize + yytnamerr (NULL, yytokenName (yyx)); yysize1 = yysize + yytnamerr (NULL, yytokenName (yyx));
yysize_overflow |= yysize1 < yysize; yysize_overflow |= yysize1 < yysize;
yysize = yysize1; yysize = yysize1;
yyfmt = yystpcpy (yyfmt, yyprefix);
yyprefix = yyor;
} }
switch (yycount) yyf = YY_(yyformat);
{ yysize1 = yysize + strlen (yyf);
#define YYCASE_(N, S) \
case N: \
yyformat = S; \
break
YYCASE_(1, YY_("syntax error, unexpected %s"));
YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
#undef YYCASE_
}
yysize1 = yysize + strlen (yyformat);
yysize_overflow |= yysize1 < yysize; yysize_overflow |= yysize1 < yysize;
yysize = yysize1; yysize = yysize1;
@@ -2101,17 +2160,17 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
{ {
char *yyp = yymsg; char *yyp = yymsg;
int yyi = 0; int yyi = 0;
while ((*yyp = *yyformat)) while ((*yyp = *yyf))
{ {
if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
{ {
yyp += yytnamerr (yyp, yyarg[yyi++]); yyp += yytnamerr (yyp, yyarg[yyi++]);
yyformat += 2; yyf += 2;
} }
else else
{ {
yyp++; yyp++;
yyformat++; yyf++;
} }
} }
yyerror (]b4_lyyerror_args[yymsg); yyerror (]b4_lyyerror_args[yymsg);
@@ -2173,7 +2232,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
} }
yyj = yypact[yystackp->yytops.yystates[0]->yylrState]; yyj = yypact[yystackp->yytops.yystates[0]->yylrState];
if (yypact_value_is_default (yyj)) if (yyis_pact_ninf (yyj))
return; return;
yyj += yytoken; yyj += yytoken;
if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken) if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken)
@@ -2181,7 +2240,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
if (yydefact[yystackp->yytops.yystates[0]->yylrState] != 0) if (yydefact[yystackp->yytops.yystates[0]->yylrState] != 0)
return; return;
} }
else if (! yytable_value_is_error (yytable[yyj])) else if (yytable[yyj] != 0 && ! yyis_table_ninf (yytable[yyj]))
return; return;
} }
@@ -2202,7 +2261,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
{ {
yyGLRState *yys = yystackp->yytops.yystates[0]; yyGLRState *yys = yystackp->yytops.yystates[0];
yyj = yypact[yys->yylrState]; yyj = yypact[yys->yylrState];
if (! yypact_value_is_default (yyj)) if (! yyis_pact_ninf (yyj))
{ {
yyj += YYTERROR; yyj += YYTERROR;
if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
@@ -2264,7 +2323,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
yychar = YYEMPTY; yychar = YYEMPTY;
yylval = yyval_default; yylval = yyval_default;
]b4_locations_if([ ]b4_locations_if([
#if YYLTYPE_IS_TRIVIAL #if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
yylloc.first_line = yylloc.last_line = ]b4_location_initial_line[; yylloc.first_line = yylloc.last_line = ]b4_location_initial_line[;
yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[; yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[;
#endif #endif
@@ -2570,7 +2629,9 @@ yypdumpstack (yyGLRStack* yystackp)
YYFPRINTF (stderr, "\n"); YYFPRINTF (stderr, "\n");
} }
#endif #endif
]b4_epilogue[]dnl ]
b4_epilogue
dnl dnl
dnl glr.cc produces its own header. dnl glr.cc produces its own header.
dnl dnl
@@ -2578,7 +2639,7 @@ m4_if(b4_skeleton, ["glr.c"],
[b4_defines_if( [b4_defines_if(
[@output(b4_spec_defines_file@)@ [@output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison GLR parsers in C], b4_copyright([Skeleton interface for Bison GLR parsers in C],
[2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009]) [2002-2006, 2009-2010])
b4_shared_declarations b4_shared_declarations
@@ -2588,5 +2649,5 @@ b4_pure_if([],
b4_locations_if([b4_pure_if([], b4_locations_if([b4_pure_if([],
[extern YYLTYPE ]b4_prefix[lloc;]) [extern YYLTYPE ]b4_prefix[lloc;])
]) ])
])])[]dnl ])])
m4_divert_pop(0) m4_divert_pop(0)
+42 -13
View File
@@ -1,6 +1,7 @@
-*- C -*-
# C++ GLR skeleton for Bison # C++ GLR skeleton for Bison
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Copyright (C) 2002-2010 Free Software Foundation, Inc.
# 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
@@ -27,7 +28,7 @@
# #
# The additional arguments are stored as members of the parser # The additional arguments are stored as members of the parser
# object, yyparser. The C routines need to carry yyparser # object, yyparser. The C routines need to carry yyparser
# throughout the C parser; that's easy: make yyparser an # throughout the C parser; that easy: just let yyparser become an
# additional parse-param. But because the C++ skeleton needs to # additional parse-param. But because the C++ skeleton needs to
# know the "real" original parse-param, we save them # know the "real" original parse-param, we save them
# (b4_parse_param_orig). Note that b4_parse_param is overquoted # (b4_parse_param_orig). Note that b4_parse_param is overquoted
@@ -37,14 +38,14 @@
# The locations # The locations
# #
# We use location.cc just like lalr1.cc, but because glr.c stores # We use location.cc just like lalr1.cc, but because glr.c stores
# the locations in a union, the position and location classes # the locations in a (C++) union, the position and location classes
# must not have a constructor. Therefore, contrary to lalr1.cc, we # must not have a constructor. Therefore, contrary to lalr1.cc, we
# must not define "b4_location_constructors". As a consequence the # must not define "b4_location_constructors". As a consequence the
# 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 using locations. # We require a pure interface using locations.
m4_define([b4_percent_define(locations)], []) m4_define([b4_locations_flag], [1])
m4_define([b4_pure_flag], [1]) m4_define([b4_pure_flag], [1])
# The header is mandatory. # The header is mandatory.
@@ -123,7 +124,8 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
]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], [
:])[ :])[
#if YYDEBUG #if YYDEBUG
]m4_ifset([b4_parse_param], [ ], [ :])[yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[ ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
#endif]b4_parse_param_cons[ #endif]b4_parse_param_cons[
{ {
} }
@@ -152,7 +154,7 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
YYUSE (yylocationp); YYUSE (yylocationp);
switch (yytype) switch (yytype)
{ {
]b4_symbol_foreach([b4_symbol_printer])dnl ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
[ default: [ default:
break; break;
} }
@@ -186,18 +188,19 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
]b4_parser_class_name[::debug_level_type ]b4_parser_class_name[::debug_level_type
]b4_parser_class_name[::debug_level () const ]b4_parser_class_name[::debug_level () const
{ {
return yydebug; return yydebug_;
} }
void void
]b4_parser_class_name[::set_debug_level (debug_level_type l) ]b4_parser_class_name[::set_debug_level (debug_level_type l)
{ {
yydebug = l; yydebug_ = l;
} }
#endif #endif
]m4_popdef([b4_parse_param])dnl ]m4_popdef([b4_parse_param])dnl
b4_namespace_close[ b4_namespace_close[
]]) ]])
@@ -215,7 +218,7 @@ m4_popdef([b4_parse_param])
m4_divert_push(0) m4_divert_push(0)
@output(b4_spec_defines_file@)@ @output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison GLR parsers in C++], b4_copyright([Skeleton interface for Bison GLR parsers in C++],
[2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009])[ [2002-2006, 2009-2010])[
/* C++ GLR parser skeleton written by Akim Demaille. */ /* C++ GLR parser skeleton written by Akim Demaille. */
@@ -228,7 +231,7 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
#include <iostream> #include <iostream>
/* Using locations. */ /* Using locations. */
#define YYLSP_NEEDED ]b4_locations_if([1], [0])[ #define YYLSP_NEEDED ]b4_locations_flag[
]b4_namespace_open[ ]b4_namespace_open[
class position; class position;
@@ -239,7 +242,7 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
/* Enabling traces. */ /* Enabling traces. */
#ifndef YYDEBUG #ifndef YYDEBUG
# define YYDEBUG ]b4_parse_trace_if([1], [0])[ # define YYDEBUG ]b4_debug_flag[
#endif #endif
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
@@ -266,7 +269,28 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
class ]b4_parser_class_name[ class ]b4_parser_class_name[
{ {
public: public:
]b4_public_types_declare[ /// Symbol semantic values.
#ifndef YYSTYPE
]m4_ifdef([b4_stype],
[ union semantic_type
{
b4_user_stype
};],
[m4_if(b4_tag_seen_flag, 0,
[[ typedef int semantic_type;]],
[[ typedef YYSTYPE semantic_type;]])])[
#else
typedef YYSTYPE semantic_type;
#endif
/// Symbol locations.
typedef ]b4_percent_define_get([[location_type]])[ location_type;
/// Tokens.
struct token
{
]b4_token_enums(b4_tokens)[
};
/// Token type.
typedef token::yytokentype token_type;
/// Build a parser object. /// Build a parser object.
]b4_parser_class_name[ (]b4_parse_param_decl[); ]b4_parser_class_name[ (]b4_parse_param_decl[);
@@ -288,11 +312,14 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
/// Set the current debugging level. /// Set the current debugging level.
void set_debug_level (debug_level_type l); void set_debug_level (debug_level_type l);
private:
public: public:
/// Report a syntax error. /// 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 (const location_type& loc, const std::string& msg); virtual void error (const location_type& loc, const std::string& msg);
private:
#if YYDEBUG #if YYDEBUG
public: public:
@@ -312,9 +339,11 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
const location_type* yylocationp); const location_type* yylocationp);
private: private:
/* Debugging. */ /* Debugging. */
int yydebug_;
std::ostream* yycdebug_; std::ostream* yycdebug_;
#endif #endif
/// \brief Reclaim the memory associated to a symbol. /// \brief Reclaim the memory associated to a symbol.
/// \param yymsg Why this token is reclaimed. /// \param yymsg Why this token is reclaimed.
/// \param yytype The symbol type. /// \param yytype The symbol type.
+1 -1
View File
@@ -1,7 +1,7 @@
-*- Autoconf -*- -*- Autoconf -*-
# Java skeleton dispatching for Bison. # Java skeleton dispatching for Bison.
# Copyright (C) 2007, 2009 Free Software Foundation, Inc. # Copyright (C) 2007, 2009-2010 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
+35 -59
View File
@@ -2,7 +2,7 @@
# Java language support for Bison # Java language support for Bison
# Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. # Copyright (C) 2007-2010 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,7 +29,7 @@ m4_define([b4_comment], [/* m4_bpatsubst([$1], [
# -------------------------- # --------------------------
# 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])
# b4_percent_define_get3(DEF, PRE, POST, NOT) # b4_percent_define_get3(DEF, PRE, POST, NOT)
@@ -37,8 +37,8 @@ m4_define([b4_list2],
# Expand to the value of DEF surrounded by PRE and POST if it's %define'ed, # Expand to the value of DEF surrounded by PRE and POST if it's %define'ed,
# otherwise NOT. # otherwise NOT.
m4_define([b4_percent_define_get3], m4_define([b4_percent_define_get3],
[m4_ifval(m4_quote(b4_percent_define_get([$1])), [m4_ifval(m4_quote(b4_percent_define_get([$1])),
[$2[]b4_percent_define_get([$1])[]$3], [$4])]) [$2[]b4_percent_define_get([$1])[]$3], [$4])])
@@ -103,7 +103,7 @@ m4_define([b4_identification],
m4_define([b4_int_type], m4_define([b4_int_type],
[m4_if(b4_ints_in($@, [-128], [127]), [1], [byte], [m4_if(b4_ints_in($@, [-128], [127]), [1], [byte],
b4_ints_in($@, [-32768], [32767]), [1], [short], b4_ints_in($@, [-32768], [32767]), [1], [short],
[int])]) [int])])
# b4_int_type_for(NAME) # b4_int_type_for(NAME)
# --------------------- # ---------------------
@@ -117,27 +117,6 @@ m4_define([b4_int_type_for],
m4_define([b4_null], [null]) m4_define([b4_null], [null])
# b4_typed_parser_table_define(TYPE, NAME, DATA, COMMENT)
# -------------------------------------------------------
m4_define([b4_typed_parser_table_define],
[m4_ifval([$4], [b4_comment([$4])
])dnl
[private static final ]$1[ yy$2_[] = yy$2_init();
private static final ]$1[[] yy$2_init()
{
return new ]$1[[]
{
]$3[
};
}]])
# b4_integral_parser_table_define(NAME, DATA, COMMENT)
#-----------------------------------------------------
m4_define([b4_integral_parser_table_define],
[b4_typed_parser_table_define([b4_int_type_for([$2])], [$1], [$2], [$3])])
## ------------------------- ## ## ------------------------- ##
## Assigning token numbers. ## ## Assigning token numbers. ##
## ------------------------- ## ## ------------------------- ##
@@ -146,8 +125,8 @@ m4_define([b4_integral_parser_table_define],
# --------------------------------------- # ---------------------------------------
# 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],
[ /** Token number, to be returned by the scanner. */ [ /** Token number, to be returned by the scanner. */
static final int b4_percent_define_get([api.tokens.prefix])$1 = $2; public static final int $1 = $2;
]) ])
@@ -175,27 +154,24 @@ m4_define([b4_case], [ case $1:
## ---------------- ## ## ---------------- ##
m4_define([b4_yystype], [b4_percent_define_get([[stype]])]) m4_define([b4_yystype], [b4_percent_define_get([[stype]])])
b4_percent_define_default([[stype]], [[Object]]) b4_percent_define_default([[stype]], [[Object]])])
# %name-prefix # %name-prefix
m4_define_default([b4_prefix], [[YY]]) m4_define_default([b4_prefix], [[YY]])
b4_percent_define_default([[parser_class_name]], [b4_prefix[]Parser]) b4_percent_define_default([[parser_class_name]], [b4_prefix[]Parser])])
m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])])
b4_percent_define_default([[lex_throws]], [[java.io.IOException]]) b4_percent_define_default([[lex_throws]], [[java.io.IOException]])])
m4_define([b4_lex_throws], [b4_percent_define_get([[lex_throws]])]) m4_define([b4_lex_throws], [b4_percent_define_get([[lex_throws]])])
b4_percent_define_default([[throws]], []) b4_percent_define_default([[throws]], [])])
m4_define([b4_throws], [b4_percent_define_get([[throws]])]) m4_define([b4_throws], [b4_percent_define_get([[throws]])])
b4_percent_define_default([[init_throws]], []) b4_percent_define_default([[location_type]], [Location])])
m4_define([b4_init_throws], [b4_percent_define_get([[init_throws]])])
b4_percent_define_default([[location_type]], [Location])
m4_define([b4_location_type], [b4_percent_define_get([[location_type]])]) m4_define([b4_location_type], [b4_percent_define_get([[location_type]])])
b4_percent_define_default([[position_type]], [Position]) b4_percent_define_default([[position_type]], [Position])])
m4_define([b4_position_type], [b4_percent_define_get([[position_type]])]) m4_define([b4_position_type], [b4_percent_define_get([[position_type]])])
@@ -242,21 +218,21 @@ m4_define([b4_rhs_location],
# it to be single quoted. Same for b4_parse_param. # it to be single quoted. Same for b4_parse_param.
# TODO: should be in bison.m4 # TODO: should be in bison.m4
m4_define_default([b4_lex_param], [[]]) m4_define_default([b4_lex_param], [[]]))
m4_define([b4_lex_param], b4_lex_param) m4_define([b4_lex_param], b4_lex_param))
m4_define([b4_parse_param], b4_parse_param) m4_define([b4_parse_param], b4_parse_param))
# b4_lex_param_decl # b4_lex_param_decl
# ----------------- # -------------------
# Extra formal arguments of the constructor. # Extra formal arguments of the constructor.
m4_define([b4_lex_param_decl], m4_define([b4_lex_param_decl],
[m4_ifset([b4_lex_param], [m4_ifset([b4_lex_param],
[b4_remove_comma([$1], [b4_remove_comma([$1],
b4_param_decls(b4_lex_param))], b4_param_decls(b4_lex_param))],
[$1])]) [$1])])
m4_define([b4_param_decls], m4_define([b4_param_decls],
[m4_map([b4_param_decl], [$@])]) [m4_map([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($@)])
@@ -269,21 +245,21 @@ m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)])
m4_define([b4_parse_param_decl], m4_define([b4_parse_param_decl],
[m4_ifset([b4_parse_param], [m4_ifset([b4_parse_param],
[b4_remove_comma([$1], [b4_remove_comma([$1],
b4_param_decls(b4_parse_param))], b4_param_decls(b4_parse_param))],
[$1])]) [$1])])
# b4_lex_param_call # b4_lex_param_call
# ----------------- # -------------------
# Delegating the lexer parameters to the lexer constructor. # Delegating the lexer parameters to the lexer constructor.
m4_define([b4_lex_param_call], m4_define([b4_lex_param_call],
[m4_ifset([b4_lex_param], [m4_ifset([b4_lex_param],
[b4_remove_comma([$1], [b4_remove_comma([$1],
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([b4_param_call], [$@])])
m4_define([b4_param_call], [, $2]) m4_define([b4_param_call], [, $2])
@@ -293,13 +269,13 @@ m4_define([b4_param_call], [, $2])
# Extra initialisations of the constructor. # Extra initialisations of the constructor.
m4_define([b4_parse_param_cons], m4_define([b4_parse_param_cons],
[m4_ifset([b4_parse_param], [m4_ifset([b4_parse_param],
[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([b4_constructor_call], [$@])])
m4_define([b4_constructor_call], m4_define([b4_constructor_call],
[this.$2 = $2; [this.$2 = $2;
]) ])
@@ -308,15 +284,15 @@ m4_define([b4_constructor_call],
# Extra instance variables. # Extra instance variables.
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_var_decls(b4_parse_param)])]) b4_var_decls(b4_parse_param)])])
m4_define([b4_var_decls], m4_define([b4_var_decls],
[m4_map_sep([b4_var_decl], [ [m4_map_sep([b4_var_decl], [
], [$@])]) ], [$@])])
m4_define([b4_var_decl], m4_define([b4_var_decl],
[ protected final $1;]) [ protected final $1;])
@@ -324,4 +300,4 @@ m4_define([b4_var_decl],
# ----------------------- # -----------------------
# Expand to either an empty string or "throws THROWS". # Expand to either an empty string or "throws THROWS".
m4_define([b4_maybe_throws], m4_define([b4_maybe_throws],
[m4_ifval($1, [throws $1])]) [m4_ifval($1, [throws $1])])
+643 -566
View File
File diff suppressed because it is too large Load Diff
+252 -225
View File
@@ -1,6 +1,6 @@
# Java skeleton for Bison -*- autoconf -*- # Java skeleton for Bison -*- autoconf -*-
# Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. # Copyright (C) 2007-2010 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,36 +17,26 @@
m4_include(b4_pkgdatadir/[java.m4]) 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])]) m4_ifval(m4_defn([b4_symbol_destructors]),
[b4_fatal([%s: %%destructor does not make sense in Java], [b4_skeleton])],
# We don't depend on %debug in Java, but pacify warnings about non-used flags. [])
b4_parse_trace_if([0], [0])
m4_define([b4_symbol_no_destructor_assert],
[b4_symbol_if([$1], [has_destructor],
[b4_fatal([%s: %s: %%destructor does not make sense in Java],
[b4_skeleton],
[b4_symbol_action_location([$1], [destructor])])])])
b4_symbol_foreach([b4_symbol_no_destructor_assert])
m4_divert_push(0)dnl m4_divert_push(0)dnl
@output(b4_parser_file_name@)@ @output(b4_parser_file_name@)@
b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java], b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
[2007, 2008, 2009]) [2007-2010])
b4_percent_define_ifdef([package], [package b4_percent_define_get([package]); b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
])[/* First part of user declarations. */ ])[/* First part of user declarations. */
]b4_user_pre_prologue ]b4_pre_prologue
b4_user_post_prologue
b4_percent_code_get([[imports]]) 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>.
* *
* @@author LALR (1) parser skeleton written by Paolo Bonzini. * @@author LALR (1) parser skeleton written by Paolo Bonzini.
*/ */
]b4_percent_define_get3([annotations], [], [ ])dnl ]b4_public_if([public ])dnl
b4_public_if([public ])dnl
b4_abstract_if([abstract ])dnl b4_abstract_if([abstract ])dnl
b4_final_if([final ])dnl b4_final_if([final ])dnl
b4_strictfp_if([strictfp ])dnl b4_strictfp_if([strictfp ])dnl
@@ -55,22 +45,9 @@ b4_percent_define_get3([extends], [ extends ])dnl
b4_percent_define_get3([implements], [ implements ])[ b4_percent_define_get3([implements], [ implements ])[
{ {
]b4_identification[ ]b4_identification[
]b4_error_verbose_if([[
/** True if verbose error messages are enabled. */ /** True if verbose error messages are enabled. */
private boolean yyErrorVerbose = true; public boolean errorVerbose = ]b4_flag_value([error_verbose]);
/**
* Return whether verbose error messages are enabled.
*/
public final boolean getErrorVerbose() { return yyErrorVerbose; }
/**
* Set the verbosity of error messages.
* @@param verbose True to request verbose error messages.
*/
public final void setErrorVerbose(boolean verbose)
{ yyErrorVerbose = verbose; }
]])
b4_locations_if([[ b4_locations_if([[
/** /**
@@ -116,6 +93,11 @@ b4_locations_if([[
]]) ]])
[ /** Token returned by the scanner to signal the end of its input. */
public static final int EOF = 0;]
b4_token_enums(b4_tokens)
b4_locations_if([[ b4_locations_if([[
private ]b4_location_type[ yylloc (YYStack rhs, int n) private ]b4_location_type[ yylloc (YYStack rhs, int n)
{ {
@@ -130,11 +112,6 @@ b4_locations_if([[
* parser <tt>]b4_parser_class_name[</tt>. * parser <tt>]b4_parser_class_name[</tt>.
*/ */
public interface Lexer { public interface Lexer {
/** Token returned by the scanner to signal the end of its input. */
public static final int EOF = 0;
]b4_token_enums(b4_tokens)[
]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. */
@@ -163,8 +140,8 @@ 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 s 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 s);]
} }
b4_lexer_if([[private class YYLexer implements Lexer { b4_lexer_if([[private class YYLexer implements Lexer {
@@ -180,9 +157,7 @@ b4_lexer_if([[
/** /**
* Instantiates the Bison-generated parser. * Instantiates the Bison-generated parser.
*/ */
public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) ]b4_maybe_throws([b4_init_throws])[ public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) {
{
]b4_percent_code_get([[init]])[
this.yylexer = new YYLexer(]b4_lex_param_call[); this.yylexer = new YYLexer(]b4_lex_param_call[);
]b4_parse_param_cons[ ]b4_parse_param_cons[
} }
@@ -192,9 +167,7 @@ b4_lexer_if([[
* Instantiates the Bison-generated parser. * Instantiates the Bison-generated parser.
* @@param yylexer The scanner that will supply tokens to the parser. * @@param yylexer The scanner that will supply tokens to the parser.
*/ */
b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) ]b4_maybe_throws([b4_init_throws])[ b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) {
{
]b4_percent_code_get([[init]])[
this.yylexer = yylexer; this.yylexer = yylexer;
]b4_parse_param_cons[ ]b4_parse_param_cons[
} }
@@ -228,35 +201,20 @@ b4_lexer_if([[
*/ */
public final void setDebugLevel(int level) { yydebug = level; } public final void setDebugLevel(int level) { yydebug = level; }
/** private final int yylex () ]b4_maybe_throws([b4_lex_throws]) [{
* Print an error message via the lexer. return yylexer.yylex ();
*]b4_locations_if([[ Use a <code>null</code> location.]])[
* @@param msg The error message.
*/
public final void yyerror (String msg)
{
yylexer.yyerror (]b4_locations_if([[(]b4_location_type[)null, ]])[msg);
} }
]b4_locations_if([[ protected final void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s) {
/** yylexer.yyerror (]b4_locations_if([loc, ])[s);
* Print an error message via the lexer.
* @@param loc The location associated with the message.
* @@param msg The error message.
*/
public final void yyerror (]b4_location_type[ loc, String msg)
{
yylexer.yyerror (loc, msg);
} }
/** ]b4_locations_if([
* Print an error message via the lexer. protected final void yyerror (String s) {
* @@param pos The position associated with the message. yylexer.yyerror ((]b4_location_type[)null, s);
* @@param msg The error message. }
*/ protected final void yyerror (]b4_position_type[ loc, String s) {
public final void yyerror (]b4_position_type[ pos, String msg) yylexer.yyerror (new ]b4_location_type[ (loc), s);
{ }])
yylexer.yyerror (new ]b4_location_type[ (pos), msg);
}]])
[protected final void yycdebug (String s) { [protected final void yycdebug (String s) {
if (yydebug > 0) if (yydebug > 0)
@@ -272,24 +230,24 @@ b4_lexer_if([[
public int height = -1; public int height = -1;
public final void push (int state, ]b4_yystype[ value]dnl public final void push (int state, ]b4_yystype[ value]dnl
b4_locations_if([, ]b4_location_type[ loc])[) { b4_locations_if([, ]b4_location_type[ loc])[) {
height++; height++;
if (size == height) if (size == height)
{ {
int[] newStateStack = new int[size * 2]; int[] newStateStack = new int[size * 2];
System.arraycopy (stateStack, 0, newStateStack, 0, height); System.arraycopy (stateStack, 0, newStateStack, 0, height);
stateStack = newStateStack; stateStack = newStateStack;
]b4_locations_if([[ ]b4_locations_if([[
]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2]; ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
System.arraycopy (locStack, 0, newLocStack, 0, height); System.arraycopy (locStack, 0, newLocStack, 0, height);
locStack = newLocStack;]]) locStack = newLocStack;]])
b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2]; b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
System.arraycopy (valueStack, 0, newValueStack, 0, height); System.arraycopy (valueStack, 0, newValueStack, 0, height);
valueStack = newValueStack; valueStack = newValueStack;
size *= 2; size *= 2;
} }
stateStack[height] = state; stateStack[height] = state;
]b4_locations_if([[locStack[height] = loc;]])[ ]b4_locations_if([[locStack[height] = loc;]])[
@@ -303,7 +261,7 @@ b4_lexer_if([[
public final void pop (int num) { public final void pop (int num) {
// Avoid memory leaks... garbage collection is a white lie! // Avoid memory leaks... garbage collection is a white lie!
if (num > 0) { if (num > 0) {
java.util.Arrays.fill (valueStack, height - num + 1, height, null); java.util.Arrays.fill (valueStack, height - num + 1, height, null);
]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height, null);]])[ ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height, null);]])[
} }
height -= num; height -= num;
@@ -328,8 +286,8 @@ b4_lexer_if([[
for (int i = 0; i < height; i++) for (int i = 0; i < height; i++)
{ {
out.print (' '); out.print (' ');
out.print (stateStack[i]); out.print (stateStack[i]);
} }
out.println (); out.println ();
} }
@@ -352,7 +310,8 @@ b4_lexer_if([[
/** /**
* Returned by a Bison action in order to print an error message and start * Returned by a Bison action in order to print an error message and start
* error recovery. */ * error recovery. Formally deprecated in Bison 2.4.2's NEWS entry, where
* a plan to phase it out is discussed. */
public static final int YYFAIL = 3; public static final int YYFAIL = 3;
private static final int YYNEWSTATE = 4; private static final int YYNEWSTATE = 4;
@@ -392,8 +351,8 @@ b4_lexer_if([[
switch (yyn) switch (yyn)
{ {
]b4_user_actions[ ]b4_user_actions[
default: break; default: break;
} }
yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[); yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[);
@@ -405,7 +364,7 @@ b4_lexer_if([[
yyn = yyr1_[yyn]; yyn = yyr1_[yyn];
int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0); int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
if (0 <= yystate && yystate <= yylast_ if (0 <= yystate && yystate <= yylast_
&& yycheck_[yystate] == yystack.stateAt (0)) && yycheck_[yystate] == yystack.stateAt (0))
yystate = yytable_[yystate]; yystate = yytable_[yystate];
else else
yystate = yydefgoto_[yyn - yyntokens_]; yystate = yydefgoto_[yyn - yyntokens_];
@@ -414,7 +373,6 @@ b4_lexer_if([[
return YYNEWSTATE; return YYNEWSTATE;
} }
]b4_error_verbose_if([[
/* Return YYSTR after stripping away unnecessary quotes and /* Return YYSTR after stripping away unnecessary quotes and
backslashes, so that it's suitable for yyerror. The heuristic is backslashes, so that it's suitable for yyerror. The heuristic is
that double-quoting is unnecessary unless the string contains an that double-quoting is unnecessary unless the string contains an
@@ -433,7 +391,7 @@ b4_lexer_if([[
break strip_quotes; break strip_quotes;
case '\\': case '\\':
if (yystr.charAt(++i) != '\\') if (yystr.charAt(++i) != '\\')
break strip_quotes; break strip_quotes;
/* Fall through. */ /* Fall through. */
default: default:
@@ -449,21 +407,20 @@ b4_lexer_if([[
return yystr; return yystr;
} }
]])[
/*--------------------------------. /*--------------------------------.
| Print this symbol on YYOUTPUT. | | Print this symbol on YYOUTPUT. |
`--------------------------------*/ `--------------------------------*/
private void yy_symbol_print (String s, int yytype, private void yy_symbol_print (String s, int yytype,
]b4_yystype[ yyvaluep]dnl ]b4_yystype[ yyvaluep]dnl
b4_locations_if([, Object yylocationp])[) b4_locations_if([, Object yylocationp])[)
{ {
if (yydebug > 0) if (yydebug > 0)
yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ") yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
+ yytname_[yytype] + " ("]b4_locations_if([ + yytname_[yytype] + " ("]b4_locations_if([
+ yylocationp + ": "])[ + yylocationp + ": "])[
+ (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")"); + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
} }
/** /**
@@ -521,7 +478,7 @@ m4_popdef([b4_at_dollar])])dnl
switch (label) switch (label)
{ {
/* New state. Unlike in the C/C++ skeletons, the state is already /* New state. Unlike in the C/C++ skeletons, the state is already
pushed when we come here. */ pushed when we come here. */
case YYNEWSTATE: case YYNEWSTATE:
yycdebug ("Entering state " + yystate + "\n"); yycdebug ("Entering state " + yystate + "\n");
if (yydebug > 0) if (yydebug > 0)
@@ -533,34 +490,34 @@ m4_popdef([b4_at_dollar])])dnl
/* Take a decision. First try without lookahead. */ /* Take a decision. First try without lookahead. */
yyn = yypact_[yystate]; yyn = yypact_[yystate];
if (yy_pact_value_is_default_ (yyn)) if (yyn == yypact_ninf_)
{ {
label = YYDEFAULT; label = YYDEFAULT;
break; break;
} }
/* Read a lookahead token. */ /* Read a lookahead token. */
if (yychar == yyempty_) if (yychar == yyempty_)
{ {
yycdebug ("Reading a token: "); yycdebug ("Reading a token: ");
yychar = yylexer.yylex ();] yychar = yylex ();]
b4_locations_if([[ b4_locations_if([[
yylloc = new ]b4_location_type[(yylexer.getStartPos (), yylloc = new ]b4_location_type[(yylexer.getStartPos (),
yylexer.getEndPos ());]]) yylexer.getEndPos ());]])
yylval = yylexer.getLVal ();[ yylval = yylexer.getLVal ();[
} }
/* Convert token to internal form. */ /* Convert token to internal form. */
if (yychar <= Lexer.EOF) if (yychar <= EOF)
{ {
yychar = yytoken = Lexer.EOF; yychar = yytoken = EOF;
yycdebug ("Now at end of input.\n"); yycdebug ("Now at end of input.\n");
} }
else else
{ {
yytoken = yytranslate_ (yychar); yytoken = yytranslate_ (yychar);
yy_symbol_print ("Next token is", yytoken, yy_symbol_print ("Next token is", yytoken,
yylval]b4_locations_if([, yylloc])[); yylval]b4_locations_if([, yylloc])[);
} }
/* If the proper action on seeing token YYTOKEN is to reduce or to /* If the proper action on seeing token YYTOKEN is to reduce or to
@@ -572,20 +529,20 @@ m4_popdef([b4_at_dollar])])dnl
/* <= 0 means reduce or error. */ /* <= 0 means reduce or error. */
else if ((yyn = yytable_[yyn]) <= 0) else if ((yyn = yytable_[yyn]) <= 0)
{ {
if (yy_table_value_is_error_ (yyn)) if (yyn == 0 || yyn == yytable_ninf_)
label = YYFAIL; label = YYFAIL;
else else
{ {
yyn = -yyn; yyn = -yyn;
label = YYREDUCE; label = YYREDUCE;
} }
} }
else else
{ {
/* Shift the lookahead token. */ /* Shift the lookahead token. */
yy_symbol_print ("Shifting", yytoken, yy_symbol_print ("Shifting", yytoken,
yylval]b4_locations_if([, yylloc])[); yylval]b4_locations_if([, yylloc])[);
/* Discard the token being shifted. */ /* Discard the token being shifted. */
yychar = yyempty_; yychar = yyempty_;
@@ -618,7 +575,7 @@ m4_popdef([b4_at_dollar])])dnl
case YYREDUCE: case YYREDUCE:
yylen = yyr2_[yyn]; yylen = yyr2_[yyn];
label = yyaction (yyn, yystack, yylen); label = yyaction (yyn, yystack, yylen);
yystate = yystack.stateAt (0); yystate = yystack.stateAt (0);
break; break;
/*------------------------------------. /*------------------------------------.
@@ -628,24 +585,24 @@ m4_popdef([b4_at_dollar])])dnl
/* If not already recovering from an error, report this error. */ /* If not already recovering from an error, report this error. */
if (yyerrstatus_ == 0) if (yyerrstatus_ == 0)
{ {
++yynerrs_; ++yynerrs_;
yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken)); yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken));
} }
]b4_locations_if([yyerrloc = yylloc;])[ ]b4_locations_if([yyerrloc = yylloc;])[
if (yyerrstatus_ == 3) if (yyerrstatus_ == 3)
{ {
/* If just tried and failed to reuse lookahead token after an /* If just tried and failed to reuse lookahead token after an
error, discard it. */ error, discard it. */
if (yychar <= Lexer.EOF) if (yychar <= EOF)
{ {
/* Return failure if at end of input. */ /* Return failure if at end of input. */
if (yychar == Lexer.EOF) if (yychar == EOF)
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
@@ -671,46 +628,46 @@ m4_popdef([b4_at_dollar])])dnl
| yyerrlab1 -- common code for both syntax error and YYERROR. | | yyerrlab1 -- common code for both syntax error and YYERROR. |
`-------------------------------------------------------------*/ `-------------------------------------------------------------*/
case YYERRLAB1: case YYERRLAB1:
yyerrstatus_ = 3; /* Each real token shifted decrements this. */ yyerrstatus_ = 3; /* Each real token shifted decrements this. */
for (;;) for (;;)
{ {
yyn = yypact_[yystate]; yyn = yypact_[yystate];
if (!yy_pact_value_is_default_ (yyn)) if (yyn != yypact_ninf_)
{ {
yyn += yyterror_; yyn += yyterror_;
if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
{ {
yyn = yytable_[yyn]; yyn = yytable_[yyn];
if (0 < yyn) if (0 < yyn)
break; break;
} }
} }
/* Pop the current state because it cannot handle the error token. */ /* Pop the current state because it cannot handle the error token. */
if (yystack.height == 1) if (yystack.height == 1)
return false; return false;
]b4_locations_if([yyerrloc = yystack.locationAt (0);])[ ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
yystack.pop (); yystack.pop ();
yystate = yystack.stateAt (0); yystate = yystack.stateAt (0);
if (yydebug > 0) if (yydebug > 0)
yystack.print (yyDebugStream); yystack.print (yyDebugStream);
} }
]b4_locations_if([ ]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);
yyloc = yylloc (yystack, 2); yyloc = yylloc (yystack, 2);
yystack.pop (2);])[ yystack.pop (2);])[
/* Shift the error token. */ /* Shift the error token. */
yy_symbol_print ("Shifting", yystos_[yyn], yy_symbol_print ("Shifting", yystos_[yyn],
yylval]b4_locations_if([, yyloc])[); yylval]b4_locations_if([, yyloc])[);
yystate = yyn; yystate = yyn;
yystack.push (yyn, yylval]b4_locations_if([, yyloc])[); yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
label = YYNEWSTATE; label = YYNEWSTATE;
break; break;
@@ -726,82 +683,149 @@ m4_popdef([b4_at_dollar])])dnl
// Generate an error message. // Generate an error message.
private String yysyntax_error (int yystate, int tok) private String yysyntax_error (int yystate, int tok)
{]b4_error_verbose_if([[ {
if (yyErrorVerbose) if (errorVerbose)
{ {
int yyn = yypact_[yystate]; int yyn = yypact_[yystate];
if (yypact_ninf_ < yyn && yyn <= yylast_) if (yypact_ninf_ < yyn && yyn <= yylast_)
{ {
StringBuffer res; StringBuffer res;
/* Start YYX at -YYN if negative to avoid negative indexes in /* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. In other words, skip the first -YYN actions for this YYCHECK. */
state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0;
int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */ /* Stay within bounds of both yycheck and yytname. */
int yychecklim = yylast_ - yyn + 1; int yychecklim = yylast_ - yyn + 1;
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
int count = 0; int count = 0;
for (int x = yyxbegin; x < yyxend; ++x) for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_ if (yycheck_[x + yyn] == x && x != yyterror_)
&& !yy_table_value_is_error_ (yytable_[x + yyn])) ++count;
++count;
// FIXME: This method of building the message is not compatible // FIXME: This method of building the message is not compatible
// with internationalization. // with internationalization.
res = new StringBuffer ("syntax error, unexpected "); res = new StringBuffer ("syntax error, unexpected ");
res.append (yytnamerr_ (yytname_[tok])); res.append (yytnamerr_ (yytname_[tok]));
if (count < 5) if (count < 5)
{ {
count = 0; count = 0;
for (int x = yyxbegin; x < yyxend; ++x) for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_ if (yycheck_[x + yyn] == x && x != yyterror_)
&& !yy_table_value_is_error_ (yytable_[x + yyn])) {
{ res.append (count++ == 0 ? ", expecting " : " or ");
res.append (count++ == 0 ? ", expecting " : " or "); res.append (yytnamerr_ (yytname_[x]));
res.append (yytnamerr_ (yytname_[x])); }
} }
} return res.toString ();
return res.toString ();
} }
} }
]])[
return "syntax error"; return "syntax error";
} }
/**
* Whether the given <code>yypact_</code> value indicates a defaulted state.
* @@param yyvalue the value to check
*/
private static boolean yy_pact_value_is_default_ (int yyvalue)
{
return yyvalue == yypact_ninf_;
}
/**
* Whether the given <code>yytable_</code> value indicates a syntax error.
* @@param yyvalue the value to check
*/
private static boolean yy_table_value_is_error_ (int yyvalue)
{
return yyvalue == yytable_ninf_;
}
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[; private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[;
private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[; private static final ]b4_int_type_for([b4_pact])[ yypact_[] =
{
]b4_pact[
};
]b4_parser_tables_define[ /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
]b4_integral_parser_table_define([token_number], [b4_toknum], doesn't specify something else to do. Zero means the default is an
[TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding error. */
to YYLEX-NUM.])[ private static final ]b4_int_type_for([b4_defact])[ yydefact_[] =
{
]b4_defact[
};
/* YYPGOTO[NTERM-NUM]. */
private static final ]b4_int_type_for([b4_pgoto])[ yypgoto_[] =
{
]b4_pgoto[
};
/* YYDEFGOTO[NTERM-NUM]. */
private static final ]b4_int_type_for([b4_defgoto])[
yydefgoto_[] =
{
]b4_defgoto[
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says. */
private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
private static final ]b4_int_type_for([b4_table])[
yytable_[] =
{
]b4_table[
};
/* YYCHECK. */
private static final ]b4_int_type_for([b4_check])[
yycheck_[] =
{
]b4_check[
};
/* STOS_[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
private static final ]b4_int_type_for([b4_stos])[
yystos_[] =
{
]b4_stos[
};
/* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
to YYLEX-NUM. */
private static final ]b4_int_type_for([b4_toknum])[
yytoken_number_[] =
{
]b4_toknum[
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
private static final ]b4_int_type_for([b4_r1])[
yyr1_[] =
{
]b4_r1[
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
private static final ]b4_int_type_for([b4_r2])[
yyr2_[] =
{
]b4_r2[
};
/* 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])[ private static final String yytname_[] =
{
]b4_tname[
};
]b4_integral_parser_table_define([rline], [b4_rline], /* YYRHS -- A `-1'-separated list of the rules' RHS. */
[YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ private static final ]b4_int_type_for([b4_rhs])[ yyrhs_[] =
{
]b4_rhs[
};
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
YYRHS. */
private static final ]b4_int_type_for([b4_prhs])[ yyprhs_[] =
{
]b4_prhs[
};
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
private static final ]b4_int_type_for([b4_rline])[ yyrline_[] =
{
]b4_rline[
};
// 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)
@@ -813,18 +837,21 @@ m4_popdef([b4_at_dollar])])dnl
int yynrhs = yyr2_[yyrule]; int yynrhs = yyr2_[yyrule];
/* Print the symbols being reduced, and their result. */ /* Print the symbols being reduced, and their result. */
yycdebug ("Reducing stack by rule " + (yyrule - 1) yycdebug ("Reducing stack by rule " + (yyrule - 1)
+ " (line " + yylno + "), "); + " (line " + yylno + "), ");
/* The symbols being reduced. */ /* The symbols being reduced. */
for (int yyi = 0; yyi < yynrhs; yyi++) for (int yyi = 0; yyi < yynrhs; yyi++)
yy_symbol_print (" $" + (yyi + 1) + " =", yy_symbol_print (" $" + (yyi + 1) + " =",
yystos_[yystack.stateAt(yyi + 1 - yynrhs)], yyrhs_[yyprhs_[yyrule] + yyi],
]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([, ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([,
b4_rhs_location(yynrhs, yyi + 1)])[); b4_rhs_location(yynrhs, yyi + 1)])[);
} }
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
]b4_integral_parser_table_define([translate_table], [b4_translate])[ private static final ]b4_int_type_for([b4_translate])[ yytranslate_table_[] =
{
]b4_translate[
};
private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t) private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
{ {
@@ -850,5 +877,5 @@ b4_percent_code_get[]dnl
} }
b4_epilogue[]dnl b4_epilogue
m4_divert_pop(0)dnl m4_divert_pop(0)dnl
-45
View File
@@ -1,45 +0,0 @@
## Copyright (C) 2002, 2005, 2006, 2007, 2008-2009 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/>.
dist_pkgdata_DATA = \
data/README \
data/bison.m4 \
data/c++-skel.m4 \
data/c++.m4 \
data/c-skel.m4 \
data/c.m4 \
data/glr.c \
data/glr.cc \
data/java-skel.m4 \
data/java.m4 \
data/lalr1.cc \
data/lalr1.java \
data/location.cc \
data/stack.hh \
data/variant.hh \
data/yacc.c
m4sugardir = $(pkgdatadir)/m4sugar
dist_m4sugar_DATA = \
data/m4sugar/foreach.m4 \
data/m4sugar/m4sugar.m4
xsltdir = $(pkgdatadir)/xslt
dist_xslt_DATA = \
data/xslt/bison.xsl \
data/xslt/xml2dot.xsl \
data/xslt/xml2text.xsl \
data/xslt/xml2xhtml.xsl
+17 -40
View File
@@ -1,7 +1,6 @@
# C++ skeleton for Bison # C++ skeleton for Bison
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Copyright (C) 2002-2007, 2009-2010 Free Software Foundation, Inc.
# 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,14 +15,12 @@
# 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, 2003, 2004, 2005, 2006, 2007, 2008, 2009])
# We do want M4 expansion after # for CPP macros. # We do want M4 expansion after # for CPP macros.
m4_changecom() m4_changecom()
m4_divert_push(0)dnl m4_divert_push(0)dnl
@output(b4_dir_prefix[]position.hh@)@ @output(b4_dir_prefix[]position.hh@)@
b4_copyright([Positions for Bison parsers in C++])[ b4_copyright([Positions for Bison parsers in C++],
[2002-2007, 2009-2010])[
/** /**
** \file position.hh ** \file position.hh
@@ -42,33 +39,29 @@ b4_copyright([Positions for Bison parsers in C++])[
class position class position
{ {
public: public:
]m4_ifdef([b4_location_constructors], [[ ]m4_ifdef([b4_location_constructors], [
/// Construct a position. /// Construct a position.
explicit position (]b4_percent_define_get([[filename_type]])[* f = 0, position ()
unsigned int l = ]b4_location_initial_line[u, : filename (0), line (]b4_location_initial_line[), column (]b4_location_initial_column[)
unsigned int c = ]b4_location_initial_column[u)
: filename (f)
, line (l)
, column (c)
{ {
} }
]])[ ])[
/// Initialization. /// Initialization.
inline void initialize (]b4_percent_define_get([[filename_type]])[* fn) inline void initialize (]b4_percent_define_get([[filename_type]])[* fn)
{ {
filename = fn; filename = fn;
line = ]b4_location_initial_line[u; line = ]b4_location_initial_line[;
column = ]b4_location_initial_column[u; column = ]b4_location_initial_column[;
} }
/** \name Line and Column related manipulators /** \name Line and Column related manipulators
** \{ */ ** \{ */
public:
/// (line related) Advance to the COUNT next lines. /// (line related) Advance to the COUNT next lines.
/// Set current column to initial value.
inline void lines (int count = 1) inline void lines (int count = 1)
{ {
column = ]b4_location_initial_column[u; column = ]b4_location_initial_column[;
line += count; line += count;
} }
@@ -79,6 +72,7 @@ b4_copyright([Positions for Bison parsers in C++])[
} }
/** \} */ /** \} */
public:
/// 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.
@@ -150,7 +144,8 @@ b4_copyright([Positions for Bison parsers in C++])[
]b4_namespace_close[ ]b4_namespace_close[
#endif // not BISON_POSITION_HH] #endif // not BISON_POSITION_HH]
@output(b4_dir_prefix[]location.hh@)@ @output(b4_dir_prefix[]location.hh@)@
b4_copyright([Locations for Bison parsers in C++])[ b4_copyright([Locations for Bison parsers in C++],
[2002-2007, 2009-2010])[
/** /**
** \file location.hh ** \file location.hh
@@ -171,26 +166,9 @@ b4_copyright([Locations for Bison parsers in C++])[
{ {
public: public:
]m4_ifdef([b4_location_constructors], [ ]m4_ifdef([b4_location_constructors], [
/// Construct a location from \a b to \a e. /// Construct a location.
location (const position& b, const position& e) location ()
: begin (b) : begin (), end ()
, end (e)
{
}
/// Construct a 0-width location in \a p.
explicit location (const position& p = position ())
: begin (p)
, end (p)
{
}
/// Construct a 0-width location in \a f, \a l, \a c.
explicit location (]b4_percent_define_get([[filename_type]])[* f,
unsigned int l = ]b4_location_initial_line[u,
unsigned int c = ]b4_location_initial_column[u)
: begin (f, l, c)
, end (f, l, c)
{ {
} }
@@ -294,5 +272,4 @@ b4_copyright([Locations for Bison parsers in C++])[
#endif // not BISON_LOCATION_HH] #endif // not BISON_LOCATION_HH]
m4_divert_pop(0) m4_divert_pop(0)
m4_popdef([b4_copyright_years])dnl
m4_changecom([#]) m4_changecom([#])
-1
View File
@@ -1 +0,0 @@
../../submodules/autoconf/lib/m4sugar/foreach.m4
+400
View File
@@ -0,0 +1,400 @@
# -*- Autoconf -*-
# This file is part of Autoconf.
# foreach-based replacements for recursive functions.
# Speeds up GNU M4 1.4.x by avoiding quadratic $@ recursion, but penalizes
# GNU M4 1.6 by requiring more memory and macro expansions.
#
# Copyright (C) 2008 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/>.
# As a special exception, the Free Software Foundation gives unlimited
# permission to copy, distribute and modify the configure scripts that
# are the output of Autoconf. You need not follow the terms of the GNU
# General Public License when using or distributing such scripts, even
# though portions of the text of Autoconf appear in them. The GNU
# General Public License (GPL) does govern all other use of the material
# that constitutes the Autoconf program.
#
# Certain portions of the Autoconf source text are designed to be copied
# (in certain cases, depending on the input) into the output of
# Autoconf. We call these the "data" portions. The rest of the Autoconf
# source text consists of comments plus executable code that decides which
# of the data portions to output in any given case. We call these
# comments and executable code the "non-data" portions. Autoconf never
# copies any of the non-data portions into its output.
#
# This special exception to the GPL applies to versions of Autoconf
# released by the Free Software Foundation. When you make and
# distribute a modified version of Autoconf, you may extend this special
# exception to the GPL to apply to your modified version as well, *unless*
# your modified version has the potential to copy into its output some
# of the text that was the non-data portion of the version that you started
# with. (In other words, unless your change moves or copies text from
# the non-data portions to the data portions.) If your modification has
# such potential, you must delete any notice of this special exception
# to the GPL from your modified version.
#
# Written by Eric Blake.
#
# In M4 1.4.x, every byte of $@ is rescanned. This means that an
# algorithm on n arguments that recurses with one less argument each
# iteration will scan n * (n + 1) / 2 arguments, for O(n^2) time. In
# M4 1.6, this was fixed so that $@ is only scanned once, then
# back-references are made to information stored about the scan.
# Thus, n iterations need only scan n arguments, for O(n) time.
# Additionally, in M4 1.4.x, recursive algorithms did not clean up
# memory very well, requiring O(n^2) memory rather than O(n) for n
# iterations.
#
# This file is designed to overcome the quadratic nature of $@
# recursion by writing a variant of m4_foreach that uses m4_for rather
# than $@ recursion to operate on the list. This involves more macro
# expansions, but avoids the need to rescan a quadratic number of
# arguments, making these replacements very attractive for M4 1.4.x.
# On the other hand, in any version of M4, expanding additional macros
# costs additional time; therefore, in M4 1.6, where $@ recursion uses
# fewer macros, these replacements actually pessimize performance.
# Additionally, the use of $10 to mean the tenth argument violates
# POSIX; although all versions of m4 1.4.x support this meaning, a
# future m4 version may switch to take it as the first argument
# concatenated with a literal 0, so the implementations in this file
# are not future-proof. Thus, this file is conditionally included as
# part of m4_init(), only when it is detected that M4 probably has
# quadratic behavior (ie. it lacks the macro __m4_version__).
#
# Please keep this file in sync with m4sugar.m4.
# m4_foreach(VARIABLE, LIST, EXPRESSION)
# --------------------------------------
# Expand EXPRESSION assigning each value of the LIST to VARIABLE.
# LIST should have the form `item_1, item_2, ..., item_n', i.e. the
# whole list must *quoted*. Quote members too if you don't want them
# to be expanded.
#
# This version minimizes the number of times that $@ is evaluated by
# using m4_for to generate a boilerplate into VARIABLE then passing $@
# to that temporary macro. Thus, the recursion is done in m4_for
# without reparsing any user input, and is not quadratic. For an idea
# of how this works, note that m4_foreach(i,[1,2],[i]) defines i to be
# m4_define([$1],[$3])$2[]m4_define([$1],[$4])$2[]m4_popdef([i])
# then calls i([i],[i],[1],[2]).
m4_define([m4_foreach],
[m4_if([$2], [], [], [_$0([$1], [$3], $2)])])
m4_define([_m4_foreach],
[m4_define([$1], m4_pushdef([$1])_m4_for([$1], [3], [$#], [1],
[$0_([1], [2], _m4_defn([$1]))])[m4_popdef([$1])])m4_indir([$1], $@)])
m4_define([_m4_foreach_],
[[m4_define([$$1], [$$3])$$2[]]])
# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT)
# -----------------------------------------------------------
# Find the first VAL that SWITCH matches, and expand the corresponding
# IF-VAL. If there are no matches, expand DEFAULT.
#
# Use m4_for to create a temporary macro in terms of a boilerplate
# m4_if with final cleanup. If $# is even, we have DEFAULT; if it is
# odd, then rounding the last $# up in the temporary macro is
# harmless. For example, both m4_case(1,2,3,4,5) and
# m4_case(1,2,3,4,5,6) result in the intermediate _m4_case being
# m4_if([$1],[$2],[$3],[$1],[$4],[$5],_m4_popdef([_m4_case])[$6])
m4_define([m4_case],
[m4_if(m4_eval([$# <= 2]), [1], [$2],
[m4_pushdef([_$0], [m4_if(]m4_for([_m4_count], [2], m4_decr([$#]), [2],
[_$0_([1], _m4_count, m4_incr(_m4_count))])[_m4_popdef(
[_$0])]m4_dquote($m4_eval([($# + 1) & ~1]))[)])_$0($@)])])
m4_define([_m4_case_],
[[[$$1],[$$2],[$$3],]])
# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT)
# -----------------------------------------------------
# m4 equivalent of
#
# if (SWITCH =~ RE1)
# VAL1;
# elif (SWITCH =~ RE2)
# VAL2;
# elif ...
# ...
# else
# DEFAULT
#
# We build the temporary macro _m4_b:
# m4_define([_m4_b], _m4_defn([_m4_bmatch]))_m4_b([$1], [$2], [$3])...
# _m4_b([$1], [$m-1], [$m])_m4_b([], [], [$m+1]_m4_popdef([_m4_b]))
# then invoke m4_unquote(_m4_b($@)), for concatenation with later text.
m4_define([m4_bmatch],
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
[$#], 2, [$2],
[m4_define([_m4_b], m4_pushdef([_m4_b])[m4_define([_m4_b],
_m4_defn([_$0]))]_m4_for([_m4_b], [3], m4_eval([($# + 1) / 2 * 2 - 1]),
[2], [_$0_([1], m4_decr(_m4_b), _m4_b)])[_m4_b([], [],]m4_dquote(
[$]m4_incr(_m4_b))[_m4_popdef([_m4_b]))])m4_unquote(_m4_b($@))])])
m4_define([_m4_bmatch],
[m4_if(m4_bregexp([$1], [$2]), [-1], [], [[$3]m4_define([$0])])])
m4_define([_m4_bmatch_],
[[_m4_b([$$1], [$$2], [$$3])]])
# m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT])
# -------------------------------------------------------------------
# Similar to m4_if, except that each TEST is expanded when encountered.
# If the expansion of TESTn matches the string VALn, the result is IF-VALn.
# The result is DEFAULT if no tests passed. This macro allows
# short-circuiting of expensive tests, where it pays to arrange quick
# filter tests to run first.
#
# m4_cond already guarantees either 3*n or 3*n + 1 arguments, 1 <= n.
# We only have to speed up _m4_cond, by building the temporary _m4_c:
# m4_define([_m4_c], _m4_defn([m4_unquote]))_m4_c([m4_if(($1), [($2)],
# [[$3]m4_define([_m4_c])])])_m4_c([m4_if(($4), [($5)],
# [[$6]m4_define([_m4_c])])])..._m4_c([m4_if(($m-2), [($m-1)],
# [[$m]m4_define([_m4_c])])])_m4_c([[$m+1]]_m4_popdef([_m4_c]))
# We invoke m4_unquote(_m4_c($@)), for concatenation with later text.
m4_define([_m4_cond],
[m4_define([_m4_c], m4_pushdef([_m4_c])[m4_define([_m4_c],
_m4_defn([m4_unquote]))]_m4_for([_m4_c], [2], m4_eval([$# / 3 * 3 - 1]), [3],
[$0_(m4_decr(_m4_c), _m4_c, m4_incr(_m4_c))])[_m4_c(]m4_dquote(m4_dquote(
[$]m4_eval([$# / 3 * 3 + 1])))[_m4_popdef([_m4_c]))])m4_unquote(_m4_c($@))])
m4_define([_m4_cond_],
[[_m4_c([m4_if(($$1), [($$2)], [[$$3]m4_define([_m4_c])])])]])
# m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...)
# ----------------------------------------------------
# m4 equivalent of
#
# $_ = STRING;
# s/RE1/SUBST1/g;
# s/RE2/SUBST2/g;
# ...
#
# m4_bpatsubsts already validated an odd number of arguments; we only
# need to speed up _m4_bpatsubsts. To avoid nesting, we build the
# temporary _m4_p:
# m4_define([_m4_p], [$1])m4_define([_m4_p],
# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$2], [$3]))m4_define([_m4_p],
# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$4], [$5]))m4_define([_m4_p],...
# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$m-1], [$m]))m4_unquote(
# _m4_defn([_m4_p])_m4_popdef([_m4_p]))
m4_define([_m4_bpatsubsts],
[m4_define([_m4_p], m4_pushdef([_m4_p])[m4_define([_m4_p],
]m4_dquote([$]1)[)]_m4_for([_m4_p], [3], [$#], [2], [$0_(m4_decr(_m4_p),
_m4_p)])[m4_unquote(_m4_defn([_m4_p])_m4_popdef([_m4_p]))])_m4_p($@)])
m4_define([_m4_bpatsubsts_],
[[m4_define([_m4_p],
m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$$1], [$$2]))]])
# m4_shiftn(N, ...)
# -----------------
# Returns ... shifted N times. Useful for recursive "varargs" constructs.
#
# m4_shiftn already validated arguments; we only need to speed up
# _m4_shiftn. If N is 3, then we build the temporary _m4_s, defined as
# ,[$5],[$6],...,[$m]_m4_popdef([_m4_s])
# before calling m4_shift(_m4_s($@)).
m4_define([_m4_shiftn],
[m4_if(m4_incr([$1]), [$#], [], [m4_define([_m4_s],
m4_pushdef([_m4_s])_m4_for([_m4_s], m4_eval([$1 + 2]), [$#], [1],
[[,]m4_dquote([$]_m4_s)])[_m4_popdef([_m4_s])])m4_shift(_m4_s($@))])])
# m4_do(STRING, ...)
# ------------------
# This macro invokes all its arguments (in sequence, of course). It is
# useful for making your macros more structured and readable by dropping
# unnecessary dnl's and have the macros indented properly.
#
# Here, we use the temporary macro _m4_do, defined as
# $1[]$2[]...[]$n[]_m4_popdef([_m4_do])
m4_define([m4_do],
[m4_if([$#], [0], [],
[m4_define([_$0], m4_pushdef([_$0])_m4_for([_$0], [1], [$#], [1],
[$_$0[[]]])[_m4_popdef([_$0])])_$0($@)])])
# m4_dquote_elt(ARGS)
# -------------------
# Return ARGS as an unquoted list of double-quoted arguments.
#
# m4_foreach to the rescue. It's easier to shift off the leading comma.
m4_define([m4_dquote_elt],
[m4_shift(m4_foreach([_m4_elt], [$@], [,m4_dquote(_m4_defn([_m4_elt]))]))])
# m4_reverse(ARGS)
# ----------------
# Output ARGS in reverse order.
#
# Invoke _m4_r($@) with the temporary _m4_r built as
# [$m], [$m-1], ..., [$2], [$1]_m4_popdef([_m4_r])
m4_define([m4_reverse],
[m4_if([$#], [0], [], [$#], [1], [[$1]],
[m4_define([_m4_r], m4_dquote([$$#])m4_pushdef([_m4_r])_m4_for([_m4_r],
m4_decr([$#]), [1], [-1],
[[, ]m4_dquote([$]_m4_r)])[_m4_popdef([_m4_r])])_m4_r($@)])])
# m4_map(MACRO, LIST)
# -------------------
# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements
# of LIST. $1, $2... must in turn be lists, appropriate for m4_apply.
#
# m4_map/m4_map_sep only execute once; the speedup comes in fixing
# _m4_map. The mismatch in () is intentional, since $1 supplies the
# opening `(' (but it sure looks odd!). Build the temporary _m4_m:
# $1, [$3])$1, [$4])...$1, [$m])_m4_popdef([_m4_m])
m4_define([_m4_map],
[m4_if([$#], [2], [],
[m4_define([_m4_m], m4_pushdef([_m4_m])_m4_for([_m4_m], [3], [$#], [1],
[$0_([1], _m4_m)])[_m4_popdef([_m4_m])])_m4_m($@)])])
m4_define([_m4_map_],
[[$$1, [$$2])]])
# m4_transform(EXPRESSION, ARG...)
# --------------------------------
# Expand EXPRESSION([ARG]) for each argument. More efficient than
# m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))])
#
# Invoke the temporary macro _m4_transform, defined as:
# $1([$2])[]$1([$3])[]...$1([$m])[]_m4_popdef([_m4_transform])
m4_define([m4_transform],
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
[$#], [1], [],
[m4_define([_$0], m4_pushdef([_$0])_m4_for([_$0], [2], [$#], [1],
[_$0_([1], _$0)])[_m4_popdef([_$0])])_$0($@)])])
m4_define([_m4_transform_],
[[$$1([$$2])[]]])
# m4_transform_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...)
# --------------------------------------------------------------
# Perform a pairwise grouping of consecutive ARGs, by expanding
# EXPRESSION([ARG1], [ARG2]). If there are an odd number of ARGs, the
# final argument is expanded with END-EXPR([ARGn]).
#
# Build the temporary macro _m4_transform_pair, with the $2([$m+1])
# only output if $# is odd:
# $1([$3], [$4])[]$1([$5], [$6])[]...$1([$m-1],
# [$m])[]m4_default([$2], [$1])([$m+1])[]_m4_popdef([_m4_transform_pair])
m4_define([m4_transform_pair],
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
[$#], [1], [m4_fatal([$0: too few arguments: $#: $1])],
[$#], [2], [],
[$#], [3], [m4_default([$2], [$1])([$3])[]],
[m4_define([_$0], m4_pushdef([_$0])_m4_for([_$0], [3],
m4_eval([$# / 2 * 2 - 1]), [2], [_$0_([1], _$0, m4_incr(_$0))])_$0_end(
[1], [2], [$#])[_m4_popdef([_$0])])_$0($@)])])
m4_define([_m4_transform_pair_],
[[$$1([$$2], [$$3])[]]])
m4_define([_m4_transform_pair_end],
[m4_if(m4_eval([$3 & 1]), [1], [[m4_default([$$2], [$$1])([$$3])[]]])])
# m4_join(SEP, ARG1, ARG2...)
# ---------------------------
# Produce ARG1SEPARG2...SEPARGn. Avoid back-to-back SEP when a given ARG
# is the empty string. No expansion is performed on SEP or ARGs.
#
# Use a self-modifying separator, since we don't know how many
# arguments might be skipped before a separator is first printed, but
# be careful if the separator contains $. m4_foreach to the rescue.
m4_define([m4_join],
[m4_pushdef([_m4_sep], [m4_define([_m4_sep], _m4_defn([m4_echo]))])]dnl
[m4_foreach([_m4_arg], [m4_shift($@)],
[m4_ifset([_m4_arg], [_m4_sep([$1])_m4_defn([_m4_arg])])])]dnl
[_m4_popdef([_m4_sep])])
# m4_joinall(SEP, ARG1, ARG2...)
# ------------------------------
# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP.
# No expansion is performed on SEP or ARGs.
#
# A bit easier than m4_join. m4_foreach to the rescue.
m4_define([m4_joinall],
[[$2]m4_if(m4_eval([$# <= 2]), [1], [],
[m4_foreach([_m4_arg], [m4_shift2($@)],
[[$1]_m4_defn([_m4_arg])])])])
# m4_list_cmp(A, B)
# -----------------
# Compare the two lists of integer expressions A and B.
#
# m4_list_cmp takes care of any side effects; we only override
# _m4_list_cmp_raw, where we can safely expand lists multiple times.
# First, insert padding so that both lists are the same length; the
# trailing +0 is necessary to handle a missing list. Next, create a
# temporary macro to perform pairwise comparisons until an inequality
# is found. For example, m4_list_cmp([1], [1,2]) creates _m4_cmp as
# m4_if(m4_eval([($1) != ($3)]), [1], [m4_cmp([$1], [$3])],
# m4_eval([($2) != ($4)]), [1], [m4_cmp([$2], [$4])],
# [0]_m4_popdef([_m4_cmp], [_m4_size]))
# then calls _m4_cmp([1+0], [0], [1], [2+0])
m4_define([_m4_list_cmp_raw],
[m4_if([$1], [$2], 0, [m4_pushdef(
[_m4_size])_m4_list_cmp($1+0_m4_list_pad(m4_count($1), m4_count($2)),
$2+0_m4_list_pad(m4_count($2), m4_count($1)))])])
m4_define([_m4_list_pad],
[m4_if(m4_eval($1 < $2), [1],
[_m4_for([_m4_size], m4_incr([$1]), [$2], [1], [,0])])])
m4_define([_m4_list_cmp],
[m4_define([_m4_size], m4_eval([$# >> 1]))]dnl
[m4_define([_m4_cmp], m4_pushdef([_m4_cmp])[m4_if(]_m4_for([_m4_cmp],
[1], _m4_size, [1], [$0_(_m4_cmp, m4_eval(_m4_cmp + _m4_size))])[
[0]_m4_popdef([_m4_cmp], [_m4_size]))])_m4_cmp($@)])
m4_define([_m4_list_cmp_],
[[m4_eval([($$1) != ($$2)]), [1], [m4_cmp([$$1], [$$2])],
]])
# m4_max(EXPR, ...)
# m4_min(EXPR, ...)
# -----------------
# Return the decimal value of the maximum (or minimum) in a series of
# integer expressions.
#
# m4_foreach to the rescue; we only need to replace _m4_minmax. Here,
# we need a temporary macro to track the best answer so far, so that
# the foreach expression is tractable.
m4_define([_m4_minmax],
[m4_pushdef([_m4_best], m4_eval([$2]))m4_foreach([_m4_arg], [m4_shift2($@)],
[m4_define([_m4_best], $1(_m4_best, _m4_defn([_m4_arg])))])]dnl
[_m4_best[]_m4_popdef([_m4_best])])
# m4_set_add_all(SET, VALUE...)
# -----------------------------
# Add each VALUE into SET. This is O(n) in the number of VALUEs, and
# can be faster than calling m4_set_add for each VALUE.
#
# m4_foreach to the rescue. If no deletions have occurred, then avoid
# the speed penalty of m4_set_add.
m4_define([m4_set_add_all],
[m4_if([$#], [0], [], [$#], [1], [],
[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1])
+ m4_len(m4_foreach([_m4_arg], [m4_shift($@)],
m4_ifdef([_m4_set_cleanup($1)],
[[m4_set_add([$1], _m4_defn([_m4_arg]))]],
[[m4_ifdef([_m4_set([$1],]_m4_defn([_m4_arg])[)], [],
[m4_define([_m4_set([$1],]_m4_defn([_m4_arg])[)],
[1])m4_pushdef([_m4_set([$1])],
_m4_defn([_m4_arg]))-])]])))))])])
-1
View File
@@ -1 +0,0 @@
../../submodules/autoconf/lib/m4sugar/m4sugar.m4
File diff suppressed because it is too large Load Diff
-135
View File
@@ -1,135 +0,0 @@
# C++ skeleton for Bison
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008-2009 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/>.
m4_pushdef([b4_copyright_years],
[2002, 2003, 2004, 2005, 2006, 2007, 2008-2009])
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert_push(0)dnl
@output(b4_dir_prefix[]stack.hh@)@
b4_copyright([Stack handling for Bison parsers in C++])[
#ifndef BISON_STACK_HH
# define BISON_STACK_HH
#include <deque>
]b4_namespace_open[
template <class T, class S = std::deque<T> >
class stack
{
public:
// Hide our reversed order.
typedef typename S::reverse_iterator iterator;
typedef typename S::const_reverse_iterator const_iterator;
stack ()
: seq_ ()
{
}
stack (unsigned int n)
: seq_ (n)
{
}
inline
T&
operator [] (unsigned int i)
{
return seq_[i];
}
inline
const T&
operator [] (unsigned int i) const
{
return seq_[i];
}
inline
void
push (const T& t)
{
seq_.push_front (t);
}
inline
void
pop (unsigned int n = 1)
{
for (; n; --n)
seq_.pop_front ();
}
inline
typename S::size_type
size () const
{
return seq_.size ();
}
inline
const_iterator
begin () const
{
return seq_.rbegin ();
}
inline
const_iterator
end () const
{
return seq_.rend ();
}
private:
/// The wrapped container.
S seq_;
};
/// Present a slice of the top of a stack.
template <class T, class S = stack<T> >
class slice
{
public:
slice (const S& stack, unsigned int range)
: stack_ (stack),
range_ (range)
{
}
inline
const T&
operator [] (unsigned int i) const
{
return stack_[range_ - i];
}
private:
const S& stack_;
unsigned int range_;
};
]b4_namespace_close[
#endif // not BISON_STACK_HH[]dnl
]
m4_divert_pop(0)
m4_popdef([b4_copyright_years])dnl
m4_changecom([#])
-278
View File
@@ -1,278 +0,0 @@
# C++ skeleton for Bison
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008-2009 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/>.
## --------- ##
## variant. ##
## --------- ##
# b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])
# ------------------------------------------------
# Run some ACTION ("build", or "destroy") on YYVAL of symbol type
# YYTYPE.
m4_define([b4_symbol_variant],
[m4_pushdef([b4_dollar_dollar],
[$2.$3< $][3 >(m4_shift3($@))])dnl
switch ($1)
{
b4_type_foreach([b4_type_action_])[]dnl
default:
break;
}
m4_popdef([b4_dollar_dollar])dnl
])
# _b4_char_sizeof_counter
# -----------------------
# A counter used by _b4_char_sizeof_dummy to create fresh symbols.
m4_define([_b4_char_sizeof_counter],
[0])
# _b4_char_sizeof_dummy
# ---------------------
# At each call return a new C++ identifier.
m4_define([_b4_char_sizeof_dummy],
[m4_define([_b4_char_sizeof_counter], m4_incr(_b4_char_sizeof_counter))dnl
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)
# ---------------------------
# To be mapped on the list of type names to produce:
#
# char dummy1[sizeof(type_name_1)];
# char dummy2[sizeof(type_name_2)];
#
# for defined type names.
m4_define([b4_char_sizeof],
[b4_symbol_if([$1], [has_type],
[
m4_map([b4_char_sizeof_], [$@])dnl
char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type])])@};
])])
# b4_variant_define
# -----------------
# Define "variant".
m4_define([b4_variant_define],
[[
/// A char[S] buffer to store and retrieve objects.
///
/// Sort of a variant, but does not keep track of the nature
/// of the stored data, since that knowledge is available
/// via the current state.
template <size_t S>
struct variant
{]b4_parse_assert_if([
/// Whether something is contained.
bool built;
])[
/// Empty construction.
inline
variant ()]b4_parse_assert_if([
: 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.
template <typename T>
inline
variant (const T& t)]b4_parse_assert_if([
: built (true)])[
{
new (buffer.raw) T(t);
}
/// Accessor to a built \a T.
template <typename T>
inline T&
as ()
{]b4_parse_assert_if([
assert (built);])[
return reinterpret_cast<T&>(buffer.raw);
}
/// Const accessor to a built \a T (for %printer).
template <typename T>
inline const T&
as () const
{]b4_parse_assert_if([
assert(built);])[
return reinterpret_cast<const T&>(buffer.raw);
}
/// Swap the content with \a other.
template <typename T>
inline void
swap (variant<S>& other)
{
std::swap (as<T>(), other.as<T>());
}
/// Assign the content of \a other to this.
/// Destroys \a other.
template <typename T>
inline void
build (variant<S>& other)
{
build<T>();
swap<T>(other);
other.destroy<T>();
}
/// Destroy the stored \a T.
template <typename T>
inline void
destroy ()
{
as<T>().~T();]b4_parse_assert_if([
built = false;])[
}
/// A buffer large enough to store any of the semantic values.
/// Long double is chosen as it has the strongest alignment
/// constraints.
union
{
long double align_me;
char raw[S];
} buffer;
};
]])
## -------------------------- ##
## Adjustments for variants. ##
## -------------------------- ##
# b4_semantic_type_declare
# ------------------------
# Declare semantic_type.
m4_define([b4_semantic_type_declare],
[ /// An auxiliary type to compute the largest semantic type.
union union_type
{]b4_type_foreach([b4_char_sizeof])[};
/// Symbol semantic values.
typedef variant<sizeof(union_type)> semantic_type;])
# How the semantic value is extracted when using variants.
# b4_symbol_value(VAL, [TYPE])
# ----------------------------
m4_define([b4_symbol_value],
[m4_ifval([$2],
[$1.as< $2 >()],
[$1])])
# b4_symbol_value_template(VAL, [TYPE])
# -------------------------------------
# Same as b4_symbol_value, but used in a template method.
m4_define([b4_symbol_value_template],
[m4_ifval([$2],
[$1.template as< $2 >()],
[$1])])
## ------------- ##
## make_SYMBOL. ##
## ------------- ##
# b4_symbol_constructor_declare_(SYMBOL-NUMBER)
# ---------------------------------------------
# Declare the overloaded version of make_symbol for the (common) type of
# these SYMBOL-NUMBERS. Use at class-level.
m4_define([b4_symbol_constructor_declare_],
[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
[ static // inline
symbol_type
make_[]b4_symbol_([$1], [id]) (dnl
b4_args(b4_symbol_if([$1], [has_type],
[const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l])));
])])])
# b4_symbol_constructor_declare
# -----------------------------
# Declare symbol constructors for all the value types.
# Use at class-level.
m4_define([b4_symbol_constructor_declare],
[ // Symbol constructors declarations.
b4_symbol_foreach([b4_symbol_constructor_declare_])])
# b4_symbol_constructor_define_(SYMBOL-NUMBER)
# --------------------------------------------
# Define symbol constructor for this SYMBOL-NUMBER.
m4_define([b4_symbol_constructor_define_],
[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id],
[ b4_parser_class_name::symbol_type
b4_parser_class_name::make_[]b4_symbol_([$1], [id]) (dnl
b4_args(b4_symbol_if([$1], [has_type],
[const b4_symbol([$1], [type])& v]),
b4_locations_if([const location_type& l])))
{
return symbol_type (b4_args([yytranslate_ (token::b4_symbol([$1], [id]))],
b4_symbol_if([$1], [has_type], [v]),
b4_locations_if([l])));
}
])])])
# b4_symbol_constructor_define
# ----------------------------
# Define the overloaded versions of make_symbol for all the value types.
m4_define([b4_symbol_constructor_define],
[ // Implementation of make_symbol for each symbol type.
b4_symbol_foreach([b4_symbol_constructor_define_])])
+1 -1
View File
@@ -3,7 +3,7 @@
<!-- <!--
bison.xsl - common templates for Bison XSLT. bison.xsl - common templates for Bison XSLT.
Copyright (C) 2007, 2008-2009 Free Software Foundation, Inc. Copyright (C) 2007-2010 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+4 -4
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, 2008, 2009 Free Software Foundation, Inc. Copyright (C) 2007-2010 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -196,11 +196,11 @@
<xsl:with-param name="search" select="$search"/> <xsl:with-param name="search" select="$search"/>
<xsl:with-param name="replace" select="$replace"/> <xsl:with-param name="replace" select="$replace"/>
</xsl:call-template> </xsl:call-template>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<xsl:value-of select="$subject"/> <xsl:value-of select="$subject"/>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:template> </xsl:template>
</xsl:stylesheet> </xsl:stylesheet>
+1 -1
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, 2008-2009 Free Software Foundation, Inc. Copyright (C) 2007-2010 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+4 -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, 2008, 2009 Free Software Foundation, Inc. Copyright (C) 2007-2010 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
@@ -48,15 +48,15 @@
font-size: 9pt; font-size: 9pt;
} }
a:link { a:link {
color: #1f00ff; color: #1f00ff;
text-decoration: none; text-decoration: none;
} }
a:visited { a:visited {
color: #1f00ff; color: #1f00ff;
text-decoration: none; text-decoration: none;
} }
a:hover { a:hover {
color: red; color: red;
} }
#menu a { #menu a {
text-decoration: underline; text-decoration: underline;
+172 -95
View File
@@ -1,12 +1,9 @@
-*- C -*- -*- C -*-
# Yacc compatible skeleton for Bison # Yacc compatible skeleton for Bison
# Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, # Copyright (C) 1984, 1989-1990, 2000-2010 Free Software Foundation,
# 2007, 2008, 2009 Free Software Foundation, Inc. # Inc.
m4_pushdef([b4_copyright_years],
[1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008, 2009])
# 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,13 +18,13 @@ m4_pushdef([b4_copyright_years],
# 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/>.
# Check the value of %define api.push-pull. # Check the value of %define api.push_pull.
b4_percent_define_default([[api.push-pull]], [[pull]]) b4_percent_define_default([[api.push_pull]], [[pull]])
b4_percent_define_check_values([[[[api.push-pull]], b4_percent_define_check_values([[[[api.push_pull]],
[[pull]], [[push]], [[both]]]]) [[pull]], [[push]], [[both]]]])
b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]]) b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]])
b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]]) b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]])
m4_case(b4_percent_define_get([[api.push-pull]]), m4_case(b4_percent_define_get([[api.push_pull]]),
[pull], [m4_define([b4_push_flag], [[0]])], [pull], [m4_define([b4_push_flag], [[0]])],
[push], [m4_define([b4_pull_flag], [[0]])]) [push], [m4_define([b4_pull_flag], [[0]])])
@@ -117,7 +114,7 @@ m4_define([b4_int_type],
# -------------------- # --------------------
# Expansion of $<TYPE>$. # Expansion of $<TYPE>$.
m4_define([b4_lhs_value], m4_define([b4_lhs_value],
[b4_symbol_value(yyval, [$1])]) [(yyval[]m4_ifval([$1], [.$1]))])
# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
@@ -125,7 +122,7 @@ m4_define([b4_lhs_value],
# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
# symbols on RHS. # symbols on RHS.
m4_define([b4_rhs_value], m4_define([b4_rhs_value],
[b4_symbol_value([yyvsp@{b4_subtract([$2], [$1])@}], [$3])]) [(yyvsp@{($2) - ($1)@}m4_ifval([$3], [.$3]))])
@@ -145,7 +142,7 @@ m4_define([b4_lhs_location],
# Expansion of @NUM, where the current rule has RULE-LENGTH symbols # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
# on RHS. # on RHS.
m4_define([b4_rhs_location], m4_define([b4_rhs_location],
[(yylsp@{b4_subtract([$2], [$1])@})]) [(yylsp@{($2) - ($1)@})])
@@ -157,7 +154,8 @@ m4_define([b4_rhs_location],
m4_changecom() m4_changecom()
m4_divert_push(0)dnl m4_divert_push(0)dnl
@output(b4_parser_file_name@)@ @output(b4_parser_file_name@)@
b4_copyright([Implementation for Bison's Yacc-like parsers in C])[ b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],
[1984, 1989-1990, 2000-2006, 2009-2010])[
/* C LALR(1) parser skeleton written by Richard Stallman, by /* C LALR(1) parser skeleton written by Richard Stallman, by
simplifying the original so-called "semantic" parser. */ simplifying the original so-called "semantic" parser. */
@@ -192,7 +190,7 @@ m4_if(b4_prefix, [yy], [],
/* Enabling traces. */ /* Enabling traces. */
#ifndef YYDEBUG #ifndef YYDEBUG
# define YYDEBUG ]b4_parse_trace_if([1], [0])[ # define YYDEBUG ]b4_debug_flag[
#endif #endif
/* Enabling verbose error messages. */ /* Enabling verbose error messages. */
@@ -200,7 +198,7 @@ m4_if(b4_prefix, [yy], [],
# undef YYERROR_VERBOSE # undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1 # define YYERROR_VERBOSE 1
#else #else
# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ # define YYERROR_VERBOSE ]b4_error_verbose_flag[
#endif #endif
/* Enabling the token table. */ /* Enabling the token table. */
@@ -312,7 +310,7 @@ typedef short int yytype_int16;
#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
#ifndef YY_ #ifndef YY_
# if YYENABLE_NLS # if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS # if ENABLE_NLS
# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
# define YY_(msgid) dgettext ("bison-runtime", msgid) # define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -482,27 +480,41 @@ union yyalloc
#define YYNNTS ]b4_nterms_number[ #define YYNNTS ]b4_nterms_number[
/* YYNRULES -- Number of rules. */ /* YYNRULES -- Number of rules. */
#define YYNRULES ]b4_rules_number[ #define YYNRULES ]b4_rules_number[
/* YYNSTATES -- Number of states. */ /* YYNRULES -- Number of states. */
#define YYNSTATES ]b4_states_number[ #define YYNSTATES ]b4_states_number[
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK ]b4_undef_token_number[ #define YYUNDEFTOK ]b4_undef_token_number[
#define YYMAXUTOK ]b4_user_token_number_max[ #define YYMAXUTOK ]b4_user_token_number_max[
#define YYTRANSLATE(YYX) \ #define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
as returned by yylex, without out-of-bounds checking. */
static const ]b4_int_type_for([b4_translate])[ yytranslate[] = static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
{ {
]b4_translate[ ]b4_translate[
}; };
#if YYDEBUG #if YYDEBUG
]b4_integral_parser_table_define([rline], [b4_rline], /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
[YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ YYRHS. */
static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
{
]b4_prhs[
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
{
]b4_rhs[
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const ]b4_int_type_for([b4_rline])[ yyrline[] =
{
]b4_rline[
};
#endif #endif
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
@@ -515,25 +527,75 @@ static const char *const yytname[] =
#endif #endif
# ifdef YYPRINT # ifdef YYPRINT
/* YYTOKNUM[NUM] -- (External) token number corresponding to the /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
(internal) symbol number NUM (which must be that of a token). */ token YYLEX-NUM. */
static const ]b4_int_type_for([b4_toknum])[ yytoknum[] = static const ]b4_int_type_for([b4_toknum])[ yytoknum[] =
{ {
]b4_toknum[ ]b4_toknum[
}; };
# endif # endif
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const ]b4_int_type_for([b4_r1])[ yyr1[] =
{
]b4_r1[
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
static const ]b4_int_type_for([b4_r2])[ yyr2[] =
{
]b4_r2[
};
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
STATE-NUM when YYTABLE doesn't specify something else to do. Zero
means the default is an error. */
static const ]b4_int_type_for([b4_defact])[ yydefact[] =
{
]b4_defact[
};
/* YYDEFGOTO[NTERM-NUM]. */
static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
{
]b4_defgoto[
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
#define YYPACT_NINF ]b4_pact_ninf[ #define YYPACT_NINF ]b4_pact_ninf[
static const ]b4_int_type_for([b4_pact])[ yypact[] =
{
]b4_pact[
};
#define yypact_value_is_default(yystate) \ /* YYPGOTO[NTERM-NUM]. */
]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf])[ static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
{
]b4_pgoto[
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
#define YYTABLE_NINF ]b4_table_ninf[ #define YYTABLE_NINF ]b4_table_ninf[
static const ]b4_int_type_for([b4_table])[ yytable[] =
{
]b4_table[
};
#define yytable_value_is_error(yytable_value) \ static const ]b4_int_type_for([b4_check])[ yycheck[] =
]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[ {
]b4_check[
};
]b4_parser_tables_define[ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const ]b4_int_type_for([b4_stos])[ yystos[] =
{
]b4_stos[
};
#define yyerrok (yyerrstatus = 0) #define yyerrok (yyerrstatus = 0)
#define yyclearin (yychar = YYEMPTY) #define yyclearin (yychar = YYEMPTY)
@@ -547,9 +609,18 @@ static const ]b4_int_type_for([b4_toknum])[ yytoknum[] =
/* Like YYERROR except do call yyerror. This remains here temporarily /* Like YYERROR except do call yyerror. This remains here temporarily
to ease the transition to the new meaning of YYERROR, for GCC. to ease the transition to the new meaning of YYERROR, for GCC.
Once GCC version 2 has supplanted version 1, this can go. */ Once GCC version 2 has supplanted version 1, this can go. However,
YYFAIL appears to be in use. Nevertheless, it is formally deprecated
in Bison 2.4.2's NEWS entry, where a plan to phase it out is
discussed. */
#define YYFAIL goto yyerrlab #define YYFAIL goto yyerrlab
#if defined YYFAIL
/* This is here to suppress warnings from the GCC cpp's
-Wunused-macros. Normally we don't worry about that warning, but
some users do, and we want to make it easy for users to remove
YYFAIL uses, which will produce warnings from Bison 2.5. */
#endif
#define YYRECOVERING() (!!yyerrstatus) #define YYRECOVERING() (!!yyerrstatus)
@@ -606,7 +677,7 @@ while (YYID (0))
we won't break user code: when these are the locations we know. */ we won't break user code: when these are the locations we know. */
#ifndef YY_LOCATION_PRINT #ifndef YY_LOCATION_PRINT
# if YYLTYPE_IS_TRIVIAL # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
# define YY_LOCATION_PRINT(File, Loc) \ # define YY_LOCATION_PRINT(File, Loc) \
fprintf (File, "%d.%d-%d.%d", \ fprintf (File, "%d.%d-%d.%d", \
(Loc).first_line, (Loc).first_column, \ (Loc).first_line, (Loc).first_column, \
@@ -682,26 +753,24 @@ do { \
`------------------------------------------------*/ `------------------------------------------------*/
]b4_c_function_def([yy_reduce_print], [static void], ]b4_c_function_def([yy_reduce_print], [static void],
[[yytype_int16 *yyssp], [yyssp]], [[YYSTYPE *yyvsp], [yyvsp]],
[[YYSTYPE *yyvsp], [yyvsp]],
b4_locations_if([[[YYLTYPE *yylsp], [yylsp]], b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [, ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
b4_parse_param]))[ b4_parse_param]))[
{ {
unsigned long int yylno = yyrline[yyrule];
int yynrhs = yyr2[yyrule]; int yynrhs = yyr2[yyrule];
int yyi; int yyi;
unsigned long int yylno = yyrline[yyrule];
YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
yyrule - 1, yylno); yyrule - 1, yylno);
/* The symbols being reduced. */ /* The symbols being reduced. */
for (yyi = 0; yyi < yynrhs; yyi++) for (yyi = 0; yyi < yynrhs; yyi++)
{ {
YYFPRINTF (stderr, " $%d = ", yyi + 1); YYFPRINTF (stderr, " $%d = ", yyi + 1);
yy_symbol_print (stderr, yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
yystos[yyssp[yyi + 1 - yynrhs]], &]b4_rhs_value(yynrhs, yyi + 1)[
&]b4_rhs_value(yynrhs, yyi + 1)[ ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl b4_user_args[);
b4_user_args[);
YYFPRINTF (stderr, "\n"); YYFPRINTF (stderr, "\n");
} }
} }
@@ -709,7 +778,7 @@ do { \
# define YY_REDUCE_PRINT(Rule) \ # define YY_REDUCE_PRINT(Rule) \
do { \ do { \
if (yydebug) \ if (yydebug) \
yy_reduce_print (yyssp, yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \ yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
} while (YYID (0)) } while (YYID (0))
/* Nonzero means print parse trace. It is left uninitialized so that /* Nonzero means print parse trace. It is left uninitialized so that
@@ -828,14 +897,14 @@ yytnamerr (char *yyres, const char *yystr)
# endif # endif
/* Copy into YYRESULT an error message about the unexpected token /* Copy into YYRESULT an error message about the unexpected token
YYTOKEN while in state YYSTATE. Return the number of bytes copied, YYCHAR while in state YYSTATE. Return the number of bytes copied,
including the terminating null byte. If YYRESULT is null, do not including the terminating null byte. If YYRESULT is null, do not
copy anything; just return the number of bytes that would be copy anything; just return the number of bytes that would be
copied. As a special case, return 0 if an ordinary "syntax error" copied. As a special case, return 0 if an ordinary "syntax error"
message will do. Return YYSIZE_MAXIMUM if overflow occurs during message will do. Return YYSIZE_MAXIMUM if overflow occurs during
size calculation. */ size calculation. */
static YYSIZE_T static YYSIZE_T
yysyntax_error (char *yyresult, int yystate, int yytoken) yysyntax_error (char *yyresult, int yystate, int yychar)
{ {
int yyn = yypact[yystate]; int yyn = yypact[yystate];
@@ -843,62 +912,67 @@ yysyntax_error (char *yyresult, int yystate, int yytoken)
return 0; return 0;
else else
{ {
YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); int yytype = YYTRANSLATE (yychar);
YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
YYSIZE_T yysize = yysize0; YYSIZE_T yysize = yysize0;
YYSIZE_T yysize1; YYSIZE_T yysize1;
int yysize_overflow = 0; int yysize_overflow = 0;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
/* Internationalized format string. */
const char *yyformat = 0;
/* Arguments of yyformat. */
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
int yyx;
# if 0
/* This is so xgettext sees the translatable formats that are
constructed on the fly. */
YY_("syntax error, unexpected %s");
YY_("syntax error, unexpected %s, expecting %s");
YY_("syntax error, unexpected %s, expecting %s or %s");
YY_("syntax error, unexpected %s, expecting %s or %s or %s");
YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
# endif
char *yyfmt;
char const *yyf;
static char const yyunexpected[] = "syntax error, unexpected %s";
static char const yyexpecting[] = ", expecting %s";
static char const yyor[] = " or %s";
char yyformat[sizeof yyunexpected
+ sizeof yyexpecting - 1
+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
* (sizeof yyor - 1))];
char const *yyprefix = yyexpecting;
/* Start YYX at -YYN if negative to avoid negative indexes in /* Start YYX at -YYN if negative to avoid negative indexes in
YYCHECK. In other words, skip the first -YYN actions for this YYCHECK. */
state because they are default actions. */
int yyxbegin = yyn < 0 ? -yyn : 0; int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */ /* Stay within bounds of both yycheck and yytname. */
int yychecklim = YYLAST - yyn + 1; int yychecklim = YYLAST - yyn + 1;
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
/* Number of reported tokens (one for the "unexpected", one per int yycount = 1;
"expected"). */
int yycount = 0;
int yyx;
yyarg[yycount++] = yytname[yytoken]; yyarg[0] = yytname[yytype];
yyfmt = yystpcpy (yyformat, yyunexpected);
for (yyx = yyxbegin; yyx < yyxend; ++yyx) for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
&& !yytable_value_is_error (yytable[yyx + yyn]))
{ {
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
{ {
yycount = 1; yycount = 1;
yysize = yysize0; yysize = yysize0;
yyformat[sizeof yyunexpected - 1] = '\0';
break; break;
} }
yyarg[yycount++] = yytname[yyx]; yyarg[yycount++] = yytname[yyx];
yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize1 = yysize + yytnamerr (0, yytname[yyx]);
yysize_overflow |= (yysize1 < yysize); yysize_overflow |= (yysize1 < yysize);
yysize = yysize1; yysize = yysize1;
yyfmt = yystpcpy (yyfmt, yyprefix);
yyprefix = yyor;
} }
switch (yycount) yyf = YY_(yyformat);
{ yysize1 = yysize + yystrlen (yyf);
#define YYCASE_(N, S) \
case N: \
yyformat = S; \
break
YYCASE_(1, YY_("syntax error, unexpected %s"));
YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
#undef YYCASE_
}
yysize1 = yysize + yystrlen (yyformat);
yysize_overflow |= (yysize1 < yysize); yysize_overflow |= (yysize1 < yysize);
yysize = yysize1; yysize = yysize1;
@@ -912,17 +986,19 @@ yysyntax_error (char *yyresult, int yystate, int yytoken)
produced a string with the wrong number of "%s"s. */ produced a string with the wrong number of "%s"s. */
char *yyp = yyresult; char *yyp = yyresult;
int yyi = 0; int yyi = 0;
while ((*yyp = *yyformat) != '\0') while ((*yyp = *yyf) != '\0')
if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) {
{ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
yyp += yytnamerr (yyp, yyarg[yyi++]); {
yyformat += 2; yyp += yytnamerr (yyp, yyarg[yyi++]);
} yyf += 2;
else }
{ else
yyp++; {
yyformat++; yyp++;
} yyf++;
}
}
} }
return yysize; return yysize;
} }
@@ -1167,7 +1243,7 @@ b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar;
yyvsp = yyvs;]b4_locations_if([[ yyvsp = yyvs;]b4_locations_if([[
yylsp = yyls; yylsp = yyls;
#if YYLTYPE_IS_TRIVIAL #if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
/* Initialize the default location before parsing starts. */ /* Initialize the default location before parsing starts. */
yylloc.first_line = yylloc.last_line = ]b4_location_initial_line[; yylloc.first_line = yylloc.last_line = ]b4_location_initial_line[;
yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[; yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[;
@@ -1279,7 +1355,7 @@ yybackup:
/* First try to decide what to do without reference to lookahead token. */ /* First try to decide what to do without reference to lookahead token. */
yyn = yypact[yystate]; yyn = yypact[yystate];
if (yypact_value_is_default (yyn)) if (yyn == YYPACT_NINF)
goto yydefault; goto yydefault;
/* Not known => get a lookahead token if don't already have one. */ /* Not known => get a lookahead token if don't already have one. */
@@ -1329,7 +1405,7 @@ yyread_pushed_token:]])[
yyn = yytable[yyn]; yyn = yytable[yyn];
if (yyn <= 0) if (yyn <= 0)
{ {
if (yytable_value_is_error (yyn)) if (yyn == 0 || yyn == YYTABLE_NINF)
goto yyerrlab; goto yyerrlab;
yyn = -yyn; yyn = -yyn;
goto yyreduce; goto yyreduce;
@@ -1424,7 +1500,7 @@ yyerrlab:
yyerror (]b4_yyerror_args[YY_("syntax error")); yyerror (]b4_yyerror_args[YY_("syntax error"));
#else #else
{ {
YYSIZE_T yysize = yysyntax_error (0, yystate, yytoken); YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
{ {
YYSIZE_T yyalloc = 2 * yysize; YYSIZE_T yyalloc = 2 * yysize;
@@ -1444,7 +1520,7 @@ yyerrlab:
if (0 < yysize && yysize <= yymsg_alloc) if (0 < yysize && yysize <= yymsg_alloc)
{ {
(void) yysyntax_error (yymsg, yystate, yytoken); (void) yysyntax_error (yymsg, yystate, yychar);
yyerror (]b4_yyerror_args[yymsg); yyerror (]b4_yyerror_args[yymsg);
} }
else else
@@ -1513,7 +1589,7 @@ yyerrlab1:
for (;;) for (;;)
{ {
yyn = yypact[yystate]; yyn = yypact[yystate];
if (!yypact_value_is_default (yyn)) if (yyn != YYPACT_NINF)
{ {
yyn += YYTERROR; yyn += YYTERROR;
if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
@@ -1604,10 +1680,12 @@ yypushreturn:
return YYID (yyresult); return YYID (yyresult);
} }
]b4_epilogue[]dnl
]b4_epilogue
b4_defines_if( b4_defines_if(
[@output(b4_spec_defines_file@)@ [@output(b4_spec_defines_file@)@
b4_copyright([Interface for Bison's Yacc-like parsers in C])dnl b4_copyright([Skeleton interface for Bison's Yacc-like parsers in C],
[1984, 1989-1990, 2000-2006, 2009-2010])
b4_percent_code_get([[requires]])[]dnl b4_percent_code_get([[requires]])[]dnl
@@ -1670,4 +1748,3 @@ b4_c_function_decl([b4_prefix[pstate_delete]], [[void]],
b4_percent_code_get([[provides]])[]dnl b4_percent_code_get([[provides]])[]dnl
])dnl b4_defines_if ])dnl b4_defines_if
m4_divert_pop(0) m4_divert_pop(0)
m4_popdef([b4_copyright_years])
+1 -2
View File
@@ -1,8 +1,7 @@
# DJGPP Maintainer's Makefile -*-Makefile-*- # DJGPP Maintainer's Makefile -*-Makefile-*-
# Requires GNU sed # Requires GNU sed
## Copyright (C) 2005, 2006, 2007, 2008-2009 Free Software Foundation, ## Copyright (C) 2005-2010 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
+1 -1
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, 2006, 2007, 2008-2009 Free Software Foundation, Inc. Copyright (C) 2005-2010 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 -2
View File
@@ -4,8 +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, 2006, 2007, 2008-2009 Free Software Foundation, Rem Copyright (C) 2005-2010 Free Software Foundation, Inc.
Rem 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
+1 -2
View File
@@ -3,8 +3,7 @@
# of the configure script generated by autoconf 2.62. # of the configure script generated by autoconf 2.62.
# Copyright (C) 2005, 2006, 2007, 2008-2009 Free Software Foundation, # Copyright (C) 2005-2010 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
+1 -2
View File
@@ -3,8 +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, 2006, 2007, 2008-2009 Free Software Foundation, # Copyright (C) 2005-2010 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
+1 -2
View File
@@ -1,7 +1,6 @@
# sed script for DJGPP specific editing of config.hin # sed script for DJGPP specific editing of config.hin
# Copyright (C) 2005, 2006, 2007, 2008-2009 Free Software Foundation, # Copyright (C) 2005-2010 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
+1 -2
View File
@@ -7,8 +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, 2006, 2007, 2008-2009 Free Software Foundation, Rem Copyright (C) 2005-2010 Free Software Foundation, Inc.
Rem 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
-27
View File
@@ -1,27 +0,0 @@
## Copyright (C) 2008-2009 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/>.
EXTRA_DIST += \
djgpp/Makefile.maint \
djgpp/README.in \
djgpp/config.bat \
djgpp/config.sed \
djgpp/config.site \
djgpp/config_h.sed \
djgpp/djunpack.bat \
djgpp/fnchange.lst \
djgpp/subpipe.c \
djgpp/subpipe.h \
djgpp/testsuite.sed
+1 -2
View File
@@ -1,7 +1,6 @@
/* Subprocesses with pipes. /* Subprocesses with pipes.
Copyright (C) 2005, 2006, 2007, 2008-2009 Free Software Foundation, Copyright (C) 2005-2010 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
+1 -2
View File
@@ -1,6 +1,5 @@
/* Subprocesses with pipes. /* Subprocesses with pipes.
Copyright (C) 2005, 2006, 2007, 2008-2009 Free Software Foundation, Copyright (C) 2005-2010 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
+1 -1
View File
@@ -3,7 +3,7 @@
# of the testsuite script generated by autoconf 2.61. # of the testsuite script generated by autoconf 2.61.
# Copyright (C) 2007, 2008-2009 Free Software Foundation, Inc. # Copyright (C) 2007-2010 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 -1
View File
@@ -1,11 +1,12 @@
*.info* *.info*
Makefile
Makefile.in
bison.1 bison.1
bison.aux bison.aux
bison.cp bison.cp
bison.cps bison.cps
bison.dvi bison.dvi
bison.fn bison.fn
bison.help
bison.html bison.html
bison.ky bison.ky
bison.log bison.log
+2 -1
View File
@@ -1,11 +1,12 @@
/*.info* /*.info*
/Makefile
/Makefile.in
/bison.1 /bison.1
/bison.aux /bison.aux
/bison.cp /bison.cp
/bison.cps /bison.cps
/bison.dvi /bison.dvi
/bison.fn /bison.fn
/bison.help
/bison.html /bison.html
/bison.ky /bison.ky
/bison.log /bison.log
+121
View File
@@ -0,0 +1,121 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*-
## Copyright (C) 2001-2003, 2005-2010 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/>.
AM_MAKEINFOFLAGS = --no-split
info_TEXINFOS = bison.texinfo
bison_TEXINFOS = $(srcdir)/cross-options.texi gpl-3.0.texi fdl.texi
CLEANFILES = bison.fns
CLEANDIRS = *.t2d
clean-local:
rm -rf $(CLEANDIRS)
CROSS_OPTIONS_PL = $(top_srcdir)/build-aux/cross-options.pl
$(srcdir)/cross-options.texi: $(top_srcdir)/src/getargs.c $(CROSS_OPTIONS_PL)
-rm -f $@ $@.tmp
cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) bison
$(top_builddir)/src/bison --help | perl $(CROSS_OPTIONS_PL) >$@.tmp
mv $@.tmp $@
MAINTAINERCLEANFILES = $(srcdir)/cross-options.texi
## ---------- ##
## Ref card. ##
## ---------- ##
EXTRA_DIST = refcard.tex
CLEANFILES += refcard.dvi refcard.log refcard.ps
refcard.dvi: refcard.tex
tex refcard.tex
refcard.ps: refcard.dvi
## ----------- ##
## Man Pages. ##
## ----------- ##
dist_man_MANS = $(srcdir)/bison.1
EXTRA_DIST += $(dist_man_MANS:.1=.x) common.x
MAINTAINERCLEANFILES += $(dist_man_MANS)
# Depend on configure to get version number changes.
common_dep = $(top_srcdir)/configure $(srcdir)/common.x
srcsrcdir = $(top_srcdir)/bin
$(srcdir)/bison.1: $(common_dep) $(top_srcdir)/src/getargs.c
# Differences to ignore when comparing the man page (the date).
remove_time_stamp = \
sed 's/^\(\.TH[^"]*"[^"]*"[^"]*\)"[^"]*"/\1/'
MOSTLYCLEANFILES = $(srcdir)/*.t
SUFFIXES = .x .1
PREPATH = $(top_builddir)/src
.x.1:
@program=`expr "/$*" : '.*/\(.*\)'` && \
save_IFS=$IFS; \
IFS=$(PATH_SEPARATOR); \
for dir in $(PREPATH); do \
IFS=$save_IFS; \
echo cd $$dir '&&' $(MAKE) $(AM_MAKEFLAGS) $$program && \
(cd $$dir && $(MAKE) $(AM_MAKEFLAGS) $$program) || exit; \
done
@echo "Updating man page $@"
PATH="$(PREPATH)$(PATH_SEPARATOR)$$PATH"; \
export PATH; \
$(HELP2MAN) \
--include=$*.x \
--include=$(srcdir)/common.x \
--output=$@.t `echo '$*' | sed 's,.*/,,'`
if $(remove_time_stamp) $@ >$@a.t 2>/dev/null && \
$(remove_time_stamp) $@.t | cmp $@a.t - >/dev/null 2>&1; then \
touch $@; \
else \
mv $@.t $@; \
fi
rm -f $@*.t
nodist_man_MANS = yacc.1
## -------------- ##
## Doxygenation. ##
## -------------- ##
DOXYGEN = doxygen
.PHONY: doc html
doc: html
html-local: Doxyfile
$(DOXYGEN)
edit = sed -e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \
-e 's,@PACKAGE_VERSION\@,$(PACKAGE_VERSION),g' \
-e 's,@top_builddir\@,$(top_builddir),g' \
-e 's,@top_srcdir\@,$(top_srcdir),g'
EXTRA_DIST += Doxyfile.in
CLEANFILES += Doxyfile
# Sed is used to generate Doxyfile from Doxyfile.in instead of
# configure, because the former is way faster than the latter.
Doxyfile: $(srcdir)/Doxyfile.in
$(edit) $(srcdir)/Doxyfile.in >Doxyfile
CLEANDIRS += html latex
+273 -746
View File
File diff suppressed because it is too large Load Diff
-5
View File
@@ -53,8 +53,3 @@ are unique. When a long option takes an argument, like
.BR \-\-file-prefix , .BR \-\-file-prefix ,
connect the option name and the argument with connect the option name and the argument with
.BR = . .BR = .
[see also]
.BR lex (1),
.BR flex (1),
.BR yacc (1).
+4
View File
@@ -0,0 +1,4 @@
[see also]
.BR lex (1),
.BR flex (1),
.BR yacc (1).
-143
View File
@@ -1,143 +0,0 @@
## Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009
## 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/>.
AM_MAKEINFOFLAGS = --no-split
info_TEXINFOS = doc/bison.texinfo
doc_bison_TEXINFOS = \
$(CROSS_OPTIONS_TEXI) \
doc/fdl.texi \
doc/gpl-3.0.texi
CLEANFILES = doc/bison.fns
CLEANDIRS = doc/*.t2d
clean-local:
rm -rf $(CLEANDIRS)
MOSTLYCLEANFILES += $(top_srcdir)/doc/*.t
CROSS_OPTIONS_PL = $(top_srcdir)/build-aux/cross-options.pl
CROSS_OPTIONS_TEXI = $(top_srcdir)/doc/cross-options.texi
$(CROSS_OPTIONS_TEXI): doc/bison.help $(CROSS_OPTIONS_PL)
# Create $@~ which is the previous contents. Don't use `mv' here so
# that even if we are interrupted, the file is still available for
# diff in the next run. Note that $@ might not exist yet.
{ test ! -f $@ || cat $@; } >$@~
test ! -f $@.tmp || rm -f $@.tmp
src/bison$(EXEEXT) --help | \
perl $(CROSS_OPTIONS_PL) $(top_srcdir)/src/scan-gram.l >$@.tmp
diff -u $@~ $@.tmp || true
mv $@.tmp $@
MAINTAINERCLEANFILES = $(CROSS_OPTIONS_TEXI)
## ---------- ##
## Ref card. ##
## ---------- ##
EXTRA_DIST += doc/refcard.tex
CLEANFILES += doc/refcard.dvi doc/refcard.log doc/refcard.ps
doc/refcard.dvi: doc/refcard.tex
cd doc && tex refcard.tex
doc/refcard.ps: doc/refcard.dvi
## ---------------- ##
## doc/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
# requirements over the user environment, we used not depend on
# 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
# include "make src/bison" in the commands. Then we may have a
# problem with concurrent builds, since one make might be aiming one
# of its jobs at compiling src/bison, and another job at generating
# the man page. If the latter is faster than the former, then we have
# two makes that concurrently try to compile src/bison. Doomed to
# failure.
#
# As a simple scheme to get our way out, make a stamp file,
# bison.help, which contains --version then --help. This file can
# depend on bison, which ensures its correctness. But update it
# *only* if needed (content changes). This way, we avoid useless
# compilations of cross-option.texi and bison.1. At the cost of
# repeated builds of bison.help.
EXTRA_DIST += $(top_srcdir)/doc/bison.help
MAINTAINERCLEANFILES += $(top_srcdir)/doc/bison.help
$(top_srcdir)/doc/bison.help: src/bison$(EXEEXT)
$< --version >doc/bison.help.t
$< --help >>doc/bison.help.t
$(top_srcdir)/build-aux/move-if-change doc/bison.help.t $@
## ----------- ##
## Man Pages. ##
## ----------- ##
dist_man_MANS = $(top_srcdir)/doc/bison.1
EXTRA_DIST += $(dist_man_MANS:.1=.x)
MAINTAINERCLEANFILES += $(dist_man_MANS)
# Differences to ignore when comparing the man page (the date).
remove_time_stamp = \
sed 's/^\(\.TH[^"]*"[^"]*"[^"]*\)"[^"]*"/\1/'
# Depend on configure to get version number changes.
$(top_srcdir)/doc/bison.1: doc/bison.help doc/bison.x $(top_srcdir)/configure
@echo "Updating man page $@"
$(HELP2MAN) \
--include=$(top_srcdir)/doc/bison.x \
--output=$@.t src/bison$(EXEEXT)
if $(remove_time_stamp) $@ >$@a.t 2>/dev/null && \
$(remove_time_stamp) $@.t | cmp $@a.t - >/dev/null 2>&1; then \
touch $@; \
else \
mv $@.t $@; \
fi
rm -f $@*.t
nodist_man_MANS = doc/yacc.1
## -------------- ##
## Doxygenation. ##
## -------------- ##
DOXYGEN = doxygen
.PHONY: doc html
doc: html
html-local: doc/Doxyfile
cd doc && $(DOXYGEN)
edit = sed -e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \
-e 's,@PACKAGE_VERSION\@,$(PACKAGE_VERSION),g' \
-e 's,@top_builddir\@,$(top_builddir),g' \
-e 's,@top_srcdir\@,$(top_srcdir),g'
EXTRA_DIST += doc/Doxyfile.in
CLEANFILES += doc/Doxyfile
# Sed is used to generate Doxyfile from Doxyfile.in instead of
# configure, because the former is way faster than the latter.
doc/Doxyfile: $(top_srcdir)/doc/Doxyfile.in
$(edit) $(top_srcdir)/doc/Doxyfile.in >doc/Doxyfile
CLEANDIRS += html latex
+1 -1
View File
@@ -19,7 +19,7 @@
\def\finalout{\overfullrule=0pt} \def\finalout{\overfullrule=0pt}
%\finalout %\finalout
% Copyright (c) 1998, 2001, 2009 Free Software Foundation, Inc. % Copyright (c) 1998, 2001, 2009-2010 Free Software Foundation, Inc.
% %
% This file is part of Bison. % This file is part of Bison.
% %
+2
View File
@@ -1 +1,3 @@
Makefile
Makefile.in
bench.pl bench.pl
+2
View File
@@ -1 +1,3 @@
/Makefile
/Makefile.in
/bench.pl /bench.pl
+16
View File
@@ -0,0 +1,16 @@
## Copyright (C) 2006, 2009-2010 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/>.
nodist_noinst_SCRIPTS = bench.pl
+1 -1
View File
@@ -19,7 +19,7 @@ straightforward use of _build/src/bison would.)
-- --
Copyright (C) 2006, 2009 Free Software Foundation, Inc. Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler. This file is part of Bison, the GNU Compiler Compiler.
+32 -784
View File
@@ -1,6 +1,6 @@
#! /usr/bin/perl -w #! /usr/bin/perl -w
# Copyright (C) 2006, 2008, 2009 Free Software Foundation, Inc. # Copyright (C) 2006, 2008-2010 Free Software Foundation, Inc.
# #
# This file is part of Bison, the GNU Compiler Compiler. # This file is part of Bison, the GNU Compiler Compiler.
# #
@@ -17,230 +17,17 @@
# 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/>.
=head1 NAME
bench.pl - bench marks for Bison parsers.
=head1 SYNOPSIS
./bench.pl [OPTIONS]... DIRECTIVES
=head1 DIRECTIVES
Specify the set of benches to run. The following grammar defines the
I<directives>:
directives ::=
directives | directives -- Alternation
| directives & directives -- Concatenation
| [ directives> ] -- Optional
| ( directives> ) -- Parentheses
| #d NAME[=VALUE] -- %code { #define NAME [VALUE] }
| %d NAME[=VALUE] -- %define NAME ["VALUE"]
| %s skeleton -- %skeleton "skeleton"
| directive
Parentheses only group to override precedence. For instance:
[ %debug ] & [ %error-verbose ] & [ %define variant ]
will generate eight different cases.
=head1 OPTIONS
=over 4
=item B<-b>, B<--bench>
Predefined benches, that is, combimation between a grammar and a I<directives>
request.
=over 4
=item I<push>
Test the push parser vs. the pull interface. Use the C parser.
=item I<variant>
Test the use of variants instead of union in the C++ parser.
=back
=item B<-c>, B<--cflags>=I<flags>
Flags to pass to the C or C++ compiler. Defaults to -O2.
=item B<-d>, B<--directive>=I<directives>
Add a set of Bison directives to bench against each other.
=item B<-g>, B<--grammar>=I<grammar>
Select the base I<grammar> to use. Defaults to I<calc>.
=over 4
=item I<calc>
Traditional calculator.
=item I<list>
C++ grammar that uses std::string and std::list. Can be used with
or without %define variant.
=item I<triangular>
Artificial grammar with very long rules.
=back
=item B<-h>, B<--help>
Display this message and exit succesfully. The more verbose, the more
details.
=item B<-i>, B<--iterations>=I<integer>
Say how many times a single test of the bench must be run. If
negative, specify the minimum number of CPU seconds to run. Defaults
to -1.
=item B<-q>, B<--quiet>
Decrease the verbosity level (defaults to 1).
=item B<-v>, B<--verbose>
Raise the verbosity level (defaults to 1).
=back
=cut
use strict;
use IO::File; use IO::File;
use Benchmark qw (:all);
my $bison = $ENV{'BISON'} || '@abs_top_builddir@/tests/bison';
my $cc = $ENV{'CC'} || 'gcc';
################################################################## ##################################################################
=head1 VARIABLES sub triangular_grammar ($$$)
=over 4
=item C<@bench>
The list of benches to run.
=item C<$bison>
The Bison program to use to compile the grammar.
=item C<$cc>
The C compiler.
=item C<$cxx>
The C++ compiler.
=item C<$cflags>
Compiler flags (C or C++).
=item C<@directive>
A list of directive sets to measure against each other.
=item C<$iterations>
The number of times the parser is run for a bench.
=item C<$verbose>
Verbosity level.
=back
=cut
my $bench;
my $bison = $ENV{'BISON'} || '@abs_top_builddir@/tests/bison';
my $cc = $ENV{'CC'} || 'gcc';
my $cxx = $ENV{'CXX'} || 'g++';
my $cflags = '-O2';
my @directive = ();
my $grammar = 'calc';
my $iterations = -1;
my $verbose = 1;
=head1 FUNCTIONS
=over 4
=item C<verbose($level, $message)>
Report the C<$message> is C<$level> E<lt>= C<$verbose>.
=cut
sub verbose($$)
{ {
my ($level, $message) = @_; my ($base, $max, $directives) = @_;
print STDERR $message
if $level <= $verbose;
}
######################################################################
=item C<directives($bench, @directive)>
Format the list of directives for Bison for bench named C<$bench>.
=cut
sub directives($@)
{
my ($bench, @directive) = @_;
my $res = "/* Directives for bench `$bench'. */\n";
$res .= join ("\n", @directive) . "\n";
$res .= "/* End of directives for bench `$bench'. */\n";
return $res;
}
######################################################################
=item C<generate_grammar_triangular ($base, $max, @directive)>
Create a large triangular grammar which looks like :
input:
exp { if ($1 != 0) abort (); $$ = $1; }
| input exp { if ($2 != $1 + 1) abort (); $$ = $2; }
;
exp:
END { $$ = 0; }
| "1" END { $$ = 1; }
| "1" "2" END { $$ = 2; }
| "1" "2" "3" END { $$ = 3; }
| "1" "2" "3" "4" END { $$ = 4; }
| "1" "2" "3" "4" "5" END { $$ = 5; }
;
C<$base> is the base name for the file to create (F<$base.y>).
C<$max> is the number of such rules (here, 5). You may pass
additional Bison C<@directive>.
The created parser is self contained: it includes its scanner, and
source of input.
=cut
sub generate_grammar_triangular ($$@)
{
my ($base, $max, @directive) = @_;
my $directives = directives ($base, @directive);
my $out = new IO::File ">$base.y" my $out = new IO::File ">$base.y"
or die; or die;
@@ -254,7 +41,6 @@ sub generate_grammar_triangular ($$@)
static int yylex (void); static int yylex (void);
static void yyerror (const char *msg); static void yyerror (const char *msg);
%} %}
$directives
%union %union
{ {
int val; int val;
@@ -326,15 +112,6 @@ EOF
################################################################## ##################################################################
=item C<calc_input ($base, $max)>
Generate the input file F<$base.input> for the calc parser. The input
is composed of two expressions. The first one is using left recursion
only and consumes no stack. The second one requires a deep stack.
These two expressions are repeated C<$max> times in the output file.
=cut
sub calc_input ($$) sub calc_input ($$)
{ {
my ($base, $max) = @_; my ($base, $max) = @_;
@@ -349,22 +126,9 @@ sub calc_input ($$)
################################################################## ##################################################################
=item C<generate_grammar_calc ($base, $max, @directive)> sub calc_grammar ($$$)
Generate a Bison file F<$base.y> for a calculator parser in C. Pass
the additional Bison C<@directive>. C<$max> is ignored, but left to
have the same interface as C<triangular_grammar>.
=cut
sub generate_grammar_calc ($$@)
{ {
my ($base, $max, @directive) = @_; my ($base, $max, $directives) = @_;
my $directives = directives ($base, @directive);
# Putting this request here is stupid, since the input will be
# generated each time we generate a grammar.
calc_input ('calc', 200);
my $out = new IO::File ">$base.y" my $out = new IO::File ">$base.y"
or die; or die;
@@ -384,9 +148,9 @@ static semantic_value global_result = 0;
static int global_count = 0; static int global_count = 0;
%} %}
/* Exercise %union. */
$directives $directives
%error-verbose %error-verbose
/* Exercise %union. */
%union %union
{ {
semantic_value ival; semantic_value ival;
@@ -563,560 +327,44 @@ EOF
################################################################## ##################################################################
=item C<generate_grammar_list ($base, $max, @directive)>
Generate a Bison file F<$base.y> for a C++ parser that uses C++
objects (std::string, std::list). Tailored for using %define variant.
=cut
sub generate_grammar_list ($$@)
{
my ($base, $max, @directive) = @_;
my $directives = directives ($base, @directive);
my $variant = grep { /%define "?variant"?/ } @directive;
my $lex_symbol = grep { /%define "?lex_symbol"?/ } @directive;
my $out = new IO::File ">$base.y"
or die;
print $out <<EOF;
%language "C++"
%defines
%locations
$directives
%code requires // *.h
{
#include <string>
}
%code // *.c
{
#include <algorithm>
#include <iostream>
#include <sstream>
#define STAGE_MAX ($max * 10) // max = $max
#define USE_LEX_SYMBOL $lex_symbol
#define USE_VARIANTS $variant
// Prototype of the yylex function providing subsequent tokens.
static
#if USE_LEX_SYMBOL
yy::parser::symbol_type yylex();
#else
yy::parser::token_type yylex(yy::parser::semantic_type* yylval,
yy::parser::location_type* yylloc);
#endif
// Conversion to string.
template <typename T>
inline
std::string
string_cast (const T& t)
{
std::ostringstream o;
o << t;
return o.str ();
}
}
%token END_OF_FILE 0
EOF
if ($variant)
{
print $out <<'EOF';
%token <std::string> TEXT
%token <int> NUMBER
%printer { std::cerr << "Number: " << $$; } <int>
%printer { std::cerr << "Text: " << $$; } <std::string>
%type <std::string> text result
%%
result:
text { /* Throw away the result. */ }
;
text:
/* nothing */ { /* This will generate an empty string */ }
| text TEXT { std::swap ($$, $2); }
| text NUMBER { $$ = string_cast($2); }
;
EOF
}
else
{
# Not using Bison variants.
print $out <<'EOF';
%union {int ival; std::string* sval;}
%token <sval> TEXT
%token <ival> NUMBER
%printer { std::cerr << "Number: " << $$; } <ival>
%printer { std::cerr << "Text: " << *$$; } <sval>
%type <sval> text result
%%
result:
text { delete $1; }
;
text:
/* nothing */ { $$ = new std::string; }
| text TEXT { delete $1; $$ = $2; }
| text NUMBER { delete $1; $$ = new std::string (string_cast ($2)); }
;
EOF
}
print $out <<'EOF';
%%
#
static
#if USE_LEX_SYMBOL
yy::parser::symbol_type yylex()
#else
yy::parser::token_type yylex(yy::parser::semantic_type* yylval,
yy::parser::location_type* yylloc)
#endif
{
typedef yy::parser::location_type location_type;
typedef yy::parser::token token;
static int stage = -1;
++stage;
if (stage == STAGE_MAX)
{
#if USE_LEX_SYMBOL
return yy::parser::make_END_OF_FILE (location_type ());
#else
*yylloc = location_type ();
return token::END_OF_FILE;
#endif
}
else if (stage % 2)
{
#if USE_LEX_SYMBOL
return yy::parser::make_NUMBER (stage, location_type ());
#else
# if defined ONE_STAGE_BUILD
yylval->build(stage);
# elif USE_VARIANTS
yylval->build<int>() = stage;
# else
yylval->ival = stage;
# endif
*yylloc = location_type ();
return token::NUMBER;
#endif
}
else
{
#if USE_LEX_SYMBOL
return yy::parser::make_TEXT ("A string.", location_type ());
#else
# if defined ONE_STAGE_BUILD
yylval->build(std::string("A string."));
# elif USE_VARIANTS
yylval->build<std::string>() = std::string("A string.");
# else
yylval->sval = new std::string("A string.");
# endif
*yylloc = location_type ();
return token::TEXT;
#endif
}
abort();
}
// Mandatory error function
void
yy::parser::error(const yy::parser::location_type& loc, const std::string& msg)
{
std::cerr << loc << ": " << msg << std::endl;
}
int main(int argc, char *argv[])
{
yy::parser p;
#if YYDEBUG
p.set_debug_level(!!getenv("YYDEBUG"));
#endif
p.parse();
return 0;
}
EOF
}
##################################################################
=item C<generate_grammar ($name, $base, @directive)>
Generate F<$base.y> by calling C<&generate_grammar_$name>.
=cut
sub generate_grammar ($$@)
{
my ($name, $base, @directive) = @_;
verbose 3, "Generating $base.y\n";
my %generator =
(
"calc" => \&generate_grammar_calc,
"list" => \&generate_grammar_list,
"triangular" => \&generate_grammar_triangular,
);
&{$generator{$name}}($base, 200, @directive);
}
##################################################################
=item C<run ($command)>
Run, possibly verbosely, the shell C<$command>.
=cut
sub run ($)
{
my ($command) = @_;
verbose 3, "$command\n";
system ("$command") == 0
or die "$command failed";
}
##################################################################
=item C<compile ($base)>
Compile C<$base.y> to an executable C, Using the C or C++ compiler
depending on the %language specification in C<$base.y>.
=cut
sub compile ($) sub compile ($)
{ {
my ($base) = @_; my ($base) = @_;
my $language = `sed -ne '/%language "\\(.*\\)"/{s//\\1/;p;q;}' $base.y`; system ("$bison $base.y -o $base.c") == 0
chomp $language; or die;
system ("$cc -o $base $base.c") == 0
my $compiler = $language eq 'C++' ? $cxx : $cc; or die;
run "$bison $base.y -o $base.c";
run "$compiler -o $base $cflags $base.c";
} }
###################################################################### sub bench_grammar ($)
=item C<bench ($grammar, @token)>
Generate benches for the C<$grammar> and the directive specification
given in the list of C<@token>.
=cut
sub bench ($@)
{ {
my ($grammar, @token) = @_; my ($gram) = @_;
use Benchmark qw (:all :hireswallclock); my %test =
(
"pull-impure" => '',
"pull-pure" => '%define api.pure',
"push-impure" => '%define api.push_pull "both"',
"push-pure" => '%define api.push_pull "both" %define api.pure',
);
my @directive = parse (@token);
# Set up the benches as expected by timethese.
my %bench; my %bench;
# A counter of directive sets. while (my ($name, $directives) = each %test)
my $count = 1;
for my $d (@directive)
{ {
$bench{$count} = $d; print STDERR "$name\n";
printf " %2d. %s\n", $count, join (' ', split ("\n", $d)); my $generator = "$gram" . "_grammar";
$count++; &$generator ($name, 200, $directives);
};
# For each bench, capture the size.
my %size;
while (my ($name, $directives) = each %bench)
{
generate_grammar ($grammar, $name, $directives);
# Compile the executable.
compile ($name); compile ($name);
$bench{$name} = "system ('./$name');"; $bench{$name} = "system ('./$name');";
chop($size{$name} = `wc -c <$name`);
} }
# Run the benches. print "$gram:\n";
# my $res = timethese (50, \%bench, 'nop');
# STYLE can be any of 'all', 'none', 'noc', 'nop' or 'auto'. 'all'
# shows each of the 5 times available ('wallclock' time, user time,
# system time, user time of children, and system time of
# children). 'noc' shows all except the two children times. 'nop'
# shows only wallclock and the two children times. 'auto' (the
# default) will act as 'all' unless the children times are both
# zero, in which case it acts as 'noc'. 'none' prevents output.
verbose 3, "Running the benches for $grammar\n";
my $res = timethese ($iterations, \%bench, 'nop');
# Output the speed result.
cmpthese ($res, 'nop'); cmpthese ($res, 'nop');
# Display the sizes.
print "Sizes (decreasing):\n";
my $width = 10;
for my $bench (keys %size)
{
$width = length $bench
if $width < length $bench;
}
# Benches sorted by decreasing size.
my @benches_per_size = sort {$size{$b} <=> $size{$a}} keys %size;
for my $bench (@benches_per_size)
{
printf "%${width}s: %5.2fkB\n", $bench, $size{$bench} / 1024;
}
} }
###################################################################### print STDERR "Using $bison, $cc.\n";
calc_input ('calc', 200);
=item C<bench_push_parser ()> bench_grammar ('calc');
Bench the C push parser against the pull parser, pure and impure
interfaces.
=cut
sub bench_push_parser ()
{
bench ('calc',
qw(
[ %d api.pure ]
&
[ %d api.push-pull=both ]
));
}
######################################################################
=item C<bench_variant_parser ()>
Bench the C++ lalr1.cc parser using variants or %union.
=cut
sub bench_variant_parser ()
{
bench ('list',
qw(
[
%d variant
&
[ #d ONE_STAGE_BUILD | %d lex_symbol ]
]
)
);
}
############################################################################
sub help ($)
{
my ($verbose) = @_;
use Pod::Usage;
# See <URL:http://perldoc.perl.org/pod2man.html#NOTES>.
pod2usage( { -message => "Bench Bison parsers",
-exitval => 0,
-verbose => $verbose,
-output => \*STDOUT });
}
######################################################################
# The end of the directives to parse.
my $eod = "end of directives";
# The list of tokens parsed by the following functions.
my @token;
# eat ($EXPECTED)
# ---------------
# Check that the current token is $EXPECTED, and move to the next.
sub eat ($)
{
my ($expected) = @_;
die "expected $expected, unexpected: $token[0] (@token)\n"
unless $token[0] eq $expected;
shift @token;
}
# Parse directive specifications:
# expr: term (| term)*
# term: fact (& fact)*
# fact: ( expr ) | [ expr ] | dirs
# dirs: %s SKELETON | #d NAME[=VALUE] | %d NAME[=VALUE] | directive
sub parse (@)
{
@token = (@_, $eod);
verbose 3, "Parsing: @token\n";
my @res = parse_expr ();
eat ($eod);
return @res;
}
sub parse_expr ()
{
my @res = parse_term ();
while ($token[0] eq '|')
{
eat ('|');
# Alternation.
push @res, parse_term ();
}
return @res;
}
sub parse_term ()
{
my @res = parse_fact ();
while ($token[0] eq '&')
{
eat ('&');
# Cartesian product.
my @lhs = @res;
@res = ();
for my $rhs (parse_fact ())
{
for my $lhs (@lhs)
{
push @res, $lhs . ($lhs && $rhs ? "\n" : "") . $rhs;
}
}
}
return @res;
}
sub parse_fact ()
{
my @res;
die "unexpected end of expression"
unless defined $token[0];
if ($token[0] eq '(')
{
eat ('(');
@res = parse_expr ();
eat (')');
}
elsif ($token[0] eq '[')
{
eat ('[');
@res = (parse_expr (), '');
eat (']');
}
else
{
@res = parse_dirs ();
}
return @res;
}
sub parse_dirs ()
{
my @res;
die "unexpected end of expression"
unless defined $token[0];
if ($token[0] eq '#d')
{
eat ('#d');
$token[0] =~ s/(.*?)=(.*)/$1 $2/;
@res = ("%code {\n#define $token[0]\n}");
shift @token;
}
elsif ($token[0] eq '%d')
{
shift @token;
$token[0] =~ s/(.*?)=(.*)/$1 "$2"/;
@res = ("%define $token[0]");
shift @token;
}
elsif ($token[0] eq '%s')
{
shift @token;
@res = ("%skeleton \"$token[0]\"");
shift @token;
}
else
{
@res = $token[0];
shift @token;
}
return @res;
}
######################################################################
sub getopt ()
{
use Getopt::Long;
my %option = (
"b|bench=s" => \$bench,
"c|cflags=s" => \$cflags,
"d|directive=s" => \@directive,
"g|grammar=s" => \$grammar,
"h|help" => sub { help ($verbose) },
"i|iterations=i" => \$iterations,
"q|quiet" => sub { --$verbose },
"v|verbose" => sub { ++$verbose },
);
Getopt::Long::Configure ("bundling", "pass_through");
GetOptions (%option)
or exit 1;
}
######################################################################
getopt;
# Create the directory we work in.
mkdir "benches" or die "cannot create benches"
unless -d "benches";
my $count = 1;
++$count
while -d "benches/$count";
my $dir = "benches/$count";
mkdir $dir
or die "cannot create $dir";
chdir $dir
or die "cannot chdir $dir";
# The following message is tailored to please Emacs' compilation-mode.
verbose 1, "Entering directory `$dir'\n";
verbose 1, "Using bison=$bison.\n";
verbose 2, "Using cc=$cc.\n";
verbose 2, "Using cxx=$cxx.\n";
verbose 2, "Using cflags=$cflags.\n";
verbose 2, "Grammar: $grammar\n";
# Support -b: predefined benches.
my %bench =
(
"push" => \&bench_push_parser,
"variant" => \&bench_variant_parser,
);
if (defined $bench)
{
die "invalid argument for --bench: $bench"
unless defined $bench{$bench};
&{$bench{$bench}}();
exit 0;
}
else
{
# Launch the bench marking.
bench ($grammar, @ARGV);
}
### Setup "GNU" style for perl-mode and cperl-mode. ### Setup "GNU" style for perl-mode and cperl-mode.
## Local Variables: ## Local Variables:
-16
View File
@@ -1,16 +0,0 @@
## Copyright (C) 2006, 2008-2009 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/>.
nodist_noinst_SCRIPTS = etc/bench.pl
-152
View File
@@ -1,152 +0,0 @@
#! /usr/bin/perl -w
use strict;
use IO::File;
my $prefix = "lib/";
# 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";
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/(libbison)/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.*)$}
{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;
}
process ("${prefix}gnulib.mk")
### 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
## End:
+2
View File
@@ -0,0 +1,2 @@
Makefile
Makefile.in
+2
View File
@@ -0,0 +1,2 @@
/Makefile
/Makefile.in
+21
View File
@@ -0,0 +1,21 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*-
## Copyright (C) 2005, 2009-2010 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/>.
if BISON_CXX_WORKS
SUBDIRS = calc++
endif
dist_noinst_SCRIPTS = extexi
+3 -3
View File
@@ -1,5 +1,5 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*- ## Process this file with automake to produce Makefile.in -*-Makefile-*-
## Copyright (C) 2005, 2006, 2008, 2009 Free Software Foundation, Inc. ## Copyright (C) 2005-2006, 2009-2010 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,7 +22,7 @@ BISON = $(top_builddir)/tests/bison
BISON_IN = $(top_srcdir)/tests/bison.in BISON_IN = $(top_srcdir)/tests/bison.in
$(BISON): $(BISON_IN) $(BISON): $(BISON_IN)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) tests/bison cd $(top_builddir)/tests && $(MAKE) $(AM_MAKEFLAGS) bison
## ------------ ## ## ------------ ##
## Extracting. ## ## Extracting. ##
@@ -63,7 +63,7 @@ EXTRA_DIST = \
$(srcdir)/calc++-parser.stamp: $(srcdir)/calc++-parser.yy $(BISON_IN) $(srcdir)/calc++-parser.stamp: $(srcdir)/calc++-parser.yy $(BISON_IN)
@rm -f calc++-parser.tmp @rm -f calc++-parser.tmp
@touch calc++-parser.tmp @touch calc++-parser.tmp
$(BISON) -d -ra -o $(srcdir)/calc++-parser.cc \ $(BISON) -d -ra -S lalr1.cc -o $(srcdir)/calc++-parser.cc \
$(srcdir)/calc++-parser.yy $(srcdir)/calc++-parser.yy
@mv -f calc++-parser.tmp $@ @mv -f calc++-parser.tmp $@
+5 -53
View File
@@ -5,42 +5,6 @@ test -z "$VERBOSE" && {
set -x set -x
} }
me=`basename $0`
# Number of the current test.
number=1
# Exit status of this script.
exit=true
# run EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
# ---------------------------------------------------------
run ()
{
# Effective and expected exit status.
local sta_exp=$1
shift
local out_exp=$1
shift
./calc++ "$@" input >out_eff
local sta_eff=$?
local out_eff=`cat out_eff`
if test $sta_eff -eq $sta_exp; then
if test "$out_eff" = "$out_exp"; then
printf "$me: PASS: %2d\n" $number
else
printf "$me: FAIL: %2d (expected output: %s, effective: %s\n" \
$number "$out_exp" "$out_eff"
exit=false
fi
else
printf "$me: FAIL: %2d (expected status: %d, effective: %d\n" \
$number $sta_exp $sta_eff
exit=false
fi
number=`expr $number + 1`
}
cat >input <<EOF cat >input <<EOF
a := 1 a := 1
b := 2 b := 2
@@ -48,32 +12,20 @@ c := 3
d := a + b * c d := a + b * c
d d
EOF EOF
run 0 7
run 0 7 -p
cat >input <<EOF
a := 1
b := 2
c := 3
d := (a + b) * c
d
EOF
run 0 9
./calc++ input
./calc++ -p input
cat >input <<EOF cat >input <<EOF
a := 1 a := 1
d := a + b * c d := a + b * c
EOF EOF
run 1 '' input ./calc++ input
cat >input <<EOF cat >input <<EOF
toto := 1 toto := 1
toto toto
EOF EOF
run 0 1 -s ./calc++ -s input
rm input out_eff rm input
$exit
+1 -1
View File
@@ -1,7 +1,7 @@
# Extract all examples from the manual source. -*- AWK -*- # Extract all examples from the manual source. -*- AWK -*-
# This file is part of GNU Bison # This file is part of GNU Bison
# Copyright (C) 1992, 2000, 2001, 2005, 2006, 2009 Free Software # Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2010 Free 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
-16
View File
@@ -1,16 +0,0 @@
## Copyright (C) 2005, 2008-2009 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/>.
dist_noinst_SCRIPTS = examples/extexi
-124
View File
@@ -1,124 +0,0 @@
%skeleton "lalr1.cc"
%defines
%define parse.assert
%define parse.trace
%define variant
%define lex_symbol
%locations
%code requires // *.hh
{
#include <list>
#include <string>
typedef std::list<std::string> strings_type;
}
%code // *.cc
{
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
// Prototype of the yylex function providing subsequent tokens.
static yy::parser::symbol_type yylex ();
// Printing a list of strings.
// Koening look up will look into std, since that's an std::list.
namespace std
{
std::ostream&
operator<< (std::ostream& o, const strings_type& s)
{
std::copy (s.begin (), s.end (),
std::ostream_iterator<strings_type::value_type> (o, "\n"));
return o;
}
}
// Conversion to string.
template <typename T>
inline
std::string
string_cast (const T& t)
{
std::ostringstream o;
o << t;
return o.str ();
}
}
%token <::std::string> TEXT;
%token <int> NUMBER;
%printer { debug_stream () << $$; }
<int> <::std::string> <::std::list<std::string>>;
%token END_OF_FILE 0;
%type <::std::string> item;
%type <::std::list<std::string>> list;
%%
result:
list { std::cout << $1 << std::endl; }
;
list:
/* nothing */ { /* Generates an empty string list */ }
| list item { std::swap ($$, $1); $$.push_back ($2); }
;
item:
TEXT { std::swap ($$, $1); }
| NUMBER { $$ = string_cast ($1); }
;
%%
// 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
yy::parser::symbol_type
yylex ()
{
static int stage = -1;
++stage;
yy::parser::location_type loc(0, stage + 1, stage + 1);
switch (stage)
{
case 0:
return yy::parser::make_TEXT ("I have three numbers for you.", loc);
case 1:
case 2:
case 3:
return yy::parser::make_NUMBER (stage, loc);
case 4:
return yy::parser::make_TEXT ("And that's all!", loc);
default:
return yy::parser::make_END_OF_FILE (loc);
}
}
// Mandatory error function
void
yy::parser::error (const yy::parser::location_type& loc, const std::string& msg)
{
std::cerr << loc << ": " << msg << std::endl;
}
int
main ()
{
yy::parser p;
p.set_debug_level (!!getenv ("YYDEBUG"));
return p.parse ();
}
// Local Variables:
// mode: C++
// End:
+1 -1
Submodule gnulib updated: 3ef64012bf...102c411be0
+12
View File
@@ -3,6 +3,7 @@ Makefile
Makefile.in Makefile.in
argmatch.c argmatch.c
argmatch.h argmatch.h
basename-lgpl.c
basename.c basename.c
bitrotate.h bitrotate.h
c-ctype.c c-ctype.c
@@ -15,16 +16,23 @@ config.charset
config.h config.h
config.hin config.hin
configmake.h configmake.h
dirname-lgpl.c
dirname.c dirname.c
dirname.h dirname.h
dup-safer.c dup-safer.c
dup2.c
errno.h
errno.in.h errno.in.h
error.c error.c
error.h error.h
exitfail.c exitfail.c
exitfail.h exitfail.h
fcntl.c
fcntl.h
fcntl.in.h
fd-safer.c fd-safer.c
fopen-safer.c fopen-safer.c
fopen.c
getopt.c getopt.c
getopt.h getopt.h
getopt.in.h getopt.in.h
@@ -64,12 +72,16 @@ stamp-h1
stdbool.h stdbool.h
stdbool.in.h stdbool.in.h
stdbool_.h stdbool_.h
stddef.h
stddef.in.h stddef.in.h
stdint.h stdint.h
stdint.in.h stdint.in.h
stdint_.h stdint_.h
stdio--.h stdio--.h
stdio-safer.h stdio-safer.h
stdio-write.c
stdio.h
stdio.in.h
stdlib.h stdlib.h
stdlib.in.h stdlib.in.h
stdlib_.h stdlib_.h
+12
View File
@@ -6,6 +6,7 @@
/Makefile.in /Makefile.in
/argmatch.c /argmatch.c
/argmatch.h /argmatch.h
/basename-lgpl.c
/basename.c /basename.c
/bitrotate.h /bitrotate.h
/c-ctype.c /c-ctype.c
@@ -18,16 +19,23 @@
/config.h /config.h
/config.hin /config.hin
/configmake.h /configmake.h
/dirname-lgpl.c
/dirname.c /dirname.c
/dirname.h /dirname.h
/dup-safer.c /dup-safer.c
/dup2.c
/errno.h
/errno.in.h /errno.in.h
/error.c /error.c
/error.h /error.h
/exitfail.c /exitfail.c
/exitfail.h /exitfail.h
/fcntl.c
/fcntl.h
/fcntl.in.h
/fd-safer.c /fd-safer.c
/fopen-safer.c /fopen-safer.c
/fopen.c
/getopt.c /getopt.c
/getopt.h /getopt.h
/getopt.in.h /getopt.in.h
@@ -67,12 +75,16 @@
/stdbool.h /stdbool.h
/stdbool.in.h /stdbool.in.h
/stdbool_.h /stdbool_.h
/stddef.h
/stddef.in.h /stddef.in.h
/stdint.h /stdint.h
/stdint.in.h /stdint.in.h
/stdint_.h /stdint_.h
/stdio--.h /stdio--.h
/stdio-safer.h /stdio-safer.h
/stdio-write.c
/stdio.h
/stdio.in.h
/stdlib.h /stdlib.h
/stdlib.in.h /stdlib.in.h
/stdlib_.h /stdlib_.h
+46
View File
@@ -0,0 +1,46 @@
# Make bison/lib.
# Copyright (C) 2001-2004, 2006, 2008-2010 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/>.
include gnulib.mk
AM_CFLAGS += $(WARN_CFLAGS)
# Implementation of bitsets.
bitsets_sources = \
abitset.c abitset.h bbitset.h bitset.c bitset.h bitset_stats.c \
bitset_stats.h bitsetv.c bitsetv.h ebitset.c ebitset.h lbitset.c \
lbitset.h libiberty.h vbitset.c vbitset.h
# Additional bitset operations.
additional_bitsets_sources = \
bitsetv-print.h bitsetv-print.c
# timevars, stolen from GCC.
timevars_sources = \
timevar.h timevar.c timevar.def
# Non-gnulib sources in Bison's internal library.
libbison_a_SOURCES += \
get-errno.h get-errno.c \
subpipe.h subpipe.c \
$(bitsets_sources) $(additional_bitsets_sources) $(timevars_sources)
# The Yacc compatibility library.
lib_LIBRARIES = $(YACC_LIBRARY)
EXTRA_LIBRARIES = liby.a
liby_a_SOURCES = main.c yyerror.c
+2 -1
View File
@@ -1,5 +1,6 @@
/* Array bitsets. /* Array bitsets.
Copyright (C) 2002, 2003, 2006, 2009 Free Software Foundation, Inc. Copyright (C) 2002-2003, 2006, 2009-2010 Free Software Foundation,
Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+1 -1
View File
@@ -1,5 +1,5 @@
/* Functions to support abitsets. /* Functions to support abitsets.
Copyright (C) 2002, 2004, 2009 Free Software Foundation, Inc. Copyright (C) 2002, 2004, 2009-2010 Free Software Foundation, Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+1 -1
View File
@@ -1,5 +1,5 @@
/* Base bitset stuff. /* Base bitset stuff.
Copyright (C) 2002, 2003, 2004, 2006, 2009 Free Software Foundation, Copyright (C) 2002-2004, 2006, 2009-2010 Free Software Foundation,
Inc. Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
+1 -2
View File
@@ -1,6 +1,5 @@
/* General bitsets. /* General bitsets.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009 Free Software Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
Foundation, Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+1 -1
View File
@@ -1,5 +1,5 @@
/* Generic bitsets. /* Generic bitsets.
Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc. Copyright (C) 2002-2004, 2009-2010 Free Software Foundation, Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+1 -2
View File
@@ -1,6 +1,5 @@
/* Bitset statistics. /* Bitset statistics.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009 Free Software Copyright (C) 2002-2006, 2009-2010 Free Software Foundation, Inc.
Foundation, Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+1 -1
View File
@@ -1,5 +1,5 @@
/* Functions to support bitset statistics. /* Functions to support bitset statistics.
Copyright (C) 2002, 2003, 2004, 2009 Free Software Foundation, Inc. Copyright (C) 2002-2004, 2009-2010 Free Software Foundation, Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+2 -2
View File
@@ -1,6 +1,6 @@
/* Bitset vectors. /* Bitset vectors.
Copyright (C) 2001, 2002, 2004, 2006, 2009 Free Software Foundation, Copyright (C) 2001-2002, 2004, 2006, 2009-2010 Free Software
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
+1 -1
View File
@@ -1,5 +1,5 @@
/* Bitset vectors. /* Bitset vectors.
Copyright (C) 2002, 2004, 2009 Free Software Foundation, Inc. Copyright (C) 2002, 2004, 2009-2010 Free Software Foundation, Inc.
Contributed by Akim Demaille (akim@freefriends.org). Contributed by Akim Demaille (akim@freefriends.org).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
+1 -1
View File
@@ -1,5 +1,5 @@
/* Bitset vectors. /* Bitset vectors.
Copyright (C) 2001, 2002, 2004, 2005, 2006, 2009 Free Software Copyright (C) 2001-2002, 2004-2006, 2009-2010 Free 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
+1 -1
View File
@@ -1,5 +1,5 @@
/* Bitset vectors. /* Bitset vectors.
Copyright (C) 2002, 2004, 2009 Free Software Foundation, Inc. Copyright (C) 2002, 2004, 2009-2010 Free Software Foundation, Inc.
Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz).
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

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