]> git.saurik.com Git - bison.git/commitdiff
Merge remote-tracking branch 'origin/maint'
authorAkim Demaille <akim@lrde.epita.fr>
Fri, 26 Oct 2012 14:50:26 +0000 (16:50 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Fri, 26 Oct 2012 14:58:55 +0000 (16:58 +0200)
* origin/maint: (46 commits)
  doc: minor style change
  maint: use gendocs's new -I option
  regen
  yacc.c: do not define location support when not using locations
  maint: be compilable with GCC 4.0
  tests: address a warning from GCC 4.4
  tests: don't use options that Clang does not support
  tests: restore the tests on -Werror
  regen
  parse-gram: update the Bison interface
  fix comment
  maint: post-release administrivia
  version 2.6.4
  regen
  2.6.4: botched 2.6.3
  maint: post-release administrivia
  version 2.6.3
  gnulib: update
  tests: check %no-lines
  NEWS: warnings with clang
  ...

Conflicts:
NEWS
TODO
data/c.m4
data/java.m4
doc/Makefile.am
src/getargs.c
src/getargs.h
src/output.c
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
src/reader.h

17 files changed:
1  2 
NEWS
README-hacking
TODO
cfg.mk
configure.ac
data/c.m4
data/java.m4
data/yacc.c
doc/bison.texi
doc/local.mk
gnulib
src/location.h
src/parse-gram.y
src/print_graph.c
src/reader.h
tests/local.at
tests/output.at

diff --combined NEWS
index 346c4da4be17a4481251f5c37c068ed350235235,cb845125c3e30bded6f05e8f162b7d886409e113..a2ea735e8faac7bd3d533ec1044e2649f5f9a920
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -2,246 -2,61 +2,301 @@@ GNU Bison NEW
  
  * Noteworthy changes in release ?.? (????-??-??) [?]
  
 +** Incompatible changes
 +
 +*** Obsolete features
 +
 +  Support for YYFAIL is removed (deprecated in Bison 2.4.2).
 +  Support for yystype and yyltype (instead of YYSTYPE and YYLTYPE)
 +  is removed (deprecated in Bison 1.875).
 +  Support for YYPARSE_PARAM is removed (deprecated in Bison 1.875).
 +
 +** Warnings
 +
 +*** Enhancements of the -Werror option
 +
 +  The -Werror=CATEGORY option is now recognized, and will treat specified
 +  warnings as errors. The warnings need not have been explicitly activated
 +  using the -W option, this is similar to what GCC 4.7 does.
 +
 +  For example, given the following command line, Bison will treat both
 +  warnings related to POSIX Yacc incompatibilities and S/R conflicts as
 +  errors (and only those):
 +
 +    $ bison -Werror=yacc,error=conflicts-sr input.y
 +
 +  If no categories are specified, -Werror will make all active warnings into
 +  errors. For example, the following line does the same the previous example:
 +
 +    $ bison -Werror -Wnone -Wyacc -Wconflicts-sr input.y
 +
 +  (By default -Wconflicts-sr,conflicts-rr,deprecated,other is enabled.)
 +
 +  Note that the categories in this -Werror option may not be prefixed with
 +  "no-". However, -Wno-error[=CATEGORY] is valid.
 +
 +  Note that -y enables -Werror=yacc. Therefore it is now possible to require
 +  Yacc-like behavior (e.g., always generate y.tab.c), but to report
 +  incompatibilities as warnings: "-y -Wno-error=yacc".
 +
 +*** The display of warnings is now richer
 +
 +  The option that controls a given warning is now displayed:
 +
 +    foo.y:4.6: warning: type clash on default action: <foo> != <bar> [-Wother]
 +
 +  In the case of warnings treated as errors, the prefix is changed from
 +  "warning: " to "error: ", and the suffix is displayed, in a manner similar
 +  to GCC, as [-Werror=CATEGORY].
 +
 +  For instance, where the previous version of Bison would report (and exit
 +  with failure):
 +
 +    bison: warnings being treated as errors
 +    input.y:1.1: warning: stray ',' treated as white space
 +
 +  it now reports:
 +
 +    input.y:1.1: error: stray ',' treated as white space [-Werror=other]
 +
 +*** Deprecated constructs
 +
 +  The new 'deprecated' warning category flags obsolete constructs whose
 +  support will be discontinued.  It is enabled by default.  These warnings
 +  used to be reported as 'other' warnings.
 +
 +*** Useless semantic types
 +
 +  Bison now warns about useless (uninhabited) semantic types.  Since
 +  semantic types are not declared to Bison (they are defined in the opaque
 +  %union structure), it is %printer/%destructor directives about useless
 +  types that trigger the warning:
 +
 +    %token <type1> term
 +    %type  <type2> nterm
 +    %printer    {} <type1> <type3>
 +    %destructor {} <type2> <type4>
 +    %%
 +    nterm: term { $$ = $1; };
 +
 +    3.28-34: warning: type <type3> is used, but is not associated to any symbol
 +    4.28-34: warning: type <type4> is used, but is not associated to any symbol
 +
 +*** Undefined but unused symbols
 +
 +  Bison used to raise an error for undefined symbols that are not used in
 +  the grammar.  This is now only a warning.
 +
 +    %printer    {} symbol1
 +    %destructor {} symbol2
 +    %type <type>   symbol3
 +    %%
 +    exp: "a";
 +
 +*** Useless destructors or printers
 +
 +  Bison now warns about useless destructors or printers.  In the following
 +  example, the printer for <type1>, and the destructor for <type2> are
 +  useless: all symbols of <type1> (token1) already have a printer, and all
 +  symbols of type <type2> (token2) already have a destructor.
 +
 +    %token <type1> token1
 +           <type2> token2
 +           <type3> token3
 +           <type4> token4
 +    %printer    {} token1 <type1> <type3>
 +    %destructor {} token2 <type2> <type4>
 +
 +*** Conflicts
 +
 +  The warnings and error messages about shift/reduce and reduce/reduce
 +  conflicts have been normalized.  For instance on the following foo.y file:
 +
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  compare the previous version of bison:
 +
 +    $ bison foo.y
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    $ bison -Werror foo.y
 +    bison: warnings being treated as errors
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +
 +  with the new behavior:
 +
 +    $ bison foo.y
 +    foo.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +    foo.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +    $ bison -Werror foo.y
 +    foo.y: error: 1 shift/reduce conflict [-Werror=conflicts-sr]
 +    foo.y: error: 2 reduce/reduce conflicts [-Werror=conflicts-rr]
 +
 +  When %expect or %expect-rr is used, such as with bar.y:
 +
 +    %expect 0
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  Former behavior:
 +
 +    $ bison bar.y
 +    bar.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    bar.y: expected 0 shift/reduce conflicts
 +    bar.y: expected 0 reduce/reduce conflicts
 +
 +  New one:
 +
 +    $ bison bar.y
 +    bar.y: error: shift/reduce conflicts: 1 found, 0 expected
 +    bar.y: error: reduce/reduce conflicts: 2 found, 0 expected
 +
 +** Additional yylex/yyparse arguments
 +
 +  The new directive %param declares additional arguments to both yylex and
 +  yyparse.  The %lex-param, %parse-param, and %param directives support one
 +  or more arguments.  Instead of
 +
 +    %lex-param   {arg1_type *arg1}
 +    %lex-param   {arg2_type *arg2}
 +    %parse-param {arg1_type *arg1}
 +    %parse-param {arg2_type *arg2}
 +
 +  one may now declare
 +
 +    %param {arg1_type *arg1} {arg2_type *arg2}
 +
 +** Java skeleton improvements
 +
 +  The constants for token names were moved to the Lexer interface.  Also, it
 +  is possible to add code to the parser's constructors using "%code init"
 +  and "%define init_throws".
 +
 +** C++ skeletons improvements
 +
 +*** The parser header is no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Using %defines is now optional.  Without it, the needed support classes
 +  are defined in the generated parser, instead of additional files (such as
 +  location.hh, position.hh and stack.hh).
 +
 +*** Locations are no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Both lalr1.cc and glr.cc no longer require %location.
 +
 +*** syntax_error exception (lalr1.cc)
 +
 +  The C++ parser features a syntax_error exception, which can be
 +  thrown from the scanner or from user rules to raise syntax errors.
 +  This facilitates reporting errors caught in sub-functions (e.g.,
 +  rejecting too large integral literals from a conversion function
 +  used by the scanner, or rejecting invalid combinations from a
 +  factory invoked by the user actions).
 +
 +** Variable api.token.prefix
 +
 +  The variable api.token.prefix changes the way tokens are identified in
 +  the generated files.  This is especially useful to avoid collisions
 +  with identifiers in the target language.  For instance
 +
 +    %token FILE for ERROR
 +    %define api.token.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).
 +
 +** Renamed %define variables
 +
 +  The following variables have been renamed for consistency.  Backward
 +  compatibility is ensured, but upgrading is recommended.
 +
 +    lr.default-reductions      -> lr.default-reduction
 +    lr.keep-unreachable-states -> lr.keep-unreachable-state
 +    namespace                  -> api.namespace
 +
 +** Variable parse.error
 +
 +  This variable controls the verbosity of error messages.  The use of the
 +  %error-verbose directive is deprecated in favor of "%define parse.error
 +  verbose".
 +
 +** Semantic predicates
 +
 +  The new, experimental, semantic-predicate feature allows actions of the
 +  form "%?{ BOOLEAN-EXPRESSION }", which cause syntax errors (as for
 +  YYERROR) if the expression evaluates to 0, and are evaluated immediately
 +  in GLR parsers, rather than being deferred.  The result is that they allow
 +  the programmer to prune possible parses based on the values of run-time
 +  expressions.
 +
 +** The directive %expect-rr is now an error in non GLR mode
 +
 +  It used to be an error only if used in non GLR mode, _and_ if there are
 +  reduce/reduce conflicts.
 +
 +* Noteworthy changes in release ?.? (????-??-??) [?]
 +
+ ** Changes in the format of error messages
+   This used to be the format of many error reports:
+     foo.y:5.10-24: result type clash on merge function 'merge': <t3> != <t2>
+     foo.y:4.13-27: previous declaration
+   It is now:
+     foo.y:5.10-25: result type clash on merge function 'merge': <t3> != <t2>
+     foo.y:4.13-27:     previous declaration
+ ** Exception safety (lalr1.cc)
+   The parse function now catches exceptions, uses the %destructors to
+   release memory (the lookahead symbol and the symbols pushed on the stack)
+   before re-throwing the exception.
+   This feature is somewhat experimental.  User feedback would be
+   appreciated.
+ ** New %define variable: api.location.type (glr.cc, lalr1.cc, lalr1.java)
+   The %define variable api.location.type defines the name of the type to use
+   for locations.  When defined, Bison no longer generates the position.hh
+   and location.hh files, nor does the parser will include them: the user is
+   then responsible to define her type.
+   This can be used in programs with several parsers to factor their location
+   and position files: let one of them generate them, and the others just use
+   them.
+   This feature was actually introduced, but not documented, in Bison 2.5,
+   under the name "location_type" (which is maintained for backward
+   compatibility).
+   For consistency, lalr1.java's %define variables location_type and
+   position_type are deprecated in favor of api.location.type and
+   api.position.type.
+ ** Graphviz improvements
+   The graphical presentation of the states is more readable: their shape is
+   now rectangular, the state number is clearly displayed, and the items are
+   numbered and left-justified.
+   The reductions are now explicitly represented as transitions to other
+   diamond shaped nodes.
+ * Noteworthy changes in release 2.6.4 (2012-10-23) [stable]
+   Bison 2.6.3's --version was incorrect.  This release fixes this issue.
+ * Noteworthy changes in release 2.6.3 (2012-10-22) [stable]
  ** Bug fixes
  
    Bugs and portability issues in the test suite have been fixed.
  
    All the generated headers are self-contained.
  
- ** Changes in the format of error messages
-   This used to be the format of many error reports:
-     foo.y:5.10-24: result type clash on merge function 'merge': <t3> != <t2>
-     foo.y:4.13-27: previous declaration
-   It is now:
-     foo.y:5.10-25: result type clash on merge function 'merge': <t3> != <t2>
-     foo.y:4.13-27:     previous declaration
  ** Header guards (yacc.c, glr.c, glr.cc)
  
    In order to avoid collisions, the header guards are now
  
    will use YY_CALC_LIB_PARSE_H_INCLUDED as guard.
  
- ** Exception safety (lalr1.cc)
-   The parse function now catches exceptions, uses the %destructors to
-   release memory (the lookahead symbol and the symbols pushed on the stack)
-   before re-throwing the exception.
-   This feature is somewhat experimental.  User feedback would be
-   appreciated.
  ** Fix compiler warnings in the generated parser (yacc.c, glr.c)
  
    The compilation of pure parsers (%define api.pure) can trigger GCC
    "function declared 'noreturn' should not return") have also been
    addressed.
  
- ** New %define variable: api.location.type (glr.cc, lalr1.cc, lalr1.java)
-   The %define variable api.location.type defines the name of the type to use
-   for locations.  When defined, Bison no longer generates the position.hh
-   and location.hh files, nor does the parser will include them: the user is
-   then responsible to define her type.
-   This can be used in programs with several parsers to factor their location
-   and position files: let one of them generate them, and the others just use
-   them.
-   This feature was actually introduced, but not documented, in Bison 2.5,
-   under the name "location_type" (which is maintained for backward
-   compatibility).
-   For consistency, lalr1.java's %define variables location_type and
-   position_type are deprecated in favor of api.location.type and
-   api.position.type.
  * Noteworthy changes in release 2.6.2 (2012-08-03) [stable]
  
  ** Bug fixes
  
  * Noteworthy changes in release 2.6.1 (2012-07-30) [stable]
  
 -  Bison no longer executes user-specified M4 code when processing a grammar.
 + Bison no longer executes user-specified M4 code when processing a grammar.
  
  ** Future Changes
  
  
  * Noteworthy changes in release 2.6 (2012-07-19) [stable]
  
- ** Future changes:
 -** Future Changes
++** Future changes
  
    The next major release of Bison will drop support for the following
    deprecated features.  Please report disagreements to bug-bison@gnu.org.
@@@ -2181,8 -1956,8 +2196,8 @@@ along with this program.  If not, see <
   LocalWords:  namespaces strerror const autoconfiguration Dconst Autoconf's FDL
   LocalWords:  Automake TMPDIR LESSEQ ylwrap endif yydebug YYTOKEN YYLSP ival hh
   LocalWords:  extern YYTOKENTYPE TOKENTYPE yytokentype tokentype STYPE lval pdf
 - LocalWords:  lang yyoutput dvi html ps POSIX lvalp llocp calc yyo fval Wmaybe
 - LocalWords:  yyvsp pragmas noreturn java's
 + LocalWords:  lang yyoutput dvi html ps POSIX lvalp llocp Wother nterm arg init
 + LocalWords:  TOK calc yyo fval Wconflicts
  
  Local Variables:
  mode: outline
diff --combined README-hacking
index ff5b4345fc0c17cd033bdcf03ab1e1a6a87b1c72,11b9f82a39fc78dccec2e8f2f179bd380ddbe8c6..716801003d097305624933d4f57058c262de3ba1
@@@ -35,13 -35,6 +35,13 @@@ of the .output file etc.  This exclude
  (comparable to assert/abort), and all the --trace output which is
  meant for the maintainers only.
  
 +** Horizontal tabs
 +Do not add horizontal tab characters to any file in Bison's repository
 +except where required.  For example, do not use tabs to format C code.
 +However, make files, ChangeLog, and some regular expressions require
 +tabs.  Also, test cases might need to contain tabs to check that Bison
 +properly processes tabs in its input.
 +
  
  * Working from the repository
  
@@@ -50,16 -43,17 +50,17 @@@ These requirements do not apply when bu
  
  ** Requirements
  
- We've opted to keep only the highest-level sources in the repository.
This eases our maintenance burden, (fewer merges etc.), but imposes more
+ We've opted to keep only the highest-level sources in the repository.  This
+ eases our maintenance burden, (fewer merges etc.), but imposes more
  requirements on anyone wishing to build from the just-checked-out sources.
  For example, you have to use the latest stable versions of the maintainer
  tools we depend upon, including:
  
- - Automake <http://www.gnu.org/software/automake/>
  - Autoconf <http://www.gnu.org/software/autoconf/>
+ - Automake <http://www.gnu.org/software/automake/>
  - Flex <http://www.gnu.org/software/flex/>
  - Gettext <http://www.gnu.org/software/gettext/>
+ - Graphviz <http://www.graphviz.org>
  - Gzip <http://www.gnu.org/software/gzip/>
  - Perl <http://www.cpan.org/>
  - Rsync <http://samba.anu.edu.au/rsync/>
  Valgrind <http://valgrind.org/> is also highly recommended, if it supports
  your architecture.
  
- Bison is written using Bison grammars, so there are bootstrapping
issues.  The bootstrap script attempts to discover when the C code
- generated from the grammars is out of date, and to bootstrap with an
- out-of-date version of the C code, but the process is not foolproof.
Also, you may run into similar problems yourself if you modify Bison.
+ Bison is written using Bison grammars, so there are bootstrapping issues.
The bootstrap script attempts to discover when the C code generated from the
+ grammars is out of date, and to bootstrap with an out-of-date version of the
+ C code, but the process is not foolproof.  Also, you may run into similar
+ problems yourself if you modify Bison.
  
- Only building the initial full source tree will be a bit painful.
- Later, after synchronizing from the repository a plain 'make' should
- be sufficient.  Note, however, that when gnulib is updated, running
'./bootstrap' again might be needed.
+ Only building the initial full source tree will be a bit painful.  Later,
+ after synchronizing from the repository a plain 'make' should be sufficient.
+ Note, however, that when gnulib is updated, running './bootstrap' again
+ might be needed.
  
  ** First checkout
  
@@@ -175,28 -169,6 +176,28 @@@ decide whether to update
  ** make check
  Use liberally.
  
 +** TESTSUITEFLAGS
 +
 +The default is for make check to run all tests sequentially. This can be
 +very time consumming when checking repeatedly or on slower setups. This can
 +be sped up in two ways:
 +
 +Using -j, in a make-like fashion, for example:
 +  $ make check TESTSUITEFLAGS='-j8'
 +
 +Running only the tests of a certain category, as specified in the AT files
 +with AT_KEYWORDS([[category]]). Categories include:
 +  - c++, for c++ parsers
 +  - deprec, for tests concerning deprecated constructs.
 +  - glr, for glr parsers
 +  - java, for java parsers
 +  - report, for automaton dumps
 +
 +To run a specific set of tests, use -k (for "keyword"). For example:
 +  $ make check TESTSUITEFLAGS='-k c++'
 +
 +Both can be combined.
 +
  ** Typical errors
  If the test suite shows failures such as the following one
  
@@@ -268,9 -240,6 +269,9 @@@ release
    that it does not make sense for glr.c, which should be ANSI, but
    currently is actually GNU C, nor for lalr1.cc.
  
 +- Test with a very recent version of GCC for both C and C++.  Testing
 +  with older versions that are still in use is nice too.
 +
  
  * Release Procedure
  This section needs to be updated to take into account features from
diff --combined TODO
index 40127468d04b52dc2e6b453248c774fc50425b53,978b5c6f4d45fb3664a39e00cd06ec41051e5181..e8509e3cfcf74651f579d6d79f472d7ef339c935
--- 1/TODO
--- 2/TODO
+++ b/TODO
@@@ -1,48 -1,27 +1,60 @@@
  * Short term
+ ** Graphviz display code thoughts
+ The code for the --graph option is over two files: print_graph, and
+ graphviz. I believe this is because Bison used to also produce VCG graphs,
+ but since this is no longer true, maybe we could consider these files for
+ fusion.
+ Little effort factoring seems to have been given to factoring in these files,
+ and their print-xml and print counterpart. We would very much like to re-use
+ the pretty format of states from .output in the .dot
+ Also, the underscore in print_graph.[ch] isn't very fitting considering
+ the dashes in the other filenames.
  
 +** push-parser
 +Check it too when checking the different kinds of parsers.  And be
 +sure to check that the initial-action is performed once per parsing.
 +
 +** m4 names
 +b4_shared_declarations is no longer what it is.  Make it
 +b4_parser_declaration for instance.
 +
 +** yychar in lalr1.cc
 +There is a large difference bw maint and master on the handling of
 +yychar (which was removed in lalr1.cc).  See what needs to be
 +back-ported.
 +
 +
 +    /* User semantic actions sometimes alter yychar, and that requires
 +       that yytoken be updated with the new translation.  We take the
 +       approach of translating immediately before every use of yytoken.
 +       One alternative is translating here after every semantic action,
 +       but that translation would be missed if the semantic action
 +       invokes YYABORT, YYACCEPT, or YYERROR immediately after altering
 +       yychar.  In the case of YYABORT or YYACCEPT, an incorrect
 +       destructor might then be invoked immediately.  In the case of
 +       YYERROR, subsequent parser actions might lead to an incorrect
 +       destructor call or verbose syntax error message before the
 +       lookahead is translated.  */
 +
 +    /* Make sure we have latest lookahead translation.  See comments at
 +       user semantic actions for why this is necessary.  */
 +    yytoken = yytranslate_ (yychar);
 +
 +
 +** $ and others in epilogue
 +A stray $ is a warning in the actions, but an error in the epilogue.
 +IMHO, it should not even be a warning in the epilogue.
 +
 +** stack.hh
 +Get rid of it.  The original idea is nice, but actually it makes
 +the code harder to follow, and uselessly different from the other
 +skeletons.
 +
  ** Variable names.
  What should we name `variant' and `lex_symbol'?
  
 -** Use b4_symbol in all the skeleton
 -Move its definition in the more standard places and deploy it in other
 -skeletons.  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.
  
@@@ -73,6 -52,10 +85,6 @@@ as lr0.cc, why upper case
  Enhance bench.pl with %b to run different bisons.
  
  * Various
 -** Warnings
 -Warnings about type tags that are used in printer and dtors, but not
 -for symbols?
 -
  ** 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
@@@ -118,6 -101,9 +130,6 @@@ so both 256 and 257 are "mysterious"
    "\"end of command\"", "error", "$undefined", "\"=\"", "\"break\"",
  
  
 -** YYFAIL
 -It is seems to be *really* obsolete now, shall we remove it?
 -
  ** yychar == yyempty_
  The code in yyerrlab reads:
  
diff --combined cfg.mk
index e50c6293ee60bc618b92b16eca4bbbe5f20dba0d,9f11f3774aa15fa7ab32c8d7d91a115e8833e7c2..8e5a8e1031868fbf15f05df784f9df0ea960169a
--- 1/cfg.mk
--- 2/cfg.mk
+++ b/cfg.mk
@@@ -24,6 -24,7 +24,7 @@@ regen: _versio
  
  # Used in maint.mk's web-manual rule
  manual_title = The Yacc-compatible Parser Generator
+ gendocs_options_ = -I $(abs_top_srcdir)/doc -I $(abs_top_builddir)/doc
  
  # It's useful to run maintainer-*check* targets during development, but we
  # don't want to wait on a recompile because of an update to $(VERSION).  Thus,
@@@ -36,9 -37,15 +37,9 @@@ url_dir_list = 
    ftp://$(gnu_rel_host)/gnu/bison
  
  # Tests not to run as part of "make distcheck".
 -# Exclude changelog-check here so that there's less churn in ChangeLog
 -# files -- otherwise, you'd need to have the upcoming version number
 -# at the top of the file for each `make distcheck' run.
 -local-checks-to-skip = \
 -  changelog-check \
 +local-checks-to-skip =                        \
    sc_immutable_NEWS                   \
 -  sc_prohibit_always_true_header_tests        \
 -  sc_prohibit_atoi_atof                       \
 -  sc_prohibit_strcmp
 +  sc_prohibit_atoi_atof
  
  # The local directory containing the checked-out copy of gnulib used in
  # this release.  Used solely to get a date for the "announcement" target.
@@@ -66,8 -73,8 +67,8 @@@ $(call exclude,                                                               
    prohibit_defined_have_decl_tests=?|^lib/timevar.c$$                 \
    prohibit_magic_number_exit=^doc/bison.texi$$                                \
    prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$    \
 +  prohibit_strcmp=^doc/bison\.texi$$                                  \
    require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$          \
    space_tab=^tests/(input|c\+\+)\.at$$                                        \
 -  trailing_blank=^src/parse-gram.[ch]$$                                       \
    unmarked_diagnostics=^(djgpp/|doc/bison.texi$$)                     \
  )
diff --combined configure.ac
index d6a86a733ec81a254e2b9d19f6c963afc9ea8a1f,955f56ef790afaf18d96dd625e155d2ea9c1af29..8a297ff52ac8e8ae8731b2ceda8ff08879601517
@@@ -45,9 -45,7 +45,9 @@@ AC_CONFIG_MACRO_DIR([m4]
  # releases, we want to be able run make dist without being required to
  # add a bogus NEWS entry.  In that case, the version string
  # automatically contains a dash, which we also let disable gnits.
 -AM_INIT_AUTOMAKE([1.11.1 dist-xz silent-rules]
 +AM_INIT_AUTOMAKE([1.11.1 dist-xz nostdinc
 +                 color-tests parallel-tests
 +                 silent-rules]
                   m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]],
                             [gnu], [gnits]))
  AM_SILENT_RULES([yes])
@@@ -73,8 -71,19 +73,20 @@@ if test "$enable_gcc_warnings" = yes; t
    warn_c='-Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes
      -Wshadow -Wstrict-prototypes'
    warn_cxx='-Wnoexcept'
 +
    AC_LANG_PUSH([C])
+   # Clang supports many of GCC's -W options, but only issues warnings
+   # on the ones it does not recognize.  In that case, gl_WARN_ADD
+   # thinks the option is supported, and unknown options are then added
+   # to CFLAGS.  But then, when -Werror is added in the test suite for
+   # instance, the warning about the unknown option turns into an
+   # error.
+   #
+   # This should be addressed by gnulib's gl_WARN_ADD, but in the
+   # meanwhile, turn warnings about unknown options into errors in
+   # CFLAGS, and restore CFLAGS after the tests.
+   save_CFLAGS=$CFLAGS
+   gl_WARN_ADD([-Werror=unknown-warning-option], [CFLAGS])
    for i in $warn_common $warn_c;
    do
      gl_WARN_ADD([$i], [WARN_CFLAGS])
    # Warnings for the test suite only.
    gl_WARN_ADD([-Wundef], [WARN_CFLAGS_TEST])
    gl_WARN_ADD([-pedantic], [WARN_CFLAGS_TEST])
+   CFLAGS=$save_CFLAGS
    AC_LANG_POP([C])
  
    AC_LANG_PUSH([C++])
+   save_CXXFLAGS=$CXXFLAGS
+   gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS])
    for i in $warn_common $warn_cxx;
    do
      gl_WARN_ADD([$i], [WARN_CXXFLAGS])
    # Warnings for the test suite only.
    gl_WARN_ADD([-Wundef], [WARN_CXXFLAGS_TEST])
    gl_WARN_ADD([-pedantic], [WARN_CXXFLAGS_TEST])
+   CXXFLAGS=$save_CXXFLAGS
    AC_LANG_POP([C++])
  fi
  
@@@ -108,8 -121,8 +124,8 @@@ AC_ARG_ENABLE([yacc]
    , [enable_yacc=yes])
  case $enable_yacc in
  yes)
 -  YACC_SCRIPT=yacc
 -  YACC_LIBRARY=liby.a;;
 +  YACC_SCRIPT=src/yacc
 +  YACC_LIBRARY=lib/liby.a;;
  *)
    YACC_SCRIPT=
    YACC_LIBRARY=;;
@@@ -118,6 -131,7 +134,7 @@@ AC_SUBST([YACC_SCRIPT]
  AC_SUBST([YACC_LIBRARY])
  
  # Checks for programs.
+ AM_MISSING_PROG([DOT], [dot])
  AC_PROG_LEX
  $LEX_IS_FLEX || AC_MSG_ERROR([Flex is required])
  AC_PROG_YACC
@@@ -167,7 -181,7 +184,7 @@@ AC_CONFIG_FILES([etc/bench.pl], [chmod 
  
  # Initialize the test suite.
  AC_CONFIG_TESTDIR(tests)
 -AC_CONFIG_FILES([tests/Makefile tests/atlocal])
 +AC_CONFIG_FILES([tests/atlocal])
  AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison])
  AC_CHECK_PROGS([VALGRIND], [valgrind])
  case $VALGRIND:$host_os in
@@@ -184,10 -198,17 +201,10 @@@ AM_MISSING_PROG([AUTOM4TE], [autom4te]
  # Needed by tests/atlocal.in.
  AC_SUBST([GCC])
  
 -gt_JAVACOMP([1.3])
 +gt_JAVACOMP([1.3], [1.4])
  gt_JAVAEXEC
  
  AC_CONFIG_FILES([Makefile
 -               build-aux/Makefile
 -               po/Makefile.in
 -               data/Makefile
 -               etc/Makefile
 -               examples/Makefile
 -                  examples/calc++/Makefile
 -               lib/Makefile src/Makefile
 -               doc/Makefile
 -                 doc/yacc.1])
 +                 po/Makefile.in
 +                 doc/yacc.1])
  AC_OUTPUT
diff --combined data/c.m4
index 179743c9f012e674d42bc11c64d822c02831cda8,561900afe8c6fd23f676506ada13b35bff8b45f3..51ffbe3bf6463318605e6e53ad9853e7d2f33ca1
+++ b/data/c.m4
@@@ -51,28 -51,11 +51,28 @@@ m4_define([b4_cpp_guard_close]
  ## Identification.  ##
  ## ---------------- ##
  
 -# b4_comment(TEXT)
 -# ----------------
 -m4_define([b4_comment], [/* m4_bpatsubst([$1], [
 -], [
 -   ])  */])
 +# b4_comment_(TEXT, OPEN, CONTINUE, END)
 +# --------------------------------------
 +# Put TEXT in comment.  Avoid trailing spaces: don't indent empty lines.
 +# Avoid adding indentation to the first line, as the indentation comes
 +# from OPEN.  That's why we don't patsubst([$1], [^\(.\)], [   \1]).
 +#
 +# Prefix all the output lines with PREFIX.
 +m4_define([b4_comment_], [$2[]m4_bpatsubst([$1], [
 +\(.\)], [
 +$3\1])$4])
 +
 +
 +# b4_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_comment],
 +[b4_comment_([$1], [$2/* ], [$2   ], [$2  */])])
 +
  
  # b4_identification
  # -----------------
@@@ -130,7 -113,7 +130,7 @@@ m4_define_default([b4_union_name], [b4_
  # b4_user_args
  # ------------
  m4_define([b4_user_args],
 -[m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])])
 +[m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])])
  
  
  # b4_parse_param
@@@ -154,13 -137,11 +154,13 @@@ m4_popdef([$2])dn
  m4_popdef([$1])dnl
  ])])
  
 -# b4_parse_param_use
 -# ------------------
 -# `YYUSE' all the parse-params.
 +# b4_parse_param_use([VAL], [LOC])
 +# --------------------------------
 +# `YYUSE' VAL, LOC if locations are enabled, and all the parse-params.
  m4_define([b4_parse_param_use],
 -[b4_parse_param_for([Decl], [Formal], [  YYUSE (Formal);
 +[m4_ifvaln([$1], [  YYUSE([$1]);])dnl
 +b4_locations_if([m4_ifvaln([$2], [  YYUSE ([$2]);])])dnl
 +b4_parse_param_for([Decl], [Formal], [  YYUSE (Formal);
  ])dnl
  ])
  
@@@ -182,7 -163,7 +182,7 @@@ m4_define([b4_int_type]
  
         m4_eval([0 <= $1]),                [1], [unsigned int],
  
 -                                             [int])])
 +                                               [int])])
  
  
  # b4_int_type_for(NAME)
@@@ -197,11 -178,12 +197,11 @@@ m4_define([b4_int_type_for]
  # --------------------------------------------
  # 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.
 +# TABLE_min and TABLE_max defined.
  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)]],
 +       [[0]],
         [(!!(($2) == ($3)))])])
  
  
@@@ -230,125 -212,166 +230,125 @@@ m4_define([b4_null_define]
  # Return a null pointer constant.
  m4_define([b4_null], [YY_NULL])
  
 +# 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_ifvaln([$3], [b4_comment([$3], [  ])])dnl
 +static const b4_int_type_for([$2]) yy$1[[]] =
 +{
 +  $2
 +};dnl
 +])
  
  
  ## ------------------------- ##
  ## Assigning token numbers.  ##
  ## ------------------------- ##
  
 -# b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
 -# -----------------------------------------
 +# b4_token_define(TOKEN-NUM)
 +# --------------------------
  # Output the definition of this token as #define.
  m4_define([b4_token_define],
 -[#define $1 $2
 -])
 +[b4_token_format([#define %s %s], [$1])])
  
 -
 -# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 -# -------------------------------------------------------
 -# Output the definition of the tokens (if there are) as #defines.
 +# b4_token_defines
 +# ----------------
 +# Output the definition of the tokens.
  m4_define([b4_token_defines],
 -[m4_if([$#$1], [1], [],
 -[/* Tokens.  */
 -m4_map([b4_token_define], [$@])])
 -])
 +[b4_any_token_visible_if([/* Tokens.  */
 +m4_join([
 +], b4_symbol_map([b4_token_define]))
 +])])
  
  
 -# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
 -# ---------------------------------------
 +# b4_token_enum(TOKEN-NUM)
 +# ------------------------
  # Output the definition of this token as an enum.
  m4_define([b4_token_enum],
 -[$1 = $2])
 +[b4_token_format([%s = %s], [$1])])
  
  
 -# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 -# -----------------------------------------------------
 +# b4_token_enums
 +# --------------
  # Output the definition of the tokens (if there are) as enums.
  m4_define([b4_token_enums],
 -[m4_if([$#$1], [1], [],
 -[[/* Tokens.  */
 +[b4_any_token_visible_if([[/* Tokens.  */
  #ifndef ]b4_api_PREFIX[TOKENTYPE
  # define ]b4_api_PREFIX[TOKENTYPE
 -   /* Put the tokens into the symbol table, so that GDB and other debuggers
 -      know about them.  */
 -   enum ]b4_api_prefix[tokentype {
 -]m4_map_sep([     b4_token_enum], [,
 -],
 -         [$@])[
 -   };
 +  /* Put the tokens into the symbol table, so that GDB and other debuggers
 +     know about them.  */
 +  enum ]b4_api_prefix[tokentype
 +  {
 +    ]m4_join([,
 +    ],
 +             b4_symbol_map([b4_token_enum]))[
 +  };
  #endif
  ]])])
  
  
 -# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 -# -------------------------------------------------------------
 -# Output the definition of the tokens (if there are any) as enums and, if POSIX
 -# Yacc is enabled, as #defines.
 +# b4_token_enums_defines
 +# ----------------------
 +# Output the definition of the tokens (if there are any) as enums and,
 +# if POSIX Yacc is enabled, as #defines.
  m4_define([b4_token_enums_defines],
 -[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], [])
 -])
 +[b4_token_enums[]b4_yacc_if([b4_token_defines])])
  
  
 +## ----------------- ##
 +## Semantic Values.  ##
 +## ----------------- ##
  
 -## --------------------------------------------- ##
 -## Defining C functions in both K&R and ANSI-C.  ##
 -## --------------------------------------------- ##
  
 +# 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]))])
  
 -# b4_modern_c
 -# -----------
 -# A predicate useful in #if to determine whether C is ancient or modern.
 -#
 -# If __STDC__ is defined, the compiler is modern.  IBM xlc 7.0 when run
 -# as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
 -# reasons, but it defines __C99__FUNC__ so check that as well.
 -# Microsoft C normally doesn't define these macros, but it defines _MSC_VER.
 -# Consider a C++ compiler to be modern if it defines __cplusplus.
 -#
 -m4_define([b4_c_modern],
 -  [[(defined __STDC__ || defined __C99__FUNC__ \
 -     || defined __cplusplus || defined _MSC_VER)]])
  
 -# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# ----------------------------------------------------------
 -# Declare the function NAME.
 -m4_define([b4_c_function_def],
 -[#if b4_c_modern
 -b4_c_ansi_function_def($@)
 -#else
 -$2
 -$1 (b4_c_knr_formal_names(m4_shift2($@)))
 -b4_c_knr_formal_decls(m4_shift2($@))
 -#endif[]dnl
 -])
 +
 +## ---------------------- ##
 +## Defining C functions.  ##
 +## ---------------------- ##
  
  
 -# b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# ---------------------------------------------------------------
 -# Declare the function NAME in ANSI.
 -m4_define([b4_c_ansi_function_def],
 +# b4_function_define(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 +# -----------------------------------------------------------
 +# Declare the function NAME in C.
 +m4_define([b4_function_define],
  [$2
 -$1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl
 +$1 (b4_formals(m4_shift2($@)))[]dnl
  ])
  
  
 -# b4_c_ansi_formals([DECL1, NAME1], ...)
 -# --------------------------------------
 -# Output the arguments ANSI-C definition.
 -m4_define([b4_c_ansi_formals],
 +# b4_formals([DECL1, NAME1], ...)
 +# -------------------------------
 +# The formal arguments of a C function definition.
 +m4_define([b4_formals],
  [m4_if([$#], [0], [void],
         [$#$1], [1], [void],
 -             [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
 +               [m4_map_sep([b4_formal], [, ], [$@])])])
  
 -m4_define([b4_c_ansi_formal],
 +m4_define([b4_formal],
  [$1])
  
  
 -# b4_c_knr_formal_names([DECL1, NAME1], ...)
 -# ------------------------------------------
 -# Output the argument names.
 -m4_define([b4_c_knr_formal_names],
 -[m4_map_sep([b4_c_knr_formal_name], [, ], [$@])])
 -
 -m4_define([b4_c_knr_formal_name],
 -[$2])
 -
 -
 -# b4_c_knr_formal_decls([DECL1, NAME1], ...)
 -# ------------------------------------------
 -# Output the K&R argument declarations.
 -m4_define([b4_c_knr_formal_decls],
 -[m4_map_sep([b4_c_knr_formal_decl],
 -          [
 -],
 -          [$@])])
 -
 -m4_define([b4_c_knr_formal_decl],
 -[    $1;])
 -
 -
  
 -## ------------------------------------------------------------ ##
 -## Declaring (prototyping) C functions in both K&R and ANSI-C.  ##
 -## ------------------------------------------------------------ ##
 +## ----------------------- ##
 +## Declaring C functions.  ##
 +## ----------------------- ##
  
  
 -# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# -----------------------------------------------------------
 +# b4_function_declare(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 +# ------------------------------------------------------------
  # Declare the function NAME.
 -m4_define([b4_c_function_decl],
 -[#if defined __STDC__ || defined __cplusplus
 -b4_c_ansi_function_decl($@)
 -#else
 -$2 $1 ();
 -#endif[]dnl
 -])
 -
 -
 -# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# ----------------------------------------------------------------
 -# Declare the function NAME.
 -m4_define([b4_c_ansi_function_decl],
 -[$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl
 +m4_define([b4_function_declare],
 +[$2 $1 (b4_formals(m4_shift2($@)));[]dnl
  ])
  
  
  ## --------------------- ##
  
  
 -# b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 +# b4_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
  # -----------------------------------------------------------
  # Call the function NAME with arguments NAME1, NAME2 etc.
 -m4_define([b4_c_function_call],
 -[$1 (b4_c_args(m4_shift2($@)))[]dnl
 +m4_define([b4_function_call],
 +[$1 (b4_args(m4_shift2($@)))[]dnl
  ])
  
  
 -# b4_c_args([DECL1, NAME1], ...)
 -# ------------------------------
 +# b4_args([DECL1, NAME1], ...)
 +# ----------------------------
  # Output the arguments NAME1, NAME2...
 -m4_define([b4_c_args],
 -[m4_map_sep([b4_c_arg], [, ], [$@])])
 +m4_define([b4_args],
 +[m4_map_sep([b4_arg], [, ], [$@])])
  
 -m4_define([b4_c_arg],
 +m4_define([b4_arg],
  [$2])
  
  
  ## ----------- ##
  
  # b4_sync_start(LINE, FILE)
 -# -----------------------
 +# -------------------------
  m4_define([b4_sync_start], [[#]line $1 $2])
  
  
  m4_define([b4_case],
  [  case $1:
  $2
 +b4_syncline([@oline@], [@ofile@])
      break;])
  
 -# b4_symbol_actions(FILENAME, LINENO,
 -#                   SYMBOL-TAG, SYMBOL-NUM,
 -#                   SYMBOL-ACTION, SYMBOL-TYPENAME)
 -# -------------------------------------------------
 -# Issue the code for a symbol action (e.g., %printer).
 -#
 -# Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are
 -# invoked where $<TYPE-NAME>$ and @$ were specified by the user.
 -m4_define([b4_symbol_actions],
 -[b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl
 -      case $4: /* $3 */
 -b4_syncline([$2], [$1])
 -      $5;
 +
 +# b4_predicate_case(LABEL, CONDITIONS)
 +# ------------------------------------
 +m4_define([b4_predicate_case],
 +[  case $1:
 +    if (! ($2)) YYERROR;
  b4_syncline([@oline@], [@ofile@])
 -      break;
 -b4_dollar_popdef[]dnl
 -])
 +    break;])
  
  
 -# b4_yydestruct_generate(FUNCTION-DECLARATOR)
 -# -------------------------------------------
 -# Generate the "yydestruct" function, which declaration is issued using
 -# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
 -# or "b4_c_function_def" for K&R.
 -m4_define_default([b4_yydestruct_generate],
 +# b4_yydestruct_define
 +# --------------------
 +# Define the "yydestruct" function.
 +m4_define_default([b4_yydestruct_define],
  [[/*-----------------------------------------------.
  | Release the memory associated to this symbol.  |
  `-----------------------------------------------*/
  
 -/*ARGSUSED*/
 -]$1([yydestruct],
 +]b4_function_define([yydestruct],
      [static void],
      [[const char *yymsg],    [yymsg]],
      [[int yytype],           [yytype]],
  b4_locations_if(            [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
 -  YYUSE (yyvaluep);
 -]b4_locations_if([  YYUSE (yylocationp);
 -])dnl
 -b4_parse_param_use[]dnl
 -[
 -  if (!yymsg)
 +]b4_parse_param_use([yyvaluep], [yylocationp])dnl
 +[  if (!yymsg)
      yymsg = "Deleting";
    YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
  
    switch (yytype)
      {
 -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
 -      default:
 -      break;
 +]b4_symbol_foreach([b4_symbol_destructor])dnl
 +[      default:
 +        break;
      }
  }]dnl
  ])
  
  
 -# b4_yy_symbol_print_generate(FUNCTION-DECLARATOR)
 -# ------------------------------------------------
 -# Generate the "yy_symbol_print" function, which declaration is issued using
 -# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
 -# or "b4_c_function_def" for K&R.
 -m4_define_default([b4_yy_symbol_print_generate],
 +# b4_yy_symbol_print_define
 +# -------------------------
 +# Define the "yy_symbol_print" function.
 +m4_define_default([b4_yy_symbol_print_define],
  [[
  /*--------------------------------.
  | Print this symbol on YYOUTPUT.  |
  `--------------------------------*/
  
 -/*ARGSUSED*/
 -]$1([yy_symbol_value_print],
 +]b4_function_define([yy_symbol_value_print],
      [static void],
 -             [[FILE *yyoutput],                       [yyoutput]],
 -             [[int yytype],                           [yytype]],
 -             [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
 +               [[FILE *yyoutput],                       [yyoutput]],
 +               [[int yytype],                           [yytype]],
 +               [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
  b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
    FILE *yyo = yyoutput;
 -  YYUSE (yyo);
 -  if (!yyvaluep)
 -    return;
 -]b4_locations_if([  YYUSE (yylocationp);
 -])dnl
 -b4_parse_param_use[]dnl
 -[# ifdef YYPRINT
 +]b4_parse_param_use([yyo], [yylocationp])dnl
 +[  if (!yyvaluep)
 +    return;]
 +dnl glr.c does not feature yytoknum.
 +m4_if(b4_skeleton, ["yacc.c"],
 +[[# ifdef YYPRINT
    if (yytype < YYNTOKENS)
      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 -# else
 -  YYUSE (yyoutput);
  # endif
 -  switch (yytype)
 +]])dnl
 +[  switch (yytype)
      {
 -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 +]b4_symbol_foreach([b4_symbol_printer])dnl
  [      default:
 -      break;
 +        break;
      }
  }
  
  | Print this symbol on YYOUTPUT.  |
  `--------------------------------*/
  
 -]$1([yy_symbol_print],
 +]b4_function_define([yy_symbol_print],
      [static void],
 -             [[FILE *yyoutput],                       [yyoutput]],
 -             [[int yytype],                           [yytype]],
 -             [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
 +               [[FILE *yyoutput],                       [yyoutput]],
 +               [[int yytype],                           [yytype]],
 +               [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
  b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
@@@ -521,6 -564,7 +521,6 @@@ m4_define([b4_declare_yylstype]
  [m4_if(b4_tag_seen_flag, 0,
  [[typedef int ]b4_api_PREFIX[STYPE;
  # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[
 -# define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */
  # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
  #endif]b4_locations_if([[
  
@@@ -532,6 -576,7 +532,6 @@@ typedef struct ]b4_api_PREFIX[LTYP
    int last_line;
    int last_column;
  } ]b4_api_PREFIX[LTYPE;
 -# define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */
  # define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
  # define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
  #endif]])
@@@ -546,18 -591,18 +546,18 @@@ m4_define([b4_YYDEBUG_define]
  [[/* Enabling traces.  */
  ]m4_if(b4_api_prefix, [yy],
  [[#ifndef YYDEBUG
 -# define YYDEBUG ]b4_debug_flag[
 +# define YYDEBUG ]b4_parse_trace_if([1], [0])[
  #endif]],
  [[#ifndef ]b4_api_PREFIX[DEBUG
  # if defined YYDEBUG
 -#  if YYDEBUG
 +#if YYDEBUG
  #   define ]b4_api_PREFIX[DEBUG 1
  #  else
  #   define ]b4_api_PREFIX[DEBUG 0
  #  endif
  # else /* ! defined YYDEBUG */
 -#  define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[
 +#  define ]b4_api_PREFIX[DEBUG ]b4_parse_trace_if([1], [0])[
- # endif /* ! defined ]b4_api_PREFIX[DEBUG */
+ # endif /* ! defined YYDEBUG */
  #endif  /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
  ])
  
@@@ -581,7 -626,7 +581,7 @@@ m4_define([b4_yylloc_default_define]
  #ifndef YYLLOC_DEFAULT
  # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
      do                                                                  \
 -      if (YYID (N))                                                     \
 +      if (N)                                                            \
          {                                                               \
            (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
            (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
            (Current).first_column = (Current).last_column =              \
              YYRHSLOC (Rhs, 0).last_column;                              \
          }                                                               \
 -    while (YYID (0))
 +    while (0)
  #endif
  ]])
diff --combined data/java.m4
index 2bbd09ac02b74887c60cf31fd40a3f30b6fff0fb,627028b36c8d9252c4c1e7cbc7b774cc87c2a0ab..90d01b3327e0cb3fe1e7874777cc5c78f3c629bc
@@@ -30,7 -30,7 +30,7 @@@ m4_define([b4_comment], [/* m4_bpatsubs
  # --------------------------
  # Join two lists with a comma if necessary.
  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)
@@@ -38,8 -38,8 +38,8 @@@
  # Expand to the value of DEF surrounded by PRE and POST if it's %define'ed,
  # otherwise NOT.
  m4_define([b4_percent_define_get3],
 -        [m4_ifval(m4_quote(b4_percent_define_get([$1])),
 -              [$2[]b4_percent_define_get([$1])[]$3], [$4])])
 +          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
 +                [$2[]b4_percent_define_get([$1])[]$3], [$4])])
  
  
  
@@@ -104,7 -104,7 +104,7 @@@ m4_define([b4_identification]
  m4_define([b4_int_type],
  [m4_if(b4_ints_in($@,   [-128],   [127]), [1], [byte],
         b4_ints_in($@, [-32768], [32767]), [1], [short],
 -                                             [int])])
 +                                               [int])])
  
  # b4_int_type_for(NAME)
  # ---------------------
@@@ -118,45 -118,27 +118,45 @@@ m4_define([b4_int_type_for]
  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.  ##
  ## ------------------------- ##
  
 -# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
 -# ---------------------------------------
 +# b4_token_enum(TOKEN-NUM)
 +# ------------------------
  # Output the definition of this token as an enum.
  m4_define([b4_token_enum],
 -[  /** Token number, to be returned by the scanner.  */
 -  public static final int $1 = $2;
 -])
 +[b4_token_format([    /** Token number, to be returned by the scanner.  */
 +    static final int %s = %s;
 +], [$1])])
  
 -
 -# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
 -# -----------------------------------------------------
 +# b4_token_enums
 +# --------------
  # Output the definition of the tokens (if there are) as enums.
  m4_define([b4_token_enums],
 -[m4_if([$#$1], [1], [],
 -[/* Tokens.  */
 -m4_map([b4_token_enum], [$@])])
 -])
 +[b4_any_token_visible_if([/* Tokens.  */
 +b4_symbol_foreach([b4_token_enum])])])
  
  # b4-case(ID, CODE)
  # -----------------
@@@ -167,13 -149,6 +167,13 @@@ m4_define([b4_case], [  case $1
    break;
      ])
  
 +# b4_predicate_case(LABEL, CONDITIONS)
 +# ------------------------------------
 +m4_define([b4_predicate_case], [  case $1:
 +     if (! ($2)) YYERROR;
 +    break;
 +    ])
 +
  
  ## ---------------- ##
  ## Default values.  ##
@@@ -194,13 -169,10 +194,13 @@@ m4_define([b4_lex_throws], [b4_percent_
  b4_percent_define_default([[throws]], [])
  m4_define([b4_throws], [b4_percent_define_get([[throws]])])
  
 +b4_percent_define_default([[init_throws]], [])
 +m4_define([b4_init_throws], [b4_percent_define_get([[init_throws]])])
 +
  b4_percent_define_default([[api.location.type]], [Location])
  m4_define([b4_location_type], [b4_percent_define_get([[api.location.type]])])
  
- b4_percent_define_default([[api.position.type]], [Position])])
+ b4_percent_define_default([[api.position.type]], [Position])
  m4_define([b4_position_type], [b4_percent_define_get([[api.position.type]])])
  
  
@@@ -252,16 -224,16 +252,16 @@@ m4_define([b4_lex_param], b4_lex_param
  m4_define([b4_parse_param], b4_parse_param)
  
  # b4_lex_param_decl
 -# -------------------
 +# -----------------
  # Extra formal arguments of the constructor.
  m4_define([b4_lex_param_decl],
  [m4_ifset([b4_lex_param],
            [b4_remove_comma([$1],
 -                         b4_param_decls(b4_lex_param))],
 -        [$1])])
 +                           b4_param_decls(b4_lex_param))],
 +          [$1])])
  
  m4_define([b4_param_decls],
 -        [m4_map([b4_param_decl], [$@])])
 +          [m4_map([b4_param_decl], [$@])])
  m4_define([b4_param_decl], [, $1])
  
  m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)])
  m4_define([b4_parse_param_decl],
  [m4_ifset([b4_parse_param],
            [b4_remove_comma([$1],
 -                         b4_param_decls(b4_parse_param))],
 -        [$1])])
 +                           b4_param_decls(b4_parse_param))],
 +          [$1])])
  
  
  
  # b4_lex_param_call
 -# -------------------
 +# -----------------
  # Delegating the lexer parameters to the lexer constructor.
  m4_define([b4_lex_param_call],
            [m4_ifset([b4_lex_param],
 -                  [b4_remove_comma([$1],
 -                                   b4_param_calls(b4_lex_param))],
 -                  [$1])])
 +                    [b4_remove_comma([$1],
 +                                     b4_param_calls(b4_lex_param))],
 +                    [$1])])
  m4_define([b4_param_calls],
 -        [m4_map([b4_param_call], [$@])])
 +          [m4_map([b4_param_call], [$@])])
  m4_define([b4_param_call], [, $2])
  
  
  # Extra initialisations of the constructor.
  m4_define([b4_parse_param_cons],
            [m4_ifset([b4_parse_param],
 -                  [b4_constructor_calls(b4_parse_param)])])
 +                    [b4_constructor_calls(b4_parse_param)])])
  
  m4_define([b4_constructor_calls],
 -        [m4_map([b4_constructor_call], [$@])])
 +          [m4_map([b4_constructor_call], [$@])])
  m4_define([b4_constructor_call],
 -        [this.$2 = $2;
 -        ])
 +          [this.$2 = $2;
 +          ])
  
  
  
  # Extra instance variables.
  m4_define([b4_parse_param_vars],
            [m4_ifset([b4_parse_param],
 -                  [
 +                    [
      /* User arguments.  */
  b4_var_decls(b4_parse_param)])])
  
  m4_define([b4_var_decls],
 -        [m4_map_sep([b4_var_decl], [
 +          [m4_map_sep([b4_var_decl], [
  ], [$@])])
  m4_define([b4_var_decl],
 -        [    protected final $1;])
 +          [    protected final $1;])
  
  
  
  # -----------------------
  # Expand to either an empty string or "throws THROWS".
  m4_define([b4_maybe_throws],
 -        [m4_ifval($1, [throws $1])])
 +          [m4_ifval($1, [throws $1])])
diff --combined data/yacc.c
index a1d45c43a7b93f0bf170968a392151106469b416,1b3dc752e0dc8819e6abad3217d0a69324486f83..9ff20322700230a903b0ec73d9ca74614f66f055
@@@ -1,12 -1,10 +1,12 @@@
                                                               -*- C -*-
 -
  # Yacc compatible skeleton for Bison
  
  # Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation,
  # Inc.
  
 +m4_pushdef([b4_copyright_years],
 +           [1984, 1989-1990, 2000-2012])
 +
  # 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
@@@ -76,8 -74,8 +76,8 @@@ m4_define([b4_pure_flag]
  # Expand IF-TRUE, if %pure-parser and %parse-param, IF-FALSE otherwise.
  m4_define([b4_yacc_pure_if],
  [b4_pure_if([m4_ifset([b4_parse_param],
 -                    [$1], [$2])],
 -          [$2])])
 +                      [$1], [$2])],
 +            [$2])])
  
  
  # b4_yyerror_args
@@@ -85,7 -83,7 +85,7 @@@
  # Arguments passed to yyerror: user args plus yylloc.
  m4_define([b4_yyerror_args],
  [b4_yacc_pure_if([b4_locations_if([&yylloc, ])])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_lex_param
@@@ -117,7 -115,7 +117,7 @@@ m4_define([b4_int_type]
  
         m4_eval([0 <= $1]),                [1], [unsigned int],
  
 -                                             [int])])
 +                                               [int])])
  
  
  ## ----------------- ##
  # --------------------
  # Expansion of $<TYPE>$.
  m4_define([b4_lhs_value],
 -[(yyval[]m4_ifval([$1], [.$1]))])
 +[b4_symbol_value(yyval, [$1])])
  
  
  # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
  # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
  # symbols on RHS.
  m4_define([b4_rhs_value],
 -[(yyvsp@{($2) - ($1)@}m4_ifval([$3], [.$3]))])
 +          [b4_symbol_value([yyvsp@{b4_subtract([$2], [$1])@}], [$3])])
  
  
  
@@@ -157,7 -155,7 +157,7 @@@ m4_define([b4_lhs_location]
  # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
  # on RHS.
  m4_define([b4_rhs_location],
 -[(yylsp@{($2) - ($1)@})])
 +          [(yylsp@{b4_subtract([$2], [$1])@})])
  
  
  ## -------------- ##
@@@ -261,19 -259,19 +261,19 @@@ enum { YYPUSH_MORE = 4 }
  
  typedef struct ]b4_prefix[pstate ]b4_prefix[pstate;
  
 -]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param)
 -])b4_c_function_decl([b4_prefix[push_parse]], [[int]],
 +]b4_pull_if([b4_function_declare([b4_prefix[parse]], [[int]], b4_parse_param)
 +])b4_function_declare([b4_prefix[push_parse]], [[int]],
    [[b4_prefix[pstate *ps]], [[ps]]]b4_pure_if([,
    [[[int pushed_char]], [[pushed_char]]],
    [[b4_api_PREFIX[STYPE const *pushed_val]], [[pushed_val]]]b4_locations_if([,
    [[b4_api_PREFIX[LTYPE const *pushed_loc]], [[pushed_loc]]]])])m4_ifset([b4_parse_param], [,
    b4_parse_param]))
 -b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]],
 +b4_pull_if([b4_function_declare([b4_prefix[pull_parse]], [[int]],
    [[b4_prefix[pstate *ps]], [[ps]]]m4_ifset([b4_parse_param], [,
    b4_parse_param]))])
 -b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
 +b4_function_declare([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
                      [[[void]], []])
 -b4_c_function_decl([b4_prefix[pstate_delete]], [[void]],
 +b4_function_declare([b4_prefix[pstate_delete]], [[void]],
                     [[b4_prefix[pstate *ps]], [[ps]]])dnl
  ])
  
  # -------------------
  # When not the push parser.
  m4_define([b4_declare_yyparse_],
 -[[#ifdef YYPARSE_PARAM
 -]b4_c_function_decl(b4_prefix[parse], [int],
 -                    [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
 -#else /* ! YYPARSE_PARAM */
 -]b4_c_function_decl(b4_prefix[parse], [int], b4_parse_param)[
 -#endif /* ! YYPARSE_PARAM */]dnl
 -])
 +[b4_function_declare(b4_prefix[parse], [int], b4_parse_param)])
  
  
  # b4_declare_yyparse
@@@ -300,7 -304,7 +300,7 @@@ m4_define([b4_shared_declarations]
  [b4_cpp_guard_open([b4_spec_defines_file])[
  ]b4_declare_yydebug[
  ]b4_percent_code_get([[requires]])[
 -]b4_token_enums_defines(b4_tokens)[
 +]b4_token_enums_defines[
  ]b4_declare_yylstype[
  ]b4_declare_yyparse[
  ]b4_percent_code_get([[provides]])[
  m4_changecom()
  m4_divert_push(0)dnl
  @output(b4_parser_file_name@)@
 -b4_copyright([Bison implementation for Yacc-like parsers in C],
 -             [1984, 1989-1990, 2000-2012])[
 +b4_copyright([Bison implementation for Yacc-like parsers in C])[
  
  /* C LALR(1) parser skeleton written by Richard Stallman, by
     simplifying the original so-called "semantic" parser.  */
@@@ -359,7 -364,7 +359,7 @@@ m4_if(b4_api_prefix, [yy], []
  # undef YYERROR_VERBOSE
  # define YYERROR_VERBOSE 1
  #else
 -# define YYERROR_VERBOSE ]b4_error_verbose_flag[
 +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
  #endif
  
  ]m4_ifval(m4_quote(b4_spec_defines_file),
@@@ -384,8 -389,10 +384,8 @@@ typedef unsigned char yytype_uint8
  
  #ifdef YYTYPE_INT8
  typedef YYTYPE_INT8 yytype_int8;
 -#elif ]b4_c_modern[
 -typedef signed char yytype_int8;
  #else
 -typedef short int yytype_int8;
 +typedef signed char yytype_int8;
  #endif
  
  #ifdef YYTYPE_UINT16
@@@ -405,7 -412,7 +405,7 @@@ typedef short int yytype_int16
  #  define YYSIZE_T __SIZE_TYPE__
  # elif defined size_t
  #  define YYSIZE_T size_t
 -# elif ! defined YYSIZE_T && ]b4_c_modern[
 +# elif ! defined YYSIZE_T
  #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
  #  define YYSIZE_T size_t
  # else
  #endif
  
  /* Suppress unused-variable warnings by "using" E.  */
 -#if ! defined lint || defined __GNUC__
 +#ifdef __GNUC__
  # define YYUSE(E) ((void) (E))
  #else
  # define YYUSE(E) /* empty */
  #endif
  
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
 -#else
 -]b4_c_function_def([YYID], [static int], [[int yyi], [yyi]])[
 -{
 -  return yyi;
 -}
 -#endif
 -
  #if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[
  
  /* The parser invokes alloca or malloc; define the necessary symbols.  */]dnl
@@@ -452,7 -469,7 +452,7 @@@ b4_push_if([], [b4_lac_if([], [
  #    define alloca _alloca
  #   else
  #    define YYSTACK_ALLOC alloca
 -#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
  #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
        /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
  #     ifndef EXIT_SUCCESS
  
  # ifdef YYSTACK_ALLOC
     /* Pacify GCC's `empty if-body' warning.  */
 -#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 +#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
  #  ifndef YYSTACK_ALLOC_MAXIMUM
      /* The OS might guarantee only one guard page at the bottom of the stack,
         and a page size can be as small as 4096 bytes.  So we cannot safely
  #  endif
  #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
         && ! ((defined YYMALLOC || defined malloc) \
 -           && (defined YYFREE || defined free)))
 +             && (defined YYFREE || defined free)))
  #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
  #   ifndef EXIT_SUCCESS
  #    define EXIT_SUCCESS 0
  #  endif
  #  ifndef YYMALLOC
  #   define YYMALLOC malloc
 -#   if ! defined malloc && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#   if ! defined malloc && ! defined EXIT_SUCCESS
  void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
  #   endif
  #  endif
  #  ifndef YYFREE
  #   define YYFREE free
 -#   if ! defined free && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#   if ! defined free && ! defined EXIT_SUCCESS
  void free (void *); /* INFRINGES ON USER NAME SPACE */
  #   endif
  #  endif
  
  #if (! defined yyoverflow \
       && (! defined __cplusplus \
 -       || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 -           && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)))
 +         || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 +             && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)))
  
  /* A type that is properly aligned for any stack member.  */
  union yyalloc
     elements in the stack, and YYPTR gives the new location of the
     stack.  Advance YYPTR to a properly aligned location for the next
     stack.  */
 -# define YYSTACK_RELOCATE(Stack_alloc, Stack)                         \
 -    do                                                                        \
 -      {                                                                       \
 -      YYSIZE_T yynewbytes;                                            \
 -      YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
 -      Stack = &yyptr->Stack_alloc;                                    \
 -      yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 -      yyptr += yynewbytes / sizeof (*yyptr);                          \
 -      }                                                                       \
 -    while (YYID (0))
 +# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
 +    do                                                                  \
 +      {                                                                 \
 +        YYSIZE_T yynewbytes;                                            \
 +        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
 +        Stack = &yyptr->Stack_alloc;                                    \
 +        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 +        yyptr += yynewbytes / sizeof (*yyptr);                          \
 +      }                                                                 \
 +    while (0)
  
  #endif
  
            for (yyi = 0; yyi < (Count); yyi++)   \
              (Dst)[yyi] = (Src)[yyi];            \
          }                                       \
 -      while (YYID (0))
 +      while (0)
  #  endif
  # endif
  #endif /* !YYCOPY_NEEDED */
  #define YYNNTS  ]b4_nterms_number[
  /* YYNRULES -- Number of rules.  */
  #define YYNRULES  ]b4_rules_number[
 -/* YYNRULES -- Number of states.  */
 +/* YYNSTATES -- Number of states.  */
  #define YYNSTATES  ]b4_states_number[
  
 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
 +   by yylex, with out-of-bounds checking.  */
  #define YYUNDEFTOK  ]b4_undef_token_number[
  #define YYMAXUTOK   ]b4_user_token_number_max[
  
 -#define YYTRANSLATE(YYX)                                              \
 +#define YYTRANSLATE(YYX)                                                \
    ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
  
 -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
 +   as returned by yylex, without out-of-bounds checking.  */
  static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
  {
    ]b4_translate[
  };
  
  #if ]b4_api_PREFIX[DEBUG
 -/* 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.  */
 -static const ]b4_int_type_for([b4_rline])[ yyrline[] =
 -{
 -  ]b4_rline[
 -};
 +]b4_integral_parser_table_define([rline], [b4_rline],
 +     [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
  #endif
  
  #if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
@@@ -614,35 -645,105 +614,35 @@@ static const char *const yytname[] 
  #endif
  
  # ifdef YYPRINT
 -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
 -   token YYLEX-NUM.  */
 +/* 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])[ yytoknum[] =
  {
    ]b4_toknum[
  };
  # 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 reduction number in state STATE-NUM.
 -   Performed 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[
 -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 YYTABLE_NINF, syntax error.  */
 -#define YYTABLE_NINF ]b4_table_ninf[
 -static const ]b4_int_type_for([b4_table])[ yytable[] =
 -{
 -  ]b4_table[
 -};
  
  #define yypact_value_is_default(Yystate) \
    ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[
  
 +#define YYTABLE_NINF ]b4_table_ninf[
 +
  #define yytable_value_is_error(Yytable_value) \
    ]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf])[
  
 -static const ]b4_int_type_for([b4_check])[ yycheck[] =
 -{
 -  ]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 yyclearin       (yychar = YYEMPTY)
 +#define YYEMPTY         (-2)
 +#define YYEOF           0
 +
 +#define YYACCEPT        goto yyacceptlab
 +#define YYABORT         goto yyabortlab
 +#define YYERROR         goto yyerrorlab
  
 -#define yyerrok               (yyerrstatus = 0)
 -#define yyclearin     (yychar = YYEMPTY)
 -#define YYEMPTY               (-2)
 -#define YYEOF         0
 -
 -#define YYACCEPT      goto yyacceptlab
 -#define YYABORT               goto yyabortlab
 -#define YYERROR               goto yyerrorlab
 -
 -
 -/* Like YYERROR except do call yyerror.  This remains here temporarily
 -   to ease the transition to the new meaning of YYERROR, for GCC.
 -   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
 -#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)
  
    else                                                          \
      {                                                           \
        yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
 -      YYERROR;                                                        \
 -    }                                                         \
 -while (YYID (0))
 +      YYERROR;                                                  \
 +    }                                                           \
 +while (0)
  
  
 -#define YYTERROR      1
 -#define YYERRCODE     256
 +#define YYTERROR        1
 +#define YYERRCODE       256
  
  ]b4_locations_if([[
  ]b4_yylloc_default_define[
  
  #ifndef YY_LOCATION_PRINT
  # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
 -#  define YY_LOCATION_PRINT(File, Loc)                        \
 -     fprintf (File, "%d.%d-%d.%d",                    \
 -            (Loc).first_line, (Loc).first_column,     \
 -            (Loc).last_line,  (Loc).last_column)
 +#  define YY_LOCATION_PRINT(File, Loc)                  \
 +     fprintf (File, "%d.%d-%d.%d",                      \
 +              (Loc).first_line, (Loc).first_column,     \
 +              (Loc).last_line,  (Loc).last_column)
  # else
  #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
  # endif
- #endif]], [[
- /* This macro is provided for backward compatibility. */
+ #endif]],
+ [[/* This macro is provided for backward compatibility. */
  #ifndef YY_LOCATION_PRINT
  # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
  #endif]])[
  
  
  /* YYLEX -- calling `yylex' with the right arguments.  */
  #ifdef YYLEX_PARAM
  # define YYLEX yylex (]b4_pure_if([&yylval[]b4_locations_if([, &yylloc]), ])[YYLEX_PARAM)
  #else
 -# define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
 +# define YYLEX ]b4_function_call([yylex], [int], b4_lex_param)[
  #endif
  
  /* Enable debugging if requested.  */
  #  define YYFPRINTF fprintf
  # endif
  
 -# define YYDPRINTF(Args)                      \
 -do {                                          \
 -  if (yydebug)                                        \
 -    YYFPRINTF Args;                           \
 -} while (YYID (0))
 -
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                          \
 -do {                                                                    \
 -  if (yydebug)                                                                  \
 -    {                                                                   \
 -      YYFPRINTF (stderr, "%s ", Title);                                         \
 -      yy_symbol_print (stderr,                                                  \
 -                Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
 -      YYFPRINTF (stderr, "\n");                                                 \
 -    }                                                                   \
 -} while (YYID (0))
 -
 -]b4_yy_symbol_print_generate([b4_c_function_def])[
 +# define YYDPRINTF(Args)                        \
 +do {                                            \
 +  if (yydebug)                                  \
 +    YYFPRINTF Args;                             \
 +} while (0)
 +
 +# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
 +do {                                                                      \
 +  if (yydebug)                                                            \
 +    {                                                                     \
 +      YYFPRINTF (stderr, "%s ", Title);                                   \
 +      yy_symbol_print (stderr,                                            \
 +                  Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
 +      YYFPRINTF (stderr, "\n");                                           \
 +    }                                                                     \
 +} while (0)
 +
 +]b4_yy_symbol_print_define[
  
  /*------------------------------------------------------------------.
  | yy_stack_print -- Print the state stack from its BOTTOM up to its |
  | TOP (included).                                                   |
  `------------------------------------------------------------------*/
  
 -]b4_c_function_def([yy_stack_print], [static void],
 -                 [[yytype_int16 *yybottom], [yybottom]],
 -                 [[yytype_int16 *yytop],    [yytop]])[
 +]b4_function_define([yy_stack_print], [static void],
 +                   [[yytype_int16 *yybottom], [yybottom]],
 +                   [[yytype_int16 *yytop],    [yytop]])[
  {
    YYFPRINTF (stderr, "Stack now");
    for (; yybottom <= yytop; yybottom++)
    YYFPRINTF (stderr, "\n");
  }
  
 -# define YY_STACK_PRINT(Bottom, Top)                          \
 -do {                                                          \
 -  if (yydebug)                                                        \
 -    yy_stack_print ((Bottom), (Top));                         \
 -} while (YYID (0))
 +# define YY_STACK_PRINT(Bottom, Top)                            \
 +do {                                                            \
 +  if (yydebug)                                                  \
 +    yy_stack_print ((Bottom), (Top));                           \
 +} while (0)
  
  
  /*------------------------------------------------.
  | Report that the YYRULE is going to be reduced.  |
  `------------------------------------------------*/
  
 -]b4_c_function_def([yy_reduce_print], [static void],
 -                 [[YYSTYPE *yyvsp], [yyvsp]],
 +]b4_function_define([yy_reduce_print], [static void],
 +                   [[yytype_int16 *yyssp], [yyssp]],
 +                   [[YYSTYPE *yyvsp], [yyvsp]],
      b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
 -                 ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
 -                 b4_parse_param]))[
 +                   ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
 +                   b4_parse_param]))[
  {
 +  unsigned long int yylno = yyrline[yyrule];
    int yynrhs = yyr2[yyrule];
    int yyi;
 -  unsigned long int yylno = yyrline[yyrule];
    YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
 -           yyrule - 1, yylno);
 +             yyrule - 1, yylno);
    /* The symbols being reduced.  */
    for (yyi = 0; yyi < yynrhs; yyi++)
      {
        YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 -      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
 -                     &]b4_rhs_value(yynrhs, yyi + 1)[
 -                     ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 -                     b4_user_args[);
 +      yy_symbol_print (stderr,
 +                       yystos[yyssp[yyi + 1 - yynrhs]],
 +                       &]b4_rhs_value(yynrhs, yyi + 1)[
 +                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 +                       b4_user_args[);
        YYFPRINTF (stderr, "\n");
      }
  }
  
 -# define YY_REDUCE_PRINT(Rule)                \
 -do {                                  \
 -  if (yydebug)                                \
 -    yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
 -} while (YYID (0))
 +# define YY_REDUCE_PRINT(Rule)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print (yyssp, yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
 +} while (0)
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
     multiple parsers can coexist.  */
@@@ -802,7 -897,7 +798,7 @@@ int yydebug
  
  
  /* YYINITDEPTH -- initial size of the parser's stacks.  */
 -#ifndef       YYINITDEPTH
 +#ifndef YYINITDEPTH
  # define YYINITDEPTH ]b4_stack_depth_init[
  #endif
  
@@@ -922,7 -1017,7 +918,7 @@@ do 
            goto yyerrlab;                                         \
        }                                                          \
      }                                                            \
 -} while (YYID (0))
 +} while (0)
  
  /* Discard any previous initial lookahead context because of Event,
     which may be a lookahead change or an invalidation of the currently
@@@ -945,7 -1040,7 +941,7 @@@ do 
                     Event "\n");                                          \
        yy_lac_established = 0;                                            \
      }                                                                    \
 -} while (YYID (0))
 +} while (0)
  #else
  # define YY_LAC_DISCARD(Event) yy_lac_established = 0
  #endif
@@@ -1061,7 -1156,7 +1057,7 @@@ yy_lac (yytype_int16 *yyesa, yytype_int
  #   define yystrlen strlen
  #  else
  /* Return the length of YYSTR.  */
 -]b4_c_function_def([yystrlen], [static YYSIZE_T],
 +]b4_function_define([yystrlen], [static YYSIZE_T],
     [[const char *yystr], [yystr]])[
  {
    YYSIZE_T yylen;
  #  else
  /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
     YYDEST.  */
 -]b4_c_function_def([yystpcpy], [static char *],
 +]b4_function_define([yystpcpy], [static char *],
     [[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[
  {
    char *yyd = yydest;
@@@ -1109,27 -1204,27 +1105,27 @@@ yytnamerr (char *yyres, const char *yys
        char const *yyp = yystr;
  
        for (;;)
 -      switch (*++yyp)
 -        {
 -        case '\'':
 -        case ',':
 -          goto do_not_strip_quotes;
 -
 -        case '\\':
 -          if (*++yyp != '\\')
 -            goto do_not_strip_quotes;
 -          /* Fall through.  */
 -        default:
 -          if (yyres)
 -            yyres[yyn] = *yyp;
 -          yyn++;
 -          break;
 -
 -        case '"':
 -          if (yyres)
 -            yyres[yyn] = '\0';
 -          return yyn;
 -        }
 +        switch (*++yyp)
 +          {
 +          case '\'':
 +          case ',':
 +            goto do_not_strip_quotes;
 +
 +          case '\\':
 +            if (*++yyp != '\\')
 +              goto do_not_strip_quotes;
 +            /* Fall through.  */
 +          default:
 +            if (yyres)
 +              yyres[yyn] = *yyp;
 +            yyn++;
 +            break;
 +
 +          case '"':
 +            if (yyres)
 +              yyres[yyn] = '\0';
 +            return yyn;
 +          }
      do_not_strip_quotes: ;
      }
  
@@@ -1168,6 -1263,10 +1164,6 @@@ yysyntax_error (YYSIZE_T *yymsg_alloc, 
    int yycount = 0;
  
    /* There are many possibilities here to consider:
 -     - Assume YYFAIL is not used.  It's too flawed to consider.  See
 -       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
 -       for details.  YYERROR is fine as it does not invoke this
 -       function.
       - If this state is a consistent state with a default action, then
         the only way this function was invoked is if the default action
         is an error action.  In that case, don't check for expected
  }
  #endif /* YYERROR_VERBOSE */
  
 -]b4_yydestruct_generate([b4_c_function_def])[
 +]b4_yydestruct_define[
  
  ]b4_pure_if([], [
  
@@@ -1313,13 -1412,13 +1309,13 @@@ struct yypstat
  
  static char yypstate_allocated = 0;]])b4_pull_if([
  
 -b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[
 +b4_function_define([[yyparse]], [[int]], b4_parse_param)[
  {
    return yypull_parse (YY_NULL]m4_ifset([b4_parse_param],
 -                                  [[, ]b4_c_args(b4_parse_param)])[);
 +                                  [[, ]b4_args(b4_parse_param)])[);
  }
  
 -]b4_c_function_def([[yypull_parse]], [[int]],
 +]b4_function_define([[yypull_parse]], [[int]],
    [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
    b4_parse_param]))[
  {
    do {
      yychar = YYLEX;
      yystatus =
 -      yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[);
 +      yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])[);
    } while (yystatus == YYPUSH_MORE);
    if (!yyps)
      yypstate_delete (yyps_local);
  }]])[
  
  /* Initialize the parser data structure.  */
 -]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
 +]b4_function_define([[yypstate_new]], [[yypstate *]])[
  {
    yypstate *yyps;]b4_pure_if([], [[
    if (yypstate_allocated)
    return yyps;
  }
  
 -]b4_c_function_def([[yypstate_delete]], [[void]],
 +]b4_function_define([[yypstate_delete]], [[void]],
                     [[[yypstate *yyps]], [[yyps]]])[
  {
  #ifndef yyoverflow
  | yypush_parse.  |
  `---------------*/
  
 -]b4_c_function_def([[yypush_parse]], [[int]],
 +]b4_function_define([[yypush_parse]], [[int]],
    [[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
    [[[int yypushed_char]], [[yypushed_char]]],
    [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
  | yyparse.  |
  `----------*/
  
 -#ifdef YYPARSE_PARAM
 -]b4_c_function_def([yyparse], [int],
 -                   [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
 -#else /* ! YYPARSE_PARAM */
 -]b4_c_function_def([yyparse], [int], b4_parse_param)[
 -#endif]])[
 +]b4_function_define([yyparse], [int], b4_parse_param)])[
  {]b4_pure_if([b4_declare_scanner_communication_variables
  ])b4_push_if([b4_pure_if([], [[
    int yypushed_char = yychar;
@@@ -1514,26 -1618,26 +1510,26 @@@ m4_ifdef([b4_at_dollar_used], [[  yylsp
  
  #ifdef yyoverflow
        {
 -      /* Give user a chance to reallocate the stack.  Use copies of
 -         these so that the &'s don't force the real ones into
 -         memory.  */
 -      YYSTYPE *yyvs1 = yyvs;
 -      yytype_int16 *yyss1 = yyss;]b4_locations_if([
 -      YYLTYPE *yyls1 = yyls;])[
 -
 -      /* Each stack pointer address is followed by the size of the
 -         data in use in that stack, in bytes.  This used to be a
 -         conditional around just the two extra args, but that might
 -         be undefined if yyoverflow is a macro.  */
 -      yyoverflow (YY_("memory exhausted"),
 -                  &yyss1, yysize * sizeof (*yyssp),
 -                  &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 -                  &yyls1, yysize * sizeof (*yylsp),])[
 -                  &yystacksize);
 +        /* Give user a chance to reallocate the stack.  Use copies of
 +           these so that the &'s don't force the real ones into
 +           memory.  */
 +        YYSTYPE *yyvs1 = yyvs;
 +        yytype_int16 *yyss1 = yyss;]b4_locations_if([
 +        YYLTYPE *yyls1 = yyls;])[
 +
 +        /* Each stack pointer address is followed by the size of the
 +           data in use in that stack, in bytes.  This used to be a
 +           conditional around just the two extra args, but that might
 +           be undefined if yyoverflow is a macro.  */
 +        yyoverflow (YY_("memory exhausted"),
 +                    &yyss1, yysize * sizeof (*yyssp),
 +                    &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 +                    &yyls1, yysize * sizeof (*yylsp),])[
 +                    &yystacksize);
  ]b4_locations_if([
 -      yyls = yyls1;])[
 -      yyss = yyss1;
 -      yyvs = yyvs1;
 +        yyls = yyls1;])[
 +        yyss = yyss1;
 +        yyvs = yyvs1;
        }
  #else /* no yyoverflow */
  # ifndef YYSTACK_RELOCATE
  # else
        /* Extend the stack our own way.  */
        if (YYMAXDEPTH <= yystacksize)
 -      goto yyexhaustedlab;
 +        goto yyexhaustedlab;
        yystacksize *= 2;
        if (YYMAXDEPTH < yystacksize)
 -      yystacksize = YYMAXDEPTH;
 +        yystacksize = YYMAXDEPTH;
  
        {
 -      yytype_int16 *yyss1 = yyss;
 -      union yyalloc *yyptr =
 -        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 -      if (! yyptr)
 -        goto yyexhaustedlab;
 -      YYSTACK_RELOCATE (yyss_alloc, yyss);
 -      YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 -      YYSTACK_RELOCATE (yyls_alloc, yyls);])[
 +        yytype_int16 *yyss1 = yyss;
 +        union yyalloc *yyptr =
 +          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 +        if (! yyptr)
 +          goto yyexhaustedlab;
 +        YYSTACK_RELOCATE (yyss_alloc, yyss);
 +        YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 +        YYSTACK_RELOCATE (yyls_alloc, yyls);])[
  #  undef YYSTACK_RELOCATE
 -      if (yyss1 != yyssa)
 -        YYSTACK_FREE (yyss1);
 +        if (yyss1 != yyssa)
 +          YYSTACK_FREE (yyss1);
        }
  # endif
  #endif /* no yyoverflow */
        yylsp = yyls + yysize - 1;])[
  
        YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 -                (unsigned long int) yystacksize));
 +                  (unsigned long int) yystacksize));
  
        if (yyss + yystacksize - 1 <= yyssp)
 -      YYABORT;
 +        YYABORT;
      }
  
    YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@@ -1752,9 -1856,9 +1748,9 @@@ yyreduce
    goto yynewstate;
  
  
 -/*------------------------------------.
 -| yyerrlab -- here on detecting error |
 -`------------------------------------*/
 +/*--------------------------------------.
 +| yyerrlab -- here on detecting error |
 +`--------------------------------------*/
  yyerrlab:
    /* Make sure we have latest lookahead translation.  See comments at
       user semantic actions for why this is necessary.  */
    if (yyerrstatus == 3)
      {
        /* If just tried and failed to reuse lookahead token after an
 -       error, discard it.  */
 +         error, discard it.  */
  
        if (yychar <= YYEOF)
 -      {
 -        /* Return failure if at end of input.  */
 -        if (yychar == YYEOF)
 -          YYABORT;
 -      }
 +        {
 +          /* Return failure if at end of input.  */
 +          if (yychar == YYEOF)
 +            YYABORT;
 +        }
        else
 -      {
 -        yydestruct ("Error: discarding",
 -                    yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
 -        yychar = YYEMPTY;
 -      }
 +        {
 +          yydestruct ("Error: discarding",
 +                      yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
 +          yychar = YYEMPTY;
 +        }
      }
  
    /* Else will try to reuse lookahead token after shifting the error
@@@ -1854,29 -1958,29 +1850,29 @@@ yyerrorlab
  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
  `-------------------------------------------------------------*/
  yyerrlab1:
 -  yyerrstatus = 3;    /* Each real token shifted decrements this.  */
 +  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
  
    for (;;)
      {
        yyn = yypact[yystate];
        if (!yypact_value_is_default (yyn))
 -      {
 -        yyn += YYTERROR;
 -        if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
 -          {
 -            yyn = yytable[yyn];
 -            if (0 < yyn)
 -              break;
 -          }
 -      }
 +        {
 +          yyn += YYTERROR;
 +          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
 +            {
 +              yyn = yytable[yyn];
 +              if (0 < yyn)
 +                break;
 +            }
 +        }
  
        /* Pop the current state because it cannot handle the error token.  */
        if (yyssp == yyss)
 -      YYABORT;
 +        YYABORT;
  
  ]b4_locations_if([[      yyerror_range[1] = *yylsp;]])[
        yydestruct ("Error: popping",
 -                yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
 +                  yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
        YYPOPSTACK (1);
        yystate = *yyssp;
        YY_STACK_PRINT (yyss, yyssp);
@@@ -1943,7 -2047,7 +1939,7 @@@ yyreturn
    while (yyssp != yyss)
      {
        yydestruct ("Cleanup: popping",
 -                yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
 +                  yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
        YYPOPSTACK (1);
      }
  #ifndef yyoverflow
@@@ -1959,14 -2063,17 +1955,14 @@@ yypushreturn:]])
    if (yymsg != yymsgbuf)
      YYSTACK_FREE (yymsg);
  #endif
 -  /* Make sure YYID is used.  */
 -  return YYID (yyresult);
 +  return yyresult;
  }
 -
 -
  ]b4_epilogue[]dnl
  b4_defines_if(
  [@output(b4_spec_defines_file@)@
 -b4_copyright([Bison interface for Yacc-like parsers in C],
 -             [1984, 1989-1990, 2000-2012])[
 +b4_copyright([Bison interface for Yacc-like parsers in C])[
  
  ]b4_shared_declarations[
  ]])dnl b4_defines_if
  m4_divert_pop(0)
 +m4_popdef([b4_copyright_years])
diff --combined doc/bison.texi
index 84ec16d9707863fac25fffa911982c7fa5a972ba,8f98aa5e421744eb0f9089a148a2200a5f6120b3..3b9f2da285f48da0385c476484c58abc72aa1e40
@@@ -135,8 -135,7 +135,8 @@@ Writing GLR Parser
  
  * Simple GLR Parsers::     Using GLR parsers on unambiguous grammars.
  * Merging GLR Parses::     Using GLR parsers to resolve ambiguities.
 -* GLR Semantic Actions::   Deferred semantic actions have special concerns.
 +* GLR Semantic Actions::   Considerations for semantic values and deferred actions.
 +* Semantic Predicates::    Controlling a parse with arbitrary computations.
  * Compiler Requirements::  GLR parsers require a modern C compiler.
  
  Examples
@@@ -163,9 -162,9 +163,9 @@@ Reverse Polish Notation Calculato
  
  Grammar Rules for @code{rpcalc}
  
 -* Rpcalc Input::
 -* Rpcalc Line::
 -* Rpcalc Expr::
 +* Rpcalc Input::            Explanation of the @code{input} nonterminal
 +* Rpcalc Line::             Explanation of the @code{line} nonterminal
 +* Rpcalc Expr::             Explanation of the @code{expr} nonterminal
  
  Location Tracking Calculator: @code{ltcalc}
  
@@@ -178,8 -177,6 +178,8 @@@ Multi-Function Calculator: @code{mfcalc
  * Mfcalc Declarations::    Bison declarations for multi-function calculator.
  * Mfcalc Rules::           Grammar rules for the calculator.
  * Mfcalc Symbol Table::    Symbol table management subroutines.
 +* Mfcalc Lexer::           The lexical analyzer.
 +* Mfcalc Main::            The controlling function.
  
  Bison Grammar Files
  
@@@ -276,8 -273,7 +276,8 @@@ The Bison Parser Algorith
  Operator Precedence
  
  * Why Precedence::    An example showing why precedence is needed.
 -* Using Precedence::  How to specify precedence in Bison grammars.
 +* Using Precedence::  How to specify precedence and associativity.
 +* Precedence Only::   How to specify precedence only.
  * Precedence Examples::  How these features are used in the previous example.
  * How Precedence::    How they work.
  
@@@ -298,6 -294,7 +298,7 @@@ Handling Context Dependencie
  Debugging Your Parser
  
  * Understanding::     Understanding the structure of your parser.
+ * Graphviz::          Getting a visual representation of the parser.
  * Tracing::           Tracing the execution of your parser.
  
  Tracing Your Parser
@@@ -774,8 -771,7 +775,8 @@@ merged result
  @menu
  * Simple GLR Parsers::     Using GLR parsers on unambiguous grammars.
  * Merging GLR Parses::     Using GLR parsers to resolve ambiguities.
 -* GLR Semantic Actions::   Deferred semantic actions have special concerns.
 +* GLR Semantic Actions::   Considerations for semantic values and deferred actions.
 +* Semantic Predicates::    Controlling a parse with arbitrary computations.
  * Compiler Requirements::  GLR parsers require a modern C compiler.
  @end menu
  
@@@ -1143,10 -1139,6 +1144,10 @@@ the offending merge
  @node GLR Semantic Actions
  @subsection GLR Semantic Actions
  
 +The nature of GLR parsing and the structure of the generated
 +parsers give rise to certain restrictions on semantic values and actions.
 +
 +@subsubsection Deferred semantic actions
  @cindex deferred semantic actions
  By definition, a deferred semantic action is not performed at the same time as
  the associated reduction.
@@@ -1180,7 -1172,6 +1181,7 @@@ For example, if a semantic action migh
  to invoke @code{yyclearin} (@pxref{Action Features}) or to attempt to free
  memory referenced by @code{yylval}.
  
 +@subsubsection YYERROR
  @findex YYERROR
  @cindex GLR parsers and @code{YYERROR}
  Another Bison feature requiring special consideration is @code{YYERROR}
  initiate error recovery.
  During deterministic GLR operation, the effect of @code{YYERROR} is
  the same as its effect in a deterministic parser.
 -In a deferred semantic action, its effect is undefined.
 -@c The effect is probably a syntax error at the split point.
 +The effect in a deferred action is similar, but the precise point of the
 +error is undefined;  instead, the parser reverts to deterministic operation,
 +selecting an unspecified stack on which to continue with a syntax error.
 +In a semantic predicate (see @ref{Semantic Predicates}) during nondeterministic
 +parsing, @code{YYERROR} silently prunes
 +the parse that invoked the test.
 +
 +@subsubsection Restrictions on semantic values and locations
 +GLR parsers require that you use POD (Plain Old Data) types for
 +semantic values and location types when using the generated parsers as
 +C++ code.
 +
 +@node Semantic Predicates
 +@subsection Controlling a Parse with Arbitrary Predicates
 +@findex %?
 +@cindex Semantic predicates in GLR parsers
 +
 +In addition to the @code{%dprec} and @code{%merge} directives,
 +GLR parsers
 +allow you to reject parses on the basis of arbitrary computations executed
 +in user code, without having Bison treat this rejection as an error
 +if there are alternative parses. (This feature is experimental and may
 +evolve.  We welcome user feedback.)  For example,
 +
 +@example
 +widget:
 +  %?@{  new_syntax @} "widget" id new_args  @{ $$ = f($3, $4); @}
 +| %?@{ !new_syntax @} "widget" id old_args  @{ $$ = f($3, $4); @}
 +;
 +@end example
 +
 +@noindent
 +is one way to allow the same parser to handle two different syntaxes for
 +widgets.  The clause preceded by @code{%?} is treated like an ordinary
 +action, except that its text is treated as an expression and is always
 +evaluated immediately (even when in nondeterministic mode).  If the
 +expression yields 0 (false), the clause is treated as a syntax error,
 +which, in a nondeterministic parser, causes the stack in which it is reduced
 +to die.  In a deterministic parser, it acts like YYERROR.
 +
 +As the example shows, predicates otherwise look like semantic actions, and
 +therefore you must be take them into account when determining the numbers
 +to use for denoting the semantic values of right-hand side symbols.
 +Predicate actions, however, have no defined value, and may not be given
 +labels.
  
 -Also, see @ref{Location Default Action, ,Default Action for Locations}, which
 -describes a special usage of @code{YYLLOC_DEFAULT} in GLR parsers.
 +There is a subtle difference between semantic predicates and ordinary
 +actions in nondeterministic mode, since the latter are deferred.
 +For example, we could try to rewrite the previous example as
 +
 +@example
 +widget:
 +  @{ if (!new_syntax) YYERROR; @}
 +    "widget" id new_args  @{ $$ = f($3, $4); @}
 +|  @{ if (new_syntax) YYERROR; @}
 +    "widget" id old_args   @{ $$ = f($3, $4); @}
 +;
 +@end example
 +
 +@noindent
 +(reversing the sense of the predicate tests to cause an error when they are
 +false).  However, this
 +does @emph{not} have the same effect if @code{new_args} and @code{old_args}
 +have overlapping syntax.
 +Since the mid-rule actions testing @code{new_syntax} are deferred,
 +a GLR parser first encounters the unresolved ambiguous reduction
 +for cases where @code{new_args} and @code{old_args} recognize the same string
 +@emph{before} performing the tests of @code{new_syntax}.  It therefore
 +reports an error.
 +
 +Finally, be careful in writing predicates: deferred actions have not been
 +evaluated, so that using them in a predicate will have undefined effects.
  
  @node Compiler Requirements
  @subsection Considerations when Compiling GLR Parsers
@@@ -1528,13 -1452,11 +1529,13 @@@ The source code for this calculator is 
  Here are the C and Bison declarations for the reverse polish notation
  calculator.  As in C, comments are placed between @samp{/*@dots{}*/}.
  
 +@comment file: rpcalc.y
  @example
  /* Reverse polish notation calculator.  */
  
  %@{
    #define YYSTYPE double
 +  #include <stdio.h>
    #include <math.h>
    int yylex (void);
    void yyerror (char const *);
@@@ -1579,7 -1501,6 +1580,7 @@@ type for numeric constants
  
  Here are the grammar rules for the reverse polish notation calculator.
  
 +@comment file: rpcalc.y
  @example
  @group
  input:
@@@ -1628,9 -1549,9 +1629,9 @@@ main job of most actions.  The semanti
  rule are referred to as @code{$1}, @code{$2}, and so on.
  
  @menu
 -* Rpcalc Input::
 -* Rpcalc Line::
 -* Rpcalc Expr::
 +* Rpcalc Input::            Explanation of the @code{input} nonterminal
 +* Rpcalc Line::             Explanation of the @code{line} nonterminal
 +* Rpcalc Expr::             Explanation of the @code{expr} nonterminal
  @end menu
  
  @node Rpcalc Input
@@@ -1794,7 -1715,6 +1795,7 @@@ A token type code of zero is returned i
  
  Here is the code for the lexical analyzer:
  
 +@comment file: rpcalc.y
  @example
  @group
  /* The lexical analyzer returns a double floating point
@@@ -1843,7 -1763,6 +1844,7 @@@ In keeping with the spirit of this exam
  kept to the bare minimum.  The only requirement is that it call
  @code{yyparse} to start the process of parsing.
  
 +@comment file: rpcalc.y
  @example
  @group
  int
@@@ -1864,7 -1783,6 +1865,7 @@@ always @code{"syntax error"}).  It is u
  @code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so
  here is the definition we will use:
  
 +@comment file: rpcalc.y
  @example
  @group
  #include <stdio.h>
@@@ -1949,15 -1867,15 +1950,15 @@@ example session using @code{rpcalc}
  @example
  $ @kbd{rpcalc}
  @kbd{4 9 +}
 -13
 +@result{} 13
  @kbd{3 7 + 3 4 5 *+-}
 --13
 +@result{} -13
  @kbd{3 7 + 3 4 5 * + - n}              @r{Note the unary minus, @samp{n}}
 -13
 +@result{} 13
  @kbd{5 6 / 4 n +}
 --3.166666667
 +@result{} -3.166666667
  @kbd{3 4 ^}                            @r{Exponentiation}
 -81
 +@result{} 81
  @kbd{^D}                               @r{End-of-file indicator}
  $
  @end example
@@@ -1991,8 -1909,8 +1992,8 @@@ parentheses nested to arbitrary depth
  %token NUM
  %left '-' '+'
  %left '*' '/'
 -%left NEG     /* negation--unary minus */
 -%right '^'    /* exponentiation */
 +%precedence NEG   /* negation--unary minus */
 +%right '^'        /* exponentiation */
  @end group
  
  %% /* The grammar follows.  */
@@@ -2035,16 -1953,15 +2036,16 @@@ In the second section (Bison declaratio
  types and says they are left-associative operators.  The declarations
  @code{%left} and @code{%right} (right associativity) take the place of
  @code{%token} which is used to declare a token type name without
 -associativity.  (These tokens are single-character literals, which
 +associativity/precedence.  (These tokens are single-character literals, which
  ordinarily don't need to be declared.  We declare them here to specify
 -the associativity.)
 +the associativity/precedence.)
  
  Operator precedence is determined by the line ordering of the
  declarations; the higher the line number of the declaration (lower on
  the page or screen), the higher the precedence.  Hence, exponentiation
  has the highest precedence, unary minus (@code{NEG}) is next, followed
 -by @samp{*} and @samp{/}, and so on.  @xref{Precedence, ,Operator
 +by @samp{*} and @samp{/}, and so on.  Unary minus is not associative,
 +only precedence matters (@code{%precedence}. @xref{Precedence, ,Operator
  Precedence}.
  
  The other important new feature is the @code{%prec} in the grammar
@@@ -2148,7 -2065,7 +2149,7 @@@ the same as the declarations for the in
  
  %left '-' '+'
  %left '*' '/'
 -%left NEG
 +%precedence NEG
  %right '^'
  
  %% /* The grammar follows.  */
@@@ -2349,23 -2266,19 +2350,23 @@@ to create named variables, store value
  Here is a sample session with the multi-function calculator:
  
  @example
 +@group
  $ @kbd{mfcalc}
  @kbd{pi = 3.141592653589}
 -3.1415926536
 +@result{} 3.1415926536
 +@end group
 +@group
  @kbd{sin(pi)}
 -0.0000000000
 +@result{} 0.0000000000
 +@end group
  @kbd{alpha = beta1 = 2.3}
 -2.3000000000
 +@result{} 2.3000000000
  @kbd{alpha}
 -2.3000000000
 +@result{} 2.3000000000
  @kbd{ln(alpha)}
 -0.8329091229
 +@result{} 0.8329091229
  @kbd{exp(ln(beta1))}
 -2.3000000000
 +@result{} 2.3000000000
  $
  @end example
  
@@@ -2375,8 -2288,6 +2376,8 @@@ Note that multiple assignment and neste
  * Mfcalc Declarations::    Bison declarations for multi-function calculator.
  * Mfcalc Rules::           Grammar rules for the calculator.
  * Mfcalc Symbol Table::    Symbol table management subroutines.
 +* Mfcalc Lexer::           The lexical analyzer.
 +* Mfcalc Main::            The controlling function.
  @end menu
  
  @node Mfcalc Declarations
@@@ -2388,9 -2299,8 +2389,9 @@@ Here are the C and Bison declarations f
  @example
  @group
  %@{
 -  #include <math.h>  /* For math functions, cos(), sin(), etc.  */
 -  #include "calc.h"  /* Contains definition of `symrec'.  */
 +  #include <stdio.h>  /* For printf, etc. */
 +  #include <math.h>   /* For pow, used in the grammar.  */
 +  #include "calc.h"   /* Contains definition of `symrec'.  */
    int yylex (void);
    void yyerror (char const *);
  %@}
  %right '='
  %left '-' '+'
  %left '*' '/'
 -%left NEG     /* negation--unary minus */
 -%right '^'    /* exponentiation */
 +%precedence NEG /* negation--unary minus */
 +%right '^'      /* exponentiation */
  @end group
  @end example
  
@@@ -2527,11 -2437,23 +2528,11 @@@ symrec *getsym (char const *)
  @end group
  @end example
  
 -The new version of @code{main} includes a call to @code{init_table}, a
 -function that initializes the symbol table.  Here it is, and
 -@code{init_table} as well:
 +The new version of @code{main} will call @code{init_table} to initialize
 +the symbol table:
  
  @comment file: mfcalc.y: 3
  @example
 -#include <stdio.h>
 -
 -@group
 -/* Called by yyparse on error.  */
 -void
 -yyerror (char const *s)
 -@{
 -  printf ("%s\n", s);
 -@}
 -@end group
 -
  @group
  struct init
  @{
  @group
  struct init const arith_fncts[] =
  @{
 -  "sin",  sin,
 -  "cos",  cos,
 -  "atan", atan,
 -  "ln",   log,
 -  "exp",  exp,
 -  "sqrt", sqrt,
 -  0, 0
 +  @{ "atan", atan @},
 +  @{ "cos",  cos  @},
 +  @{ "exp",  exp  @},
 +  @{ "ln",   log  @},
 +  @{ "sin",  sin  @},
 +  @{ "sqrt", sqrt @},
 +  @{ 0, 0 @},
  @};
  @end group
  
@@@ -2560,7 -2482,6 +2561,7 @@@ symrec *sym_table
  
  @group
  /* Put arithmetic functions in table.  */
 +static
  void
  init_table (void)
  @{
      @}
  @}
  @end group
 -
 -@group
 -int
 -main (void)
 -@{
 -  init_table ();
 -  return yyparse ();
 -@}
 -@end group
  @end example
  
  By simply editing the initialization list and adding the necessary include
@@@ -2611,16 -2541,13 +2612,16 @@@ getsym (char const *sym_name
    symrec *ptr;
    for (ptr = sym_table; ptr != (symrec *) 0;
         ptr = (symrec *)ptr->next)
 -    if (strcmp (ptr->name,sym_name) == 0)
 +    if (strcmp (ptr->name, sym_name) == 0)
        return ptr;
    return 0;
  @}
  @end group
  @end example
  
 +@node Mfcalc Lexer
 +@subsection The @code{mfcalc} Lexer
 +
  The function @code{yylex} must now recognize variables, numeric values, and
  the single-character arithmetic operators.  Strings of alphanumeric
  characters with a leading letter are recognized as either variables or
@@@ -2677,6 -2604,7 +2678,6 @@@ yylex (void
        symrec *s;
        int i;
  @end group
 -
        if (!symbuf)
          symbuf = (char *) malloc (length + 1);
  
  @end group
  @end example
  
 +@node Mfcalc Main
 +@subsection The @code{mfcalc} Main
 +
  The error reporting function is unchanged, and the new version of
  @code{main} includes a call to @code{init_table} and sets the @code{yydebug}
  on user demand (@xref{Tracing, , Tracing Your Parser}, for details):
@@@ -4377,8 -4302,7 +4378,8 @@@ Bison will convert this into a @code{#d
  the parser, so that the function @code{yylex} (if it is in this file)
  can use the name @var{name} to stand for this token type's code.
  
 -Alternatively, you can use @code{%left}, @code{%right}, or
 +Alternatively, you can use @code{%left}, @code{%right},
 +@code{%precedence}, or
  @code{%nonassoc} instead of @code{%token}, if you wish to specify
  associativity and precedence.  @xref{Precedence Decl, ,Operator
  Precedence}.
@@@ -4454,8 -4378,7 +4455,8 @@@ of ``$end''
  @cindex declaring operator precedence
  @cindex operator precedence, declaring
  
 -Use the @code{%left}, @code{%right} or @code{%nonassoc} declaration to
 +Use the @code{%left}, @code{%right}, @code{%nonassoc}, or
 +@code{%precedence} declaration to
  declare a token and specify its precedence and associativity, all at
  once.  These are called @dfn{precedence declarations}.
  @xref{Precedence, ,Operator Precedence}, for general information on
@@@ -4491,10 -4414,6 +4492,10 @@@ left-associativity (grouping @var{x} wi
  means that @samp{@var{x} @var{op} @var{y} @var{op} @var{z}} is
  considered a syntax error.
  
 +@code{%precedence} gives only precedence to the @var{symbols}, and
 +defines no associativity at all.  Use this to define precedence only,
 +and leave any potential conflict due to associativity enabled.
 +
  @item
  The precedence of an operator determines how it nests with other operators.
  All the tokens declared in a single precedence declaration have equal
@@@ -4960,7 -4879,7 +4961,7 @@@ statically allocated variables for comm
  including @code{yylval} and @code{yylloc}.)
  
  Alternatively, you can generate a pure, reentrant parser.  The Bison
 -declaration @code{%define api.pure} says that you want the parser to be
 +declaration @samp{%define api.pure} says that you want the parser to be
  reentrant.  It looks like this:
  
  @example
@@@ -5064,14 -4983,14 +5065,14 @@@ for use by the next invocation of the @
  
  Bison also supports both the push parser interface along with the pull parser
  interface in the same generated parser.  In order to get this functionality,
 -you should replace the @code{%define api.push-pull push} declaration with the
 -@code{%define api.push-pull both} declaration.  Doing this will create all of
 +you should replace the @samp{%define api.push-pull push} declaration with the
 +@samp{%define api.push-pull both} declaration.  Doing this will create all of
  the symbols mentioned earlier along with the two extra symbols, @code{yyparse}
  and @code{yypull_parse}.  @code{yyparse} can be used exactly as it normally
  would be used.  However, the user should note that it is implemented in the
  generated parser by calling @code{yypull_parse}.
  This makes the @code{yyparse} function that is generated with the
 -@code{%define api.push-pull both} declaration slower than the normal
 +@samp{%define api.push-pull both} declaration slower than the normal
  @code{yyparse} function.  If the user
  calls the @code{yypull_parse} function it will parse the rest of the input
  stream.  It is possible to @code{yypush_parse} tokens to select a subgrammar
@@@ -5087,9 -5006,9 +5088,9 @@@ yypull_parse (ps); /* Will call the lex
  yypstate_delete (ps);
  @end example
  
 -Adding the @code{%define api.pure} declaration does exactly the same thing to
 -the generated parser with @code{%define api.push-pull both} as it did for
 -@code{%define api.push-pull push}.
 +Adding the @samp{%define api.pure} declaration does exactly the same thing to
 +the generated parser with @samp{%define api.push-pull both} as it did for
 +@samp{%define api.push-pull push}.
  
  @node Decl Summary
  @subsection Bison Declaration Summary
@@@ -5162,8 -5081,10 +5163,8 @@@ default location or at the location spe
  @end deffn
  
  @deffn {Directive} %debug
 -In the parser implementation file, define the macro @code{YYDEBUG} (or
 -@code{@var{prefix}DEBUG} with @samp{%define api.prefix @var{prefix}}, see
 -@ref{Multiple Parsers, ,Multiple Parsers in the Same Program}) to 1 if it is
 -not already defined, so that the debugging facilities are compiled.
 +Instrument the parser for traces.  Obsoleted by @samp{%define
 +parse.trace}.
  @xref{Tracing, ,Tracing Your Parser}.
  @end deffn
  
@@@ -5259,22 -5180,6 +5260,22 @@@ grammar does not use it, using @samp{%l
  accurate syntax error messages.
  @end deffn
  
 +@deffn {Directive} %name-prefix "@var{prefix}"
 +Rename the external symbols used in the parser so that they start with
 +@var{prefix} instead of @samp{yy}.  The precise list of symbols renamed
 +in C parsers
 +is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs},
 +@code{yylval}, @code{yychar}, @code{yydebug}, and
 +(if locations are used) @code{yylloc}.  If you use a push parser,
 +@code{yypush_parse}, @code{yypull_parse}, @code{yypstate},
 +@code{yypstate_new} and @code{yypstate_delete} will
 +also be renamed.  For example, if you use @samp{%name-prefix "c_"}, the
 +names become @code{c_parse}, @code{c_lex}, and so on.
 +For C++ parsers, see the @samp{%define api.namespace} documentation in this
 +section.
 +@xref{Multiple Parsers, ,Multiple Parsers in the Same Program}.
 +@end deffn
 +
  @ifset defaultprec
  @deffn {Directive} %no-default-prec
  Do not assign a precedence to rules lacking an explicit @code{%prec}
@@@ -5298,7 -5203,7 +5299,7 @@@ Specify @var{file} for the parser imple
  @end deffn
  
  @deffn {Directive} %pure-parser
 -Deprecated version of @code{%define api.pure} (@pxref{%define
 +Deprecated version of @samp{%define api.pure} (@pxref{%define
  Summary,,api.pure}), for which Bison is more careful to warn about
  unreasonable usage.
  @end deffn
@@@ -5421,59 -5326,7 +5422,59 @@@ Summary,,%skeleton})
  Unaccepted @var{variable}s produce an error.
  Some of the accepted @var{variable}s are:
  
 -@itemize @bullet
 +@table @code
 +@c ================================================== api.namespace
 +@item api.namespace
 +@findex %define api.namespace
 +@itemize
 +@item Languages(s): C++
 +
 +@item Purpose: Specify the namespace for the parser class.
 +For example, if you specify:
 +
 +@example
 +%define api.namespace "foo::bar"
 +@end example
 +
 +Bison uses @code{foo::bar} verbatim in references such as:
 +
 +@example
 +foo::bar::parser::semantic_type
 +@end example
 +
 +However, to open a namespace, Bison removes any leading @code{::} and then
 +splits on any remaining occurrences:
 +
 +@example
 +namespace foo @{ namespace bar @{
 +  class position;
 +  class location;
 +@} @}
 +@end example
 +
 +@item Accepted Values:
 +Any absolute or relative C++ namespace reference without a trailing
 +@code{"::"}.  For example, @code{"foo"} or @code{"::foo::bar"}.
 +
 +@item Default Value:
 +The value specified by @code{%name-prefix}, which defaults to @code{yy}.
 +This usage of @code{%name-prefix} is for backward compatibility and can
 +be confusing since @code{%name-prefix} also specifies the textual prefix
 +for the lexical analyzer function.  Thus, if you specify
 +@code{%name-prefix}, it is best to also specify @samp{%define
 +api.namespace} so that @code{%name-prefix} @emph{only} affects the
 +lexical analyzer function.  For example, if you specify:
 +
 +@example
 +%define api.namespace "foo"
 +%name-prefix "bar::"
 +@end example
 +
 +The parser namespace is @code{foo} and @code{yylex} is referenced as
 +@code{bar::lex}.
 +@end itemize
 +@c namespace
 +
  @c ================================================== api.location.type
  @item @code{api.location.type}
  @findex %define api.location.type
  @end itemize
  
  @c ================================================== api.prefix
 -@item @code{api.prefix}
 +@item api.prefix
  @findex %define api.prefix
  
  @itemize @bullet
  @end itemize
  
  @c ================================================== api.pure
 -@item @code{api.pure}
 +@item api.pure
  @findex %define api.pure
  
  @itemize @bullet
  
  @item Default Value: @code{false}
  @end itemize
 +@c api.pure
 +
  
 -@c ================================================== api.push-pull
  
 -@item @code{api.push-pull}
 +@c ================================================== api.push-pull
 +@item api.push-pull
  @findex %define api.push-pull
  
  @itemize @bullet
@@@ -5542,76 -5393,11 +5543,76 @@@ More user feedback will help to stabili
  
  @item Default Value: @code{pull}
  @end itemize
 +@c api.push-pull
 +
 +
 +
 +@c ================================================== api.token.prefix
 +@item api.token.prefix
 +@findex %define api.token.prefix
 +
 +@itemize
 +@item Languages(s): all
 +
 +@item Purpose:
 +Add a prefix to the token names when generating their definition in the
 +target language.  For instance
 +
 +@example
 +%token FILE for ERROR
 +%define api.token.prefix "TOK_"
 +%%
 +start: FILE for ERROR;
 +@end example
 +
 +@noindent
 +generates the definition of the symbols @code{TOK_FILE}, @code{TOK_for},
 +and @code{TOK_ERROR} in the generated source files.  In particular, the
 +scanner must use these prefixed token names, while the grammar itself
 +may still use the short names (as in the sample rule given above).  The
 +generated informational files (@file{*.output}, @file{*.xml},
 +@file{*.dot}) are not modified by this prefix.  See @ref{Calc++ Parser}
 +and @ref{Calc++ Scanner}, for a complete example.
 +
 +@item Accepted Values:
 +Any string.  Should be a valid identifier prefix in the target language,
 +in other words, it should typically be an identifier itself (sequence of
 +letters, underscores, and ---not at the beginning--- digits).
 +
 +@item Default Value:
 +empty
 +@item History:
 +introduced in Bison 2.8
 +@end itemize
 +@c api.token.prefix
  
 -@c ================================================== lr.default-reductions
  
 -@item @code{lr.default-reductions}
 -@findex %define lr.default-reductions
 +@c ================================================== lex_symbol
 +@item lex_symbol
 +@findex %define lex_symbol
 +
 +@itemize @bullet
 +@item Language(s):
 +C++
 +
 +@item Purpose:
 +When variant-based semantic values are enabled (@pxref{C++ Variants}),
 +request that symbols be handled as a whole (type, value, and possibly
 +location) in the scanner.  @xref{Complete Symbols}, for details.
 +
 +@item Accepted Values:
 +Boolean.
 +
 +@item Default Value:
 +@code{false}
 +@end itemize
 +@c lex_symbol
 +
 +
 +@c ================================================== lr.default-reduction
 +
 +@item lr.default-reduction
 +@findex %define lr.default-reduction
  
  @itemize @bullet
  @item Language(s): all
@@@ -5627,15 -5413,12 +5628,15 @@@ feedback will help to stabilize it.
  @item @code{accepting} if @code{lr.type} is @code{canonical-lr}.
  @item @code{most} otherwise.
  @end itemize
 +@item History:
 +introduced as @code{lr.default-reduction} in 2.5, renamed as
 +@code{lr.default-reduction} in 2.8.
  @end itemize
  
 -@c ============================================ lr.keep-unreachable-states
 +@c ============================================ lr.keep-unreachable-state
  
 -@item @code{lr.keep-unreachable-states}
 -@findex %define lr.keep-unreachable-states
 +@item lr.keep-unreachable-state
 +@findex %define lr.keep-unreachable-state
  
  @itemize @bullet
  @item Language(s): all
@@@ -5644,14 -5427,10 +5645,14 @@@ remain in the parser tables.  @xref{Unr
  @item Accepted Values: Boolean
  @item Default Value: @code{false}
  @end itemize
 +introduced as @code{lr.keep_unreachable_states} in 2.3b, renamed as
 +@code{lr.keep-unreachable-state} in 2.5, and as
 +@code{lr.keep-unreachable-state} in 2.8.
 +@c lr.keep-unreachable-state
  
  @c ================================================== lr.type
  
 -@item @code{lr.type}
 +@item lr.type
  @findex %define lr.type
  
  @itemize @bullet
@@@ -5666,62 -5445,62 +5667,62 @@@ More user feedback will help to stabili
  @item Default Value: @code{lalr}
  @end itemize
  
 -@c ================================================== namespace
  
 -@item @code{namespace}
 +@c ================================================== namespace
 +@item namespace
  @findex %define namespace
 +Obsoleted by @code{api.namespace}
 +@c namespace
  
 -@itemize
 -@item Languages(s): C++
  
 -@item Purpose: Specify the namespace for the parser class.
 -For example, if you specify:
 +@c ================================================== parse.assert
 +@item parse.assert
 +@findex %define parse.assert
  
 -@smallexample
 -%define namespace "foo::bar"
 -@end smallexample
 +@itemize
 +@item Languages(s): C++
  
 -Bison uses @code{foo::bar} verbatim in references such as:
 +@item Purpose: Issue runtime assertions to catch invalid uses.
 +In C++, when variants are used (@pxref{C++ Variants}), symbols must be
 +constructed and
 +destroyed properly.  This option checks these constraints.
  
 -@smallexample
 -foo::bar::parser::semantic_type
 -@end smallexample
 +@item Accepted Values: Boolean
  
 -However, to open a namespace, Bison removes any leading @code{::} and then
 -splits on any remaining occurrences:
 +@item Default Value: @code{false}
 +@end itemize
 +@c parse.assert
  
 -@smallexample
 -namespace foo @{ namespace bar @{
 -  class position;
 -  class location;
 -@} @}
 -@end smallexample
 -
 -@item Accepted Values: Any absolute or relative C++ namespace reference without
 -a trailing @code{"::"}.
 -For example, @code{"foo"} or @code{"::foo::bar"}.
 -
 -@item Default Value: The value specified by @code{%name-prefix}, which defaults
 -to @code{yy}.
 -This usage of @code{%name-prefix} is for backward compatibility and can be
 -confusing since @code{%name-prefix} also specifies the textual prefix for the
 -lexical analyzer function.
 -Thus, if you specify @code{%name-prefix}, it is best to also specify
 -@code{%define namespace} so that @code{%name-prefix} @emph{only} affects the
 -lexical analyzer function.
 -For example, if you specify:
  
 -@smallexample
 -%define namespace "foo"
 -%name-prefix "bar::"
 -@end smallexample
 +@c ================================================== parse.error
 +@item parse.error
 +@findex %define parse.error
 +@itemize
 +@item Languages(s):
 +all
 +@item Purpose:
 +Control the kind of error messages passed to the error reporting
 +function.  @xref{Error Reporting, ,The Error Reporting Function
 +@code{yyerror}}.
 +@item Accepted Values:
 +@itemize
 +@item @code{simple}
 +Error messages passed to @code{yyerror} are simply @w{@code{"syntax
 +error"}}.
 +@item @code{verbose}
 +Error messages report the unexpected token, and possibly the expected ones.
 +However, this report can often be incorrect when LAC is not enabled
 +(@pxref{LAC}).
 +@end itemize
  
 -The parser namespace is @code{foo} and @code{yylex} is referenced as
 -@code{bar::lex}.
 +@item Default Value:
 +@code{simple}
  @end itemize
 +@c parse.error
 +
  
  @c ================================================== parse.lac
 -@item @code{parse.lac}
 +@item parse.lac
  @findex %define parse.lac
  
  @itemize
@@@ -5732,50 -5511,7 +5733,50 @@@ syntax error handling.  @xref{LAC}
  @item Accepted Values: @code{none}, @code{full}
  @item Default Value: @code{none}
  @end itemize
 +@c parse.lac
 +
 +@c ================================================== parse.trace
 +@item parse.trace
 +@findex %define parse.trace
 +
 +@itemize
 +@item Languages(s): C, C++, Java
 +
 +@item Purpose: Require parser instrumentation for tracing.
 +@xref{Tracing, ,Tracing Your Parser}.
 +
 +In C/C++, define the macro @code{YYDEBUG} (or @code{@var{prefix}DEBUG} with
 +@samp{%define api.prefix @var{prefix}}), see @ref{Multiple Parsers,
 +,Multiple Parsers in the Same Program}) to 1 in the parser implementation
 +file if it is not already defined, so that the debugging facilities are
 +compiled.
 +
 +@item Accepted Values: Boolean
 +
 +@item Default Value: @code{false}
  @end itemize
 +@c parse.trace
 +
 +@c ================================================== variant
 +@item variant
 +@findex %define variant
 +
 +@itemize @bullet
 +@item Language(s):
 +C++
 +
 +@item Purpose:
 +Request variant-based semantic values.
 +@xref{C++ Variants}.
 +
 +@item Accepted Values:
 +Boolean.
 +
 +@item Default Value:
 +@code{false}
 +@end itemize
 +@c variant
 +@end table
  
  
  @node %code Summary
@@@ -5821,7 -5557,7 +5822,7 @@@ file
  Not all qualifiers are accepted for all target languages.  Unaccepted
  qualifiers produce an error.  Some of the accepted qualifiers are:
  
 -@itemize @bullet
 +@table @code
  @item requires
  @findex %code requires
  
@@@ -5885,7 -5621,7 +5886,7 @@@ parser implementation file.  For exampl
  @item Location(s): The parser Java file after any Java package directive and
  before any class definitions.
  @end itemize
 -@end itemize
 +@end table
  
  Though we say the insertion locations are language-dependent, they are
  technically skeleton-dependent.  Writers of non-standard skeletons
@@@ -6047,10 -5783,10 +6048,10 @@@ If you use a reentrant parser, you can 
  parameter information to it in a reentrant way.  To do so, use the
  declaration @code{%parse-param}:
  
 -@deffn {Directive} %parse-param @{@var{argument-declaration}@}
 +@deffn {Directive} %parse-param @{@var{argument-declaration}@} @dots{}
  @findex %parse-param
 -Declare that an argument declared by the braced-code
 -@var{argument-declaration} is an additional @code{yyparse} argument.
 +Declare that one or more
 +@var{argument-declaration} are additional @code{yyparse} arguments.
  The @var{argument-declaration} is used when declaring
  functions or prototypes.  The last identifier in
  @var{argument-declaration} must be the argument name.
  Here's an example.  Write this in the parser:
  
  @example
 -%parse-param @{int *nastiness@}
 -%parse-param @{int *randomness@}
 +%parse-param @{int *nastiness@} @{int *randomness@}
  @end example
  
  @noindent
@@@ -6089,8 -5826,8 +6090,8 @@@ exp: @dots{}    @{ @dots{}; *randomnes
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypush_parse} to parse a single token.  This
 -function is available if either the @code{%define api.push-pull push} or
 -@code{%define api.push-pull both} declaration is used.
 +function is available if either the @samp{%define api.push-pull push} or
 +@samp{%define api.push-pull both} declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
  @deftypefun int yypush_parse (yypstate *yyps)
@@@ -6107,7 -5844,7 +6108,7 @@@ required to finish parsing the grammar
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypull_parse} to parse the rest of the input
 -stream.  This function is available if the @code{%define api.push-pull both}
 +stream.  This function is available if the @samp{%define api.push-pull both}
  declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
@@@ -6123,8 -5860,8 +6124,8 @@@ The value returned by @code{yypull_pars
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypstate_new} to create a new parser instance.
 -This function is available if either the @code{%define api.push-pull push} or
 -@code{%define api.push-pull both} declaration is used.
 +This function is available if either the @samp{%define api.push-pull push} or
 +@samp{%define api.push-pull both} declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
  @deftypefun {yypstate*} yypstate_new (void)
@@@ -6142,8 -5879,8 +6143,8 @@@ allocated
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypstate_delete} to delete a parser instance.
 -function is available if either the @code{%define api.push-pull push} or
 -@code{%define api.push-pull both} declaration is used.
 +function is available if either the @samp{%define api.push-pull push} or
 +@samp{%define api.push-pull both} declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
  @deftypefun void yypstate_delete (yypstate *yyps)
@@@ -6332,7 -6069,7 +6333,7 @@@ The data type of @code{yylloc} has the 
  @node Pure Calling
  @subsection Calling Conventions for Pure Parsers
  
 -When you use the Bison declaration @code{%define api.pure} to request a
 +When you use the Bison declaration @samp{%define api.pure} to request a
  pure, reentrant parser, the global communication variables @code{yylval}
  and @code{yylloc} cannot be used.  (@xref{Pure Decl, ,A Pure (Reentrant)
  Parser}.)  In such parsers the two global variables are replaced by
@@@ -6356,57 -6093,46 +6357,57 @@@ textual locations, then the type @code{
  this case, omit the second argument; @code{yylex} will be called with
  only one argument.
  
 -
 -If you wish to pass the additional parameter data to @code{yylex}, use
 +If you wish to pass additional arguments to @code{yylex}, use
  @code{%lex-param} just like @code{%parse-param} (@pxref{Parser
 -Function}).
 +Function}).  To pass additional arguments to both @code{yylex} and
 +@code{yyparse}, use @code{%param}.
  
 -@deffn {Directive} lex-param @{@var{argument-declaration}@}
 +@deffn {Directive} %lex-param @{@var{argument-declaration}@} @dots{}
  @findex %lex-param
 -Declare that the braced-code @var{argument-declaration} is an
 -additional @code{yylex} argument declaration.
 +Specify that @var{argument-declaration} are additional @code{yylex} argument
 +declarations.  You may pass one or more such declarations, which is
 +equivalent to repeating @code{%lex-param}.
 +@end deffn
 +
 +@deffn {Directive} %param @{@var{argument-declaration}@} @dots{}
 +@findex %param
 +Specify that @var{argument-declaration} are additional
 +@code{yylex}/@code{yyparse} argument declaration.  This is equivalent to
 +@samp{%lex-param @{@var{argument-declaration}@} @dots{} %parse-param
 +@{@var{argument-declaration}@} @dots{}}.  You may pass one or more
 +declarations, which is equivalent to repeating @code{%param}.
  @end deffn
  
  For instance:
  
  @example
 -%parse-param @{int *nastiness@}
 -%lex-param   @{int *nastiness@}
 -%parse-param @{int *randomness@}
 +%lex-param   @{scanner_mode *mode@}
 +%parse-param @{parser_mode *mode@}
 +%param       @{environment_type *env@}
  @end example
  
  @noindent
  results in the following signatures:
  
  @example
 -int yylex   (int *nastiness);
 -int yyparse (int *nastiness, int *randomness);
 +int yylex   (scanner_mode *mode, environment_type *env);
 +int yyparse (parser_mode *mode, environment_type *env);
  @end example
  
 -If @code{%define api.pure} is added:
 +If @samp{%define api.pure} is added:
  
  @example
 -int yylex   (YYSTYPE *lvalp, int *nastiness);
 -int yyparse (int *nastiness, int *randomness);
 +int yylex   (YYSTYPE *lvalp, scanner_mode *mode, environment_type *env);
 +int yyparse (parser_mode *mode, environment_type *env);
  @end example
  
  @noindent
 -and finally, if both @code{%define api.pure} and @code{%locations} are used:
 +and finally, if both @samp{%define api.pure} and @code{%locations} are used:
  
  @example
 -int yylex   (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
 -int yyparse (int *nastiness, int *randomness);
 +int yylex   (YYSTYPE *lvalp, YYLTYPE *llocp,
 +             scanner_mode *mode, environment_type *env);
 +int yyparse (parser_mode *mode, environment_type *env);
  @end example
  
  @node Error Reporting
  @cindex parse error
  @cindex syntax error
  
 -The Bison parser detects a @dfn{syntax error} or @dfn{parse error}
 +The Bison parser detects a @dfn{syntax error} (or @dfn{parse error})
  whenever it reads a token which cannot satisfy any syntax rule.  An
  action in the grammar can also explicitly proclaim an error, using the
  macro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use
@@@ -6428,8 -6154,8 +6429,8 @@@ called by @code{yyparse} whenever a syn
  receives one argument.  For a syntax error, the string is normally
  @w{@code{"syntax error"}}.
  
 -@findex %error-verbose
 -If you invoke the directive @code{%error-verbose} in the Bison declarations
 +@findex %define parse.error
 +If you invoke @samp{%define parse.error verbose} in the Bison declarations
  section (@pxref{Bison Declarations, ,The Bison Declarations Section}), then
  Bison provides a more verbose and specific error message string instead of
  just plain @w{@code{"syntax error"}}.  However, that message sometimes
@@@ -6487,7 -6213,7 +6488,7 @@@ void yyerror (int *nastiness, char cons
  Finally, GLR and Yacc parsers share the same @code{yyerror} calling
  convention for absolutely pure parsers, i.e., when the calling
  convention of @code{yylex} @emph{and} the calling convention of
 -@code{%define api.pure} are pure.
 +@samp{%define api.pure} are pure.
  I.e.:
  
  @example
@@@ -7009,8 -6735,7 +7010,8 @@@ shift and when to reduce
  
  @menu
  * Why Precedence::    An example showing why precedence is needed.
 -* Using Precedence::  How to specify precedence in Bison grammars.
 +* Using Precedence::  How to specify precedence and associativity.
 +* Precedence Only::   How to specify precedence only.
  * Precedence Examples::  How these features are used in the previous example.
  * How Precedence::    How they work.
  @end menu
@@@ -7066,9 -6791,8 +7067,9 @@@ makes right-associativity
  @node Using Precedence
  @subsection Specifying Operator Precedence
  @findex %left
 -@findex %right
  @findex %nonassoc
 +@findex %precedence
 +@findex %right
  
  Bison allows you to specify these choices with the operator precedence
  declarations @code{%left} and @code{%right}.  Each such declaration
@@@ -7078,63 -6802,13 +7079,63 @@@ those operators left-associative and th
  them right-associative.  A third alternative is @code{%nonassoc}, which
  declares that it is a syntax error to find the same operator twice ``in a
  row''.
 +The last alternative, @code{%precedence}, allows to define only
 +precedence and no associativity at all.  As a result, any
 +associativity-related conflict that remains will be reported as an
 +compile-time error.  The directive @code{%nonassoc} creates run-time
 +error: using the operator in a associative way is a syntax error.  The
 +directive @code{%precedence} creates compile-time errors: an operator
 +@emph{can} be involved in an associativity-related conflict, contrary to
 +what expected the grammar author.
  
  The relative precedence of different operators is controlled by the
 -order in which they are declared.  The first @code{%left} or
 -@code{%right} declaration in the file declares the operators whose
 +order in which they are declared.  The first precedence/associativity
 +declaration in the file declares the operators whose
  precedence is lowest, the next such declaration declares the operators
  whose precedence is a little higher, and so on.
  
 +@node Precedence Only
 +@subsection Specifying Precedence Only
 +@findex %precedence
 +
 +Since POSIX Yacc defines only @code{%left}, @code{%right}, and
 +@code{%nonassoc}, which all defines precedence and associativity, little
 +attention is paid to the fact that precedence cannot be defined without
 +defining associativity.  Yet, sometimes, when trying to solve a
 +conflict, precedence suffices.  In such a case, using @code{%left},
 +@code{%right}, or @code{%nonassoc} might hide future (associativity
 +related) conflicts that would remain hidden.
 +
 +The dangling @code{else} ambiguity (@pxref{Shift/Reduce, , Shift/Reduce
 +Conflicts}) can be solved explicitly.  This shift/reduce conflicts occurs
 +in the following situation, where the period denotes the current parsing
 +state:
 +
 +@example
 +if @var{e1} then if  @var{e2} then @var{s1} . else @var{s2}
 +@end example
 +
 +The conflict involves the reduction of the rule @samp{IF expr THEN
 +stmt}, which precedence is by default that of its last token
 +(@code{THEN}), and the shifting of the token @code{ELSE}.  The usual
 +disambiguation (attach the @code{else} to the closest @code{if}),
 +shifting must be preferred, i.e., the precedence of @code{ELSE} must be
 +higher than that of @code{THEN}.  But neither is expected to be involved
 +in an associativity related conflict, which can be specified as follows.
 +
 +@example
 +%precedence THEN
 +%precedence ELSE
 +@end example
 +
 +The unary-minus is another typical example where associativity is
 +usually over-specified, see @ref{Infix Calc, , Infix Notation
 +Calculator: @code{calc}}.  The @code{%left} directive is traditionally
 +used to declare the precedence of @code{NEG}, which is more than needed
 +since it also defines its associativity.  While this is harmless in the
 +traditional example, who knows how @code{NEG} might be used in future
 +evolutions of the grammar@dots{}
 +
  @node Precedence Examples
  @subsection Precedence Examples
  
@@@ -7196,8 -6870,8 +7197,8 @@@ outlandish at first, but it is really v
  sign typically has a very high precedence as a unary operator, and a
  somewhat lower precedence (lower than multiplication) as a binary operator.
  
 -The Bison precedence declarations, @code{%left}, @code{%right} and
 -@code{%nonassoc}, can only be used once for a given token; so a token has
 +The Bison precedence declarations
 +can only be used once for a given token; so a token has
  only one precedence declared in this way.  For context-dependent
  precedence, you need to use an additional mechanism: the @code{%prec}
  modifier for rules.
@@@ -7542,9 -7216,9 +7543,9 @@@ The default behavior of Bison's LR-base
  historical reasons, but that behavior is often not robust.  For example, in
  the previous section, we discussed the mysterious conflicts that can be
  produced by LALR(1), Bison's default parser table construction algorithm.
 -Another example is Bison's @code{%error-verbose} directive, which instructs
 -the generated parser to produce verbose syntax error messages, which can
 -sometimes contain incorrect information.
 +Another example is Bison's @code{%define parse.error verbose} directive,
 +which instructs the generated parser to produce verbose syntax error
 +messages, which can sometimes contain incorrect information.
  
  In this section, we explore several modern features of Bison that allow you
  to tune fundamental aspects of the generated LR-based parsers.  Some of
@@@ -7691,7 -7365,7 +7692,7 @@@ and the benefits of IELR, @pxref{Biblio
  @node Default Reductions
  @subsection Default Reductions
  @cindex default reductions
 -@findex %define lr.default-reductions
 +@findex %define lr.default-reduction
  @findex %nonassoc
  
  After parser table construction, Bison identifies the reduction with the
@@@ -7773,9 -7447,9 +7774,9 @@@ token for which there is a conflict.  T
  split the parse instead.
  
  To adjust which states have default reductions enabled, use the
 -@code{%define lr.default-reductions} directive.
 +@code{%define lr.default-reduction} directive.
  
 -@deffn {Directive} {%define lr.default-reductions @var{WHERE}}
 +@deffn {Directive} {%define lr.default-reduction @var{WHERE}}
  Specify the kind of states that are permitted to contain default reductions.
  The accepted values of @var{WHERE} are:
  @itemize
@@@ -7898,7 -7572,7 +7899,7 @@@ parser community for years, for the pub
  
  @node Unreachable States
  @subsection Unreachable States
 -@findex %define lr.keep-unreachable-states
 +@findex %define lr.keep-unreachable-state
  @cindex unreachable states
  
  If there exists no sequence of transitions from the parser's start state to
@@@ -7911,7 -7585,7 +7912,7 @@@ resolution because they are useless in 
  keeping unreachable states is sometimes useful when trying to understand the
  relationship between the parser and the grammar.
  
 -@deffn {Directive} {%define lr.keep-unreachable-states @var{VALUE}}
 +@deffn {Directive} {%define lr.keep-unreachable-state @var{VALUE}}
  Request that Bison allow unreachable states to remain in the parser tables.
  @var{VALUE} must be a Boolean.  The default is @code{false}.
  @end deffn
@@@ -8068,14 -7742,12 +8069,14 @@@ that allows variable-length arrays.  Th
  
  Do not allow @code{YYINITDEPTH} to be greater than @code{YYMAXDEPTH}.
  
 -@c FIXME: C++ output.
 -Because of semantic differences between C and C++, the deterministic
 -parsers in C produced by Bison cannot grow when compiled
 -by C++ compilers.  In this precise case (compiling a C parser as C++) you are
 -suggested to grow @code{YYINITDEPTH}.  The Bison maintainers hope to fix
 -this deficiency in a future release.
 +You can generate a deterministic parser containing C++ user code from
 +the default (C) skeleton, as well as from the C++ skeleton
 +(@pxref{C++ Parsers}).  However, if you do use the default skeleton
 +and want to allow the parsing stack to grow,
 +be careful not to use semantic types or location types that require
 +non-trivial copy constructors.
 +The C skeleton bypasses these constructors when copying data to
 +new, larger stacks.
  
  @node Error Recovery
  @chapter Error Recovery
@@@ -8422,6 -8094,7 +8423,7 @@@ automaton, and how to enable and unders
  
  @menu
  * Understanding::     Understanding the structure of your parser.
+ * Graphviz::          Getting a visual representation of the parser.
  * Tracing::           Tracing the execution of your parser.
  @end menu
  
@@@ -8838,6 -8511,114 +8840,114 @@@ precedence of @samp{/} with respect to 
  @samp{*}, but also because the
  associativity of @samp{/} is not specified.
  
+ @c ================================================= Graphical Representation
+ @node Graphviz
+ @section Visualizing Your Parser
+ @cindex dot
+ As another means to gain better understanding of the shift/reduce
+ automaton corresponding to the Bison parser, a DOT file can be generated. Note
+ that debugging a real grammar with this is tedious at best, and impractical
+ most of the times, because the generated files are huge (the generation of
+ a PDF or PNG file from it will take very long, and more often than not it will
+ fail due to memory exhaustion). This option was rather designed for beginners,
+ to help them understand LR parsers.
+ This file is generated when the @option{--graph} option is specified (see
+ @pxref{Invocation, , Invoking Bison}).  Its name is made by removing
+ @samp{.tab.c} or @samp{.c} from the parser implementation file name, and
+ adding @samp{.dot} instead.  If the grammar file is @file{foo.y}, the
+ Graphviz output file is called @file{foo.dot}.
+ The following grammar file, @file{rr.y}, will be used in the sequel:
+ @example
+ %%
+ @group
+ exp: a ";" | b ".";
+ a: "0";
+ b: "0";
+ @end group
+ @end example
+ The graphical output is very similar to the textual one, and as such it is
+ easier understood by making direct comparisons between them. See
+ @ref{Debugging, , Debugging Your Parser} for a detailled analysis of the
+ textual report.
+ @subheading Graphical Representation of States
+ The items (pointed rules) for each state are grouped together in graph nodes.
+ Their numbering is the same as in the verbose file. See the following points,
+ about transitions, for examples
+ When invoked with @option{--report=lookaheads}, the lookahead tokens, when
+ needed, are shown next to the relevant rule between square brackets as a
+ comma separated list. This is the case in the figure for the representation of
+ reductions, below.
+ @sp 1
+ The transitions are represented as directed edges between the current and
+ the target states.
+ @subheading Graphical Representation of Shifts
+ Shifts are shown as solid arrows, labelled with the lookahead token for that
+ shift. The following describes a reduction in the @file{rr.output} file:
+ @example
+ @group
+ state 3
+     1 exp: a . ";"
+     ";"  shift, and go to state 6
+ @end group
+ @end example
+ A Graphviz rendering of this portion of the graph could be:
+ @center @image{figs/example-shift, 100pt}
+ @subheading Graphical Representation of Reductions
+ Reductions are shown as solid arrows, leading to a diamond-shaped node
+ bearing the number of the reduction rule. The arrow is labelled with the
+ appropriate comma separated lookahead tokens. If the reduction is the default
+ action for the given state, there is no such label.
+ This is how reductions are represented in the verbose file @file{rr.output}:
+ @example
+ state 1
+     3 a: "0" .  [";"]
+     4 b: "0" .  ["."]
+     "."       reduce using rule 4 (b)
+     $default  reduce using rule 3 (a)
+ @end example
+ A Graphviz rendering of this portion of the graph could be:
+ @center @image{figs/example-reduce, 120pt}
+ When unresolved conflicts are present, because in deterministic parsing
+ a single decision can be made, Bison can arbitrarily choose to disable a
+ reduction, see @ref{Shift/Reduce, , Shift/Reduce Conflicts}.  Discarded actions
+ are distinguished by a red filling color on these nodes, just like how they are
+ reported between square brackets in the verbose file.
+ The reduction corresponding to the rule number 0 is the acceptation state. It
+ is shown as a blue diamond, labelled "Acc".
+ @subheading Graphical representation of go tos
+ The @samp{go to} jump transitions are represented as dotted lines bearing
+ the name of the rule being jumped to.
+ @c ================================================= Tracing
  
  @node Tracing
  @section Tracing Your Parser
@@@ -8882,19 -8663,12 +8992,19 @@@ otherwise it defines @code{YYDEBUG} to 
  @item the directive @samp{%debug}
  @findex %debug
  Add the @code{%debug} directive (@pxref{Decl Summary, ,Bison Declaration
 -Summary}).  This is a Bison extension, especially useful for languages that
 -don't use a preprocessor.  Unless POSIX and Yacc portability matter to you,
 -this is the preferred solution.
 +Summary}).  This Bison extension is maintained for backward
 +compatibility with previous versions of Bison.
 +
 +@item the variable @samp{parse.trace}
 +@findex %define parse.trace
 +Add the @samp{%define parse.trace} directive (@pxref{%define
 +Summary,,parse.trace}), or pass the @option{-Dparse.trace} option
 +(@pxref{Bison Options}).  This is a Bison extension, which is especially
 +useful for languages that don't use a preprocessor.  Unless POSIX and Yacc
 +portability matter to you, this is the preferred solution.
  @end table
  
 -We suggest that you always enable the debug option so that debugging is
 +We suggest that you always enable the trace option so that debugging is
  always possible.
  
  @findex YYFPRINTF
@@@ -9293,10 -9067,6 +9403,10 @@@ unexpected number of conflicts is an er
  conflicts is not reported, so @option{-W} and @option{--warning} then have
  no effect on the conflict report.
  
 +@item deprecated
 +Deprecated constructs whose support will be removed in future versions of
 +Bison.
 +
  @item other
  All warnings not categorized above.  These warnings are enabled by default.
  
@@@ -9309,33 -9079,12 +9419,33 @@@ All the warnings
  @item none
  Turn off all the warnings.
  @item error
 -Treat warnings as errors.
 +See @option{-Werror}, below.
  @end table
  
  A category can be turned off by prefixing its name with @samp{no-}.  For
  instance, @option{-Wno-yacc} will hide the warnings about
  POSIX Yacc incompatibilities.
 +
 +@item -Werror[=@var{category}]
 +@itemx -Wno-error[=@var{category}]
 +Enable warnings falling in @var{category}, and treat them as errors.  If no
 +@var{category} is given, it defaults to making all enabled warnings into errors.
 +
 +@var{category} is the same as for @option{--warnings}, with the exception that
 +it may not be prefixed with @samp{no-} (see above).
 +
 +Prefixed with @samp{no}, it deactivates the error treatment for this
 +@var{category}. However, the warning itself won't be disabled, or enabled, by
 +this option.
 +
 +Note that the precedence of the @samp{=} and @samp{,} operators is such that
 +the following commands are @emph{not} equivalent, as the first will not treat
 +S/R conflicts as errors.
 +
 +@example
 +$ bison -Werror=yacc,conflicts-sr input.y
 +$ bison -Werror=yacc,error=conflicts-sr input.y
 +@end example
  @end table
  
  @noindent
@@@ -9581,18 -9330,17 +9691,18 @@@ The C++ deterministic parser is selecte
  
  When run, @command{bison} will create several entities in the @samp{yy}
  namespace.
 -@findex %define namespace
 -Use the @samp{%define namespace} directive to change the namespace
 -name, see @ref{%define Summary,,namespace}.  The various classes are
 -generated in the following files:
 +@findex %define api.namespace
 +Use the @samp{%define api.namespace} directive to change the namespace name,
 +see @ref{%define Summary,,api.namespace}.  The various classes are generated
 +in the following files:
  
  @table @file
  @item position.hh
  @itemx location.hh
  The definition of the classes @code{position} and @code{location}, used for
 -location tracking.  These files are not generated if the @code{%define}
 -variable @code{api.location.type} is defined.  @xref{C++ Location Values}.
 +location tracking when enabled.  These files are not generated if the
 +@code{%define} variable @code{api.location.type} is defined.  @xref{C++
 +Location Values}.
  
  @item stack.hh
  An auxiliary class @code{stack} used by the parser.
@@@ -9618,22 -9366,11 +9728,22 @@@ for a complete and accurate documentati
  @c - YYSTYPE
  @c - Printer and destructor
  
 +Bison supports two different means to handle semantic values in C++.  One is
 +alike the C interface, and relies on unions (@pxref{C++ Unions}).  As C++
 +practitioners know, unions are inconvenient in C++, therefore another
 +approach is provided, based on variants (@pxref{C++ Variants}).
 +
 +@menu
 +* C++ Unions::             Semantic values cannot be objects
 +* C++ Variants::           Using objects as semantic values
 +@end menu
 +
 +@node C++ Unions
 +@subsubsection C++ Unions
 +
  The @code{%union} directive works as for C, see @ref{Union Decl, ,The
  Collection of Value Types}.  In particular it produces a genuine
 -@code{union}@footnote{In the future techniques to allow complex types
 -within pseudo-unions (similar to Boost variants) might be implemented to
 -alleviate these issues.}, which have a few specific features in C++.
 +@code{union}, which have a few specific features in C++.
  @itemize @minus
  @item
  The type @code{YYSTYPE} is defined but its use is discouraged: rather
@@@ -9650,98 -9387,6 +9760,98 @@@ reclaimed automatically: using the @cod
  only means to avoid leaks.  @xref{Destructor Decl, , Freeing Discarded
  Symbols}.
  
 +@node C++ Variants
 +@subsubsection C++ Variants
 +
 +Starting with version 2.6, Bison provides a @emph{variant} based
 +implementation of semantic values for C++.  This alleviates all the
 +limitations reported in the previous section, and in particular, object
 +types can be used without pointers.
 +
 +To enable variant-based semantic values, set @code{%define} variable
 +@code{variant} (@pxref{%define Summary,, variant}).  Once this defined,
 +@code{%union} is ignored, and instead of using the name of the fields of the
 +@code{%union} to ``type'' the symbols, use genuine types.
 +
 +For instance, instead of
 +
 +@example
 +%union
 +@{
 +  int ival;
 +  std::string* sval;
 +@}
 +%token <ival> NUMBER;
 +%token <sval> STRING;
 +@end example
 +
 +@noindent
 +write
 +
 +@example
 +%token <int> NUMBER;
 +%token <std::string> STRING;
 +@end example
 +
 +@code{STRING} is no longer a pointer, which should fairly simplify the user
 +actions in the grammar and in the scanner (in particular the memory
 +management).
 +
 +Since C++ features destructors, and since it is customary to specialize
 +@code{operator<<} to support uniform printing of values, variants also
 +typically simplify Bison printers and destructors.
 +
 +Variants are stricter than unions.  When based on unions, you may play any
 +dirty game with @code{yylval}, say storing an @code{int}, reading a
 +@code{char*}, and then storing a @code{double} in it.  This is no longer
 +possible with variants: they must be initialized, then assigned to, and
 +eventually, destroyed.
 +
 +@deftypemethod {semantic_type} {T&} build<T> ()
 +Initialize, but leave empty.  Returns the address where the actual value may
 +be stored.  Requires that the variant was not initialized yet.
 +@end deftypemethod
 +
 +@deftypemethod {semantic_type} {T&} build<T> (const T& @var{t})
 +Initialize, and copy-construct from @var{t}.
 +@end deftypemethod
 +
 +
 +@strong{Warning}: We do not use Boost.Variant, for two reasons.  First, it
 +appeared unacceptable to require Boost on the user's machine (i.e., the
 +machine on which the generated parser will be compiled, not the machine on
 +which @command{bison} was run).  Second, for each possible semantic value,
 +Boost.Variant not only stores the value, but also a tag specifying its
 +type.  But the parser already ``knows'' the type of the semantic value, so
 +that would be duplicating the information.
 +
 +Therefore we developed light-weight variants whose type tag is external (so
 +they are really like @code{unions} for C++ actually).  But our code is much
 +less mature that Boost.Variant.  So there is a number of limitations in
 +(the current implementation of) variants:
 +@itemize
 +@item
 +Alignment must be enforced: values should be aligned in memory according to
 +the most demanding type.  Computing the smallest alignment possible requires
 +meta-programming techniques that are not currently implemented in Bison, and
 +therefore, since, as far as we know, @code{double} is the most demanding
 +type on all platforms, alignments are enforced for @code{double} whatever
 +types are actually used.  This may waste space in some cases.
 +
 +@item
 +Our implementation is not conforming with strict aliasing rules.  Alias
 +analysis is a technique used in optimizing compilers to detect when two
 +pointers are disjoint (they cannot ``meet'').  Our implementation breaks
 +some of the rules that G++ 4.4 uses in its alias analysis, so @emph{strict
 +alias analysis must be disabled}.  Use the option
 +@option{-fno-strict-aliasing} to compile the generated parser.
 +
 +@item
 +There might be portability issues we are not aware of.
 +@end itemize
 +
 +As far as we know, these limitations @emph{can} be alleviated.  All it takes
 +is some time and/or some talented C++ hacker willing to contribute to Bison.
  
  @node C++ Location Values
  @subsection C++ Location Values
@@@ -9764,8 -9409,8 +9874,8 @@@ In this section @code{uint} is an abbre
  genuine code only the latter is used.
  
  @menu
 -* C++ position::                One point in the source file
 -* C++ location::                Two points in the source file
 +* C++ position::         One point in the source file
 +* C++ location::         Two points in the source file
  * User Defined Location Type::  Required interface for locations
  @end menu
  
@@@ -9946,7 -9591,7 +10056,7 @@@ additional argument for its constructor
  
  @defcv {Type} {parser} {semantic_type}
  @defcvx {Type} {parser} {location_type}
 -The types for semantics value and locations.
 +The types for semantic values and locations (if enabled).
  @end defcv
  
  @defcv {Type} {parser} {token}
@@@ -9957,27 -9602,11 +10067,27 @@@ use @code{yy::parser::token::FOO}.  Th
  (@pxref{Calc++ Scanner}).
  @end defcv
  
 +@defcv {Type} {parser} {syntax_error}
 +This class derives from @code{std::runtime_error}.  Throw instances of it
 +from the scanner or from the user actions to raise parse errors.  This is
 +equivalent with first
 +invoking @code{error} to report the location and message of the syntax
 +error, and then to invoke @code{YYERROR} to enter the error-recovery mode.
 +But contrary to @code{YYERROR} which can only be invoked from user actions
 +(i.e., written in the action itself), the exception can be thrown from
 +function invoked from the user action.
 +@end defcv
 +
  @deftypemethod {parser} {} parser (@var{type1} @var{arg1}, ...)
  Build a new parser object.  There are no arguments by default, unless
  @samp{%parse-param @{@var{type1} @var{arg1}@}} was used.
  @end deftypemethod
  
 +@deftypemethod {syntax_error} {} syntax_error (const location_type& @var{l}, const std::string& @var{m})
 +@deftypemethodx {syntax_error} {} syntax_error (const std::string& @var{m})
 +Instantiate a syntax-error exception.
 +@end deftypemethod
 +
  @deftypemethod {parser} {int} parse ()
  Run the syntactic analysis, and return 0 on success, 1 otherwise.
  
@@@ -10000,11 -9629,9 +10110,11 @@@ or nonzero, full tracing
  @end deftypemethod
  
  @deftypemethod {parser} {void} error (const location_type& @var{l}, const std::string& @var{m})
 +@deftypemethodx {parser} {void} error (const std::string& @var{m})
  The definition for this member function must be supplied by the user:
  the parser uses it to report a parser error occurring at @var{l},
 -described by @var{m}.
 +described by @var{m}.  If location tracking is not enabled, the second
 +signature is used.
  @end deftypemethod
  
  
  
  The parser invokes the scanner by calling @code{yylex}.  Contrary to C
  parsers, C++ parsers are always pure: there is no point in using the
 -@code{%define api.pure} directive.  Therefore the interface is as follows.
 +@samp{%define api.pure} directive.  The actual interface with @code{yylex}
 +depends whether you use unions, or variants.
 +
 +@menu
 +* Split Symbols::         Passing symbols as two/three components
 +* Complete Symbols::      Making symbols a whole
 +@end menu
 +
 +@node Split Symbols
 +@subsubsection Split Symbols
 +
 +Therefore the interface is as follows.
  
  @deftypemethod {parser} {int} yylex (semantic_type* @var{yylval}, location_type* @var{yylloc}, @var{type1} @var{arg1}, ...)
 -Return the next token.  Its type is the return value, its semantic
 -value and location being @var{yylval} and @var{yylloc}.  Invocations of
 +@deftypemethodx {parser} {int} yylex (semantic_type* @var{yylval}, @var{type1} @var{arg1}, ...)
 +Return the next token.  Its type is the return value, its semantic value and
 +location (if enabled) being @var{yylval} and @var{yylloc}.  Invocations of
  @samp{%lex-param @{@var{type1} @var{arg1}@}} yield additional arguments.
  @end deftypemethod
  
 +Note that when using variants, the interface for @code{yylex} is the same,
 +but @code{yylval} is handled differently.
 +
 +Regular union-based code in Lex scanner typically look like:
 +
 +@example
 +[0-9]+   @{
 +           yylval.ival = text_to_int (yytext);
 +           return yy::parser::INTEGER;
 +         @}
 +[a-z]+   @{
 +           yylval.sval = new std::string (yytext);
 +           return yy::parser::IDENTIFIER;
 +         @}
 +@end example
 +
 +Using variants, @code{yylval} is already constructed, but it is not
 +initialized.  So the code would look like:
 +
 +@example
 +[0-9]+   @{
 +           yylval.build<int>() = text_to_int (yytext);
 +           return yy::parser::INTEGER;
 +         @}
 +[a-z]+   @{
 +           yylval.build<std::string> = yytext;
 +           return yy::parser::IDENTIFIER;
 +         @}
 +@end example
 +
 +@noindent
 +or
 +
 +@example
 +[0-9]+   @{
 +           yylval.build(text_to_int (yytext));
 +           return yy::parser::INTEGER;
 +         @}
 +[a-z]+   @{
 +           yylval.build(yytext);
 +           return yy::parser::IDENTIFIER;
 +         @}
 +@end example
 +
 +
 +@node Complete Symbols
 +@subsubsection Complete Symbols
 +
 +If you specified both @code{%define variant} and @code{%define lex_symbol},
 +the @code{parser} class also defines the class @code{parser::symbol_type}
 +which defines a @emph{complete} symbol, aggregating its type (i.e., the
 +traditional value returned by @code{yylex}), its semantic value (i.e., the
 +value passed in @code{yylval}, and possibly its location (@code{yylloc}).
 +
 +@deftypemethod {symbol_type} {} symbol_type (token_type @var{type},  const semantic_type& @var{value}, const location_type& @var{location})
 +Build a complete terminal symbol which token type is @var{type}, and which
 +semantic value is @var{value}.  If location tracking is enabled, also pass
 +the @var{location}.
 +@end deftypemethod
 +
 +This interface is low-level and should not be used for two reasons.  First,
 +it is inconvenient, as you still have to build the semantic value, which is
 +a variant, and second, because consistency is not enforced: as with unions,
 +it is still possible to give an integer as semantic value for a string.
 +
 +So for each token type, Bison generates named constructors as follows.
 +
 +@deftypemethod {symbol_type} {} make_@var{token} (const @var{value_type}& @var{value}, const location_type& @var{location})
 +@deftypemethodx {symbol_type} {} make_@var{token} (const location_type& @var{location})
 +Build a complete terminal symbol for the token type @var{token} (not
 +including the @code{api.token.prefix}) whose possible semantic value is
 +@var{value} of adequate @var{value_type}.  If location tracking is enabled,
 +also pass the @var{location}.
 +@end deftypemethod
 +
 +For instance, given the following declarations:
 +
 +@example
 +%define api.token.prefix "TOK_"
 +%token <std::string> IDENTIFIER;
 +%token <int> INTEGER;
 +%token COLON;
 +@end example
 +
 +@noindent
 +Bison generates the following functions:
 +
 +@example
 +symbol_type make_IDENTIFIER(const std::string& v,
 +                            const location_type& l);
 +symbol_type make_INTEGER(const int& v,
 +                         const location_type& loc);
 +symbol_type make_COLON(const location_type& loc);
 +@end example
 +
 +@noindent
 +which should be used in a Lex-scanner as follows.
 +
 +@example
 +[0-9]+   return yy::parser::make_INTEGER(text_to_int (yytext), loc);
 +[a-z]+   return yy::parser::make_IDENTIFIER(yytext, loc);
 +":"      return yy::parser::make_COLON(loc);
 +@end example
 +
 +Tokens that do not have an identifier are not accessible: you cannot simply
 +use characters such as @code{':'}, they must be declared with @code{%token}.
  
  @node A Complete C++ Example
  @subsection A Complete C++ Example
  
  This section demonstrates the use of a C++ parser with a simple but
  complete example.  This example should be available on your system,
 -ready to compile, in the directory @dfn{../bison/examples/calc++}.  It
 +ready to compile, in the directory @dfn{.../bison/examples/calc++}.  It
  focuses on the use of Bison, therefore the design of the various C++
  classes is very naive: no accessors, no encapsulation of members etc.
  We will use a Lex scanner, and more precisely, a Flex scanner, to
 -demonstrate the various interaction.  A hand written scanner is
 +demonstrate the various interactions.  A hand-written scanner is
  actually easier to interface with.
  
  @menu
@@@ -10216,8 -9725,11 +10326,8 @@@ factor both as follows
  @comment file: calc++-driver.hh
  @example
  // Tell Flex the lexer's prototype ...
 -# define YY_DECL                                        \
 -  yy::calcxx_parser::token_type                         \
 -  yylex (yy::calcxx_parser::semantic_type* yylval,      \
 -         yy::calcxx_parser::location_type* yylloc,      \
 -         calcxx_driver& driver)
 +# define YY_DECL \
 +  yy::calcxx_parser::symbol_type yylex (calcxx_driver& driver)
  // ... and declare it for the parser's sake.
  YY_DECL;
  @end example
@@@ -10241,8 -9753,8 +10351,8 @@@ public
  @end example
  
  @noindent
 -To encapsulate the coordination with the Flex scanner, it is useful to
 -have two members function to open and close the scanning phase.
 +To encapsulate the coordination with the Flex scanner, it is useful to have
 +member functions to open and close the scanning phase.
  
  @comment file: calc++-driver.hh
  @example
@@@ -10257,13 -9769,9 +10367,13 @@@ Similarly for the parser itself
  
  @comment file: calc++-driver.hh
  @example
 -  // Run the parser.  Return 0 on success.
 +  // Run the parser on file F.
 +  // Return 0 on success.
    int parse (const std::string& f);
 +  // The name of the file being parsed.
 +  // Used later to pass the file name to the location tracker.
    std::string file;
 +  // Whether parser traces should be generated.
    bool trace_parsing;
  @end example
  
@@@ -10345,35 -9853,19 +10455,35 @@@ the grammar for
  %define parser_class_name "calcxx_parser"
  @end example
  
 +@noindent
 +@findex %define variant
 +@findex %define lex_symbol
 +This example will use genuine C++ objects as semantic values, therefore, we
 +require the variant-based interface.  To make sure we properly use it, we
 +enable assertions.  To fully benefit from type-safety and more natural
 +definition of ``symbol'', we enable @code{lex_symbol}.
 +
 +@comment file: calc++-parser.yy
 +@example
 +%define variant
 +%define parse.assert
 +%define lex_symbol
 +@end example
 +
  @noindent
  @findex %code requires
 -Then come the declarations/inclusions needed to define the
 -@code{%union}.  Because the parser uses the parsing driver and
 -reciprocally, both cannot include the header of the other.  Because the
 +Then come the declarations/inclusions needed by the semantic values.
 +Because the parser uses the parsing driver and reciprocally, both would like
 +to include the header of the other, which is, of course, insane.  This
 +mutual dependency will be broken using forward declarations.  Because the
  driver's header needs detailed knowledge about the parser class (in
 -particular its inner types), it is the parser's header which will simply
 -use a forward declaration of the driver.
 -@xref{%code Summary}.
 +particular its inner types), it is the parser's header which will use a
 +forward declaration of the driver.  @xref{%code Summary}.
  
  @comment file: calc++-parser.yy
  @example
 -%code requires @{
 +%code requires
 +@{
  # include <string>
  class calcxx_driver;
  @}
@@@ -10387,14 -9879,15 +10497,14 @@@ global variables
  @comment file: calc++-parser.yy
  @example
  // The parsing context.
 -%parse-param @{ calcxx_driver& driver @}
 -%lex-param   @{ calcxx_driver& driver @}
 +%param @{ calcxx_driver& driver @}
  @end example
  
  @noindent
 -Then we request the location tracking feature, and initialize the
 +Then we request location tracking, and initialize the
  first location's file name.  Afterward new locations are computed
  relatively to the previous locations: the file name will be
 -automatically propagated.
 +propagated.
  
  @comment file: calc++-parser.yy
  @example
  @end example
  
  @noindent
 -Use the two following directives to enable parser tracing and verbose error
 +Use the following two directives to enable parser tracing and verbose error
  messages.  However, verbose error messages can contain incorrect information
  (@pxref{LAC}).
  
  @comment file: calc++-parser.yy
  @example
 -%debug
 -%error-verbose
 -@end example
 -
 -@noindent
 -Semantic values cannot use ``real'' objects, but only pointers to
 -them.
 -
 -@comment file: calc++-parser.yy
 -@example
 -// Symbols.
 -%union
 -@{
 -  int          ival;
 -  std::string *sval;
 -@};
 +%define parse.trace
 +%define parse.error verbose
  @end example
  
  @noindent
@@@ -10424,8 -9931,7 +10534,8 @@@ The code between @samp{%code @{} and @s
  
  @comment file: calc++-parser.yy
  @example
 -%code @{
 +%code
 +@{
  # include "calc++-driver.hh"
  @}
  @end example
  
  @noindent
  The token numbered as 0 corresponds to end of file; the following line
 -allows for nicer error messages referring to ``end of file'' instead
 -of ``$end''.  Similarly user friendly named are provided for each
 -symbol.  Note that the tokens names are prefixed by @code{TOKEN_} to
 -avoid name clashes.
 +allows for nicer error messages referring to ``end of file'' instead of
 +``$end''.  Similarly user friendly names are provided for each symbol.  To
 +avoid name clashes in the generated files (@pxref{Calc++ Scanner}), prefix
 +tokens with @code{TOK_} (@pxref{%define Summary,,api.token.prefix}).
  
  @comment file: calc++-parser.yy
  @example
 -%token        END      0 "end of file"
 -%token        ASSIGN     ":="
 -%token <sval> IDENTIFIER "identifier"
 -%token <ival> NUMBER     "number"
 -%type  <ival> exp
 +%define api.token.prefix "TOK_"
 +%token
 +  END  0  "end of file"
 +  ASSIGN  ":="
 +  MINUS   "-"
 +  PLUS    "+"
 +  STAR    "*"
 +  SLASH   "/"
 +  LPAREN  "("
 +  RPAREN  ")"
 +;
  @end example
  
  @noindent
 -To enable memory deallocation during error recovery, use
 -@code{%destructor}.
 +Since we use variant-based semantic values, @code{%union} is not used, and
 +both @code{%type} and @code{%token} expect genuine types, as opposed to type
 +tags.
  
 -@c FIXME: Document %printer, and mention that it takes a braced-code operand.
  @comment file: calc++-parser.yy
  @example
 -%printer    @{ yyoutput << *$$; @} "identifier"
 -%destructor @{ delete $$; @} "identifier"
 +%token <std::string> IDENTIFIER "identifier"
 +%token <int> NUMBER "number"
 +%type  <int> exp
 +@end example
 +
 +@noindent
 +No @code{%destructor} is needed to enable memory deallocation during error
 +recovery; the memory, for strings for instance, will be reclaimed by the
 +regular destructors.  All the values are printed using their
 +@code{operator<<} (@pxref{Printer Decl, , Printing Semantic Values}).
  
 -%printer    @{ yyoutput << $$; @} <ival>
 +@comment file: calc++-parser.yy
 +@example
 +%printer @{ yyoutput << $$; @} <*>;
  @end example
  
  @noindent
 -The grammar itself is straightforward.
 +The grammar itself is straightforward (@pxref{Location Tracking Calc, ,
 +Location Tracking Calculator: @code{ltcalc}}).
  
  @comment file: calc++-parser.yy
  @example
@@@ -10491,18 -9980,17 +10601,18 @@@ assignments
  | assignments assignment @{@};
  
  assignment:
 -     "identifier" ":=" exp
 -       @{ driver.variables[*$1] = $3; delete $1; @};
 -
 -%left '+' '-';
 -%left '*' '/';
 -exp: exp '+' exp   @{ $$ = $1 + $3; @}
 -   | exp '-' exp   @{ $$ = $1 - $3; @}
 -   | exp '*' exp   @{ $$ = $1 * $3; @}
 -   | exp '/' exp   @{ $$ = $1 / $3; @}
 -   | "identifier"  @{ $$ = driver.variables[*$1]; delete $1; @}
 -   | "number"      @{ $$ = $1; @};
 +  "identifier" ":=" exp @{ driver.variables[$1] = $3; @};
 +
 +%left "+" "-";
 +%left "*" "/";
 +exp:
 +  exp "+" exp   @{ $$ = $1 + $3; @}
 +| exp "-" exp   @{ $$ = $1 - $3; @}
 +| exp "*" exp   @{ $$ = $1 * $3; @}
 +| exp "/" exp   @{ $$ = $1 / $3; @}
 +| "(" exp ")"   @{ std::swap ($$, $2); @}
 +| "identifier"  @{ $$ = driver.variables[$1]; @}
 +| "number"      @{ std::swap ($$, $1); @};
  %%
  @end example
  
@@@ -10513,7 -10001,7 +10623,7 @@@ driver
  @comment file: calc++-parser.yy
  @example
  void
 -yy::calcxx_parser::error (const yy::calcxx_parser::location_type& l,
 +yy::calcxx_parser::error (const location_type& l,
                            const std::string& m)
  @{
    driver.error (l, m);
@@@ -10529,22 -10017,24 +10639,22 @@@ parser's to get the set of defined toke
  @comment file: calc++-scanner.ll
  @example
  %@{ /* -*- C++ -*- */
 -# include <cstdlib>
  # include <cerrno>
  # include <climits>
 +# include <cstdlib>
  # include <string>
  # include "calc++-driver.hh"
  # include "calc++-parser.hh"
  
 -/* Work around an incompatibility in flex (at least versions
 -   2.5.31 through 2.5.33): it generates code that does
 -   not conform to C89.  See Debian bug 333231
 -   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
 +// Work around an incompatibility in flex (at least versions
 +// 2.5.31 through 2.5.33): it generates code that does
 +// not conform to C89.  See Debian bug 333231
 +// <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.
  # undef yywrap
  # define yywrap() 1
  
 -/* By default yylex returns int, we use token_type.
 -   Unfortunately yyterminate by default returns 0, which is
 -   not of token_type.  */
 -#define yyterminate() return token::END
 +// The location of the current token.
 +static yy::location loc;
  %@}
  @end example
  
  Because there is no @code{#include}-like feature we don't need
  @code{yywrap}, we don't need @code{unput} either, and we parse an
  actual file, this is not an interactive session with the user.
 -Finally we enable the scanner tracing features.
 +Finally, we enable scanner tracing.
  
  @comment file: calc++-scanner.ll
  @example
@@@ -10572,8 -10062,8 +10682,8 @@@ blank [ \t
  @noindent
  The following paragraph suffices to track locations accurately.  Each
  time @code{yylex} is invoked, the begin position is moved onto the end
 -position.  Then when a pattern is matched, the end position is
 -advanced of its width.  In case it matched ends of lines, the end
 +position.  Then when a pattern is matched, its width is added to the end
 +column.  When matching ends of lines, the end
  cursor is adjusted, and each time blanks are matched, the begin cursor
  is moved onto the end cursor to effectively ignore the blanks
  preceding tokens.  Comments would be treated equally.
  @example
  @group
  %@{
 -# define YY_USER_ACTION  yylloc->columns (yyleng);
 +  // Code run each time a pattern is matched.
 +  # define YY_USER_ACTION  loc.columns (yyleng);
  %@}
  @end group
  %%
 +@group
  %@{
 -  yylloc->step ();
 +  // Code run each time yylex is called.
 +  loc.step ();
  %@}
 -@{blank@}+   yylloc->step ();
 -[\n]+      yylloc->lines (yyleng); yylloc->step ();
 +@end group
 +@{blank@}+   loc.step ();
 +[\n]+      loc.lines (yyleng); loc.step ();
  @end example
  
  @noindent
 -The rules are simple, just note the use of the driver to report errors.
 -It is convenient to use a typedef to shorten
 -@code{yy::calcxx_parser::token::identifier} into
 -@code{token::identifier} for instance.
 +The rules are simple.  The driver is used to report errors.
  
  @comment file: calc++-scanner.ll
  @example
 -%@{
 -  typedef yy::calcxx_parser::token token;
 -%@}
 -           /* Convert ints to the actual type of tokens.  */
 -[-+*/]     return yy::calcxx_parser::token_type (yytext[0]);
 -":="       return token::ASSIGN;
 +"-"      return yy::calcxx_parser::make_MINUS(loc);
 +"+"      return yy::calcxx_parser::make_PLUS(loc);
 +"*"      return yy::calcxx_parser::make_STAR(loc);
 +"/"      return yy::calcxx_parser::make_SLASH(loc);
 +"("      return yy::calcxx_parser::make_LPAREN(loc);
 +")"      return yy::calcxx_parser::make_RPAREN(loc);
 +":="     return yy::calcxx_parser::make_ASSIGN(loc);
 +
 +@group
  @{int@}      @{
    errno = 0;
    long n = strtol (yytext, NULL, 10);
    if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
 -    driver.error (*yylloc, "integer is out of range");
 -  yylval->ival = n;
 -  return token::NUMBER;
 +    driver.error (loc, "integer is out of range");
 +  return yy::calcxx_parser::make_NUMBER(n, loc);
  @}
 -@{id@}       yylval->sval = new std::string (yytext); return token::IDENTIFIER;
 -.          driver.error (*yylloc, "invalid character");
 +@end group
 +@{id@}       return yy::calcxx_parser::make_IDENTIFIER(yytext, loc);
 +.          driver.error (loc, "invalid character");
 +<<EOF>>    return yy::calcxx_parser::make_END(loc);
  %%
  @end example
  
  @noindent
 -Finally, because the scanner related driver's member function depend
 +Finally, because the scanner-related driver's member-functions depend
  on the scanner's data, it is simpler to implement them in this file.
  
  @comment file: calc++-scanner.ll
@@@ -10669,7 -10154,6 +10779,7 @@@ The top level file, @file{calc++.cc}, p
  int
  main (int argc, char *argv[])
  @{
 +  int res = 0;
    calcxx_driver driver;
    for (int i = 1; i < argc; ++i)
      if (argv[i] == std::string ("-p"))
        driver.trace_scanning = true;
      else if (!driver.parse (argv[i]))
        std::cout << driver.result << std::endl;
 +    else
 +      res = 1;
 +  return res;
  @}
  @end group
  @end example
@@@ -10725,7 -10206,7 +10835,7 @@@ You can create documentation for genera
  Contrary to C parsers, Java parsers do not use global variables; the
  state of the parser is always local to an instance of the parser class.
  Therefore, all Java parsers are ``pure'', and the @code{%pure-parser}
 -and @code{%define api.pure} directives does not do anything when used in
 +and @samp{%define api.pure} directives does not do anything when used in
  Java.
  
  Push parsers are currently unsupported in Java and @code{%define
@@@ -10738,23 -10219,15 +10848,23 @@@ No header file can be generated for Jav
  @code{%defines} directive or the @option{-d}/@option{--defines} options.
  
  @c FIXME: Possible code change.
 -Currently, support for debugging and verbose errors are always compiled
 -in.  Thus the @code{%debug} and @code{%token-table} directives and the
 +Currently, support for tracing is always compiled
 +in.  Thus the @samp{%define parse.trace} and @samp{%token-table}
 +directives and the
  @option{-t}/@option{--debug} and @option{-k}/@option{--token-table}
  options have no effect.  This may change in the future to eliminate
 -unused code in the generated parser, so use @code{%debug} and
 -@code{%verbose-error} explicitly if needed.  Also, in the future the
 +unused code in the generated parser, so use @samp{%define parse.trace}
 +explicitly
 +if needed.  Also, in the future the
  @code{%token-table} directive might enable a public interface to
  access the token names and codes.
  
 +Getting a ``code too large'' error from the Java compiler means the code
 +hit the 64KB bytecode per method limitation of the Java class file.
 +Try reducing the amount of code in actions and static initializers;
 +otherwise, report a bug so that the parser skeleton will be improved.
 +
 +
  @node Java Semantic Values
  @subsection Java Semantic Values
  @c - No %union, specify type in %type/%token.
@@@ -10773,7 -10246,7 +10883,7 @@@ semantic values' types (class names) sh
  By default, the semantic stack is declared to have @code{Object} members,
  which means that the class types you specify can be of any class.
  To improve the type safety of the parser, you can declare the common
 -superclass of all the semantic values using the @code{%define stype}
 +superclass of all the semantic values using the @samp{%define stype}
  directive.  For example, after the following declaration:
  
  @example
@@@ -10851,22 -10324,20 +10961,22 @@@ properly, the position class should ove
  The name of the generated parser class defaults to @code{YYParser}.  The
  @code{YY} prefix may be changed using the @code{%name-prefix} directive
  or the @option{-p}/@option{--name-prefix} option.  Alternatively, use
 -@code{%define parser_class_name "@var{name}"} to give a custom name to
 +@samp{%define parser_class_name "@var{name}"} to give a custom name to
  the class.  The interface of this class is detailed below.
  
  By default, the parser class has package visibility.  A declaration
 -@code{%define public} will change to public visibility.  Remember that,
 +@samp{%define public} will change to public visibility.  Remember that,
  according to the Java language specification, the name of the @file{.java}
  file should match the name of the class in this case.  Similarly, you can
  use @code{abstract}, @code{final} and @code{strictfp} with the
  @code{%define} declaration to add other modifiers to the parser class.
 +A single @samp{%define annotations "@var{annotations}"} directive can
 +be used to add any number of annotations to the parser class.
  
  The Java package name of the parser class can be specified using the
 -@code{%define package} directive.  The superclass and the implemented
 +@samp{%define package} directive.  The superclass and the implemented
  interfaces of the parser class can be specified with the @code{%define
 -extends} and @code{%define implements} directives.
 +extends} and @samp{%define implements} directives.
  
  The parser class defines an inner class, @code{Location}, that is used
  for location tracking (see @ref{Java Location Values}), and a inner
@@@ -10875,33 -10346,30 +10985,33 @@@ these inner class/interface, and the me
  below, all the other members and fields are preceded with a @code{yy} or
  @code{YY} prefix to avoid clashes with user code.
  
 -@c FIXME: The following constants and variables are still undocumented:
 -@c @code{bisonVersion}, @code{bisonSkeleton} and @code{errorVerbose}.
 -
  The parser class can be extended using the @code{%parse-param}
  directive. Each occurrence of the directive will add a @code{protected
  final} field to the parser class, and an argument to its constructor,
  which initialize them automatically.
  
 -Token names defined by @code{%token} and the predefined @code{EOF} token
 -name are added as constant fields to the parser class.
 -
  @deftypeop {Constructor} {YYParser} {} YYParser (@var{lex_param}, @dots{}, @var{parse_param}, @dots{})
  Build a new parser object with embedded @code{%code lexer}.  There are
 -no parameters, unless @code{%parse-param}s and/or @code{%lex-param}s are
 -used.
 +no parameters, unless @code{%param}s and/or @code{%parse-param}s and/or
 +@code{%lex-param}s are used.
 +
 +Use @code{%code init} for code added to the start of the constructor
 +body. This is especially useful to initialize superclasses. Use
 +@samp{%define init_throws} to specify any uncaught exceptions.
  @end deftypeop
  
  @deftypeop {Constructor} {YYParser} {} YYParser (Lexer @var{lexer}, @var{parse_param}, @dots{})
  Build a new parser object using the specified scanner.  There are no
 -additional parameters unless @code{%parse-param}s are used.
 +additional parameters unless @code{%param}s and/or @code{%parse-param}s are
 +used.
  
  If the scanner is defined by @code{%code lexer}, this constructor is
  declared @code{protected} and is called automatically with a scanner
 -created with the correct @code{%lex-param}s.
 +created with the correct @code{%param}s and/or @code{%lex-param}s.
 +
 +Use @code{%code init} for code added to the start of the constructor
 +body. This is especially useful to initialize superclasses. Use
 +@samp{%define init_throws} to specify any uncaught exceptions.
  @end deftypeop
  
  @deftypemethod {YYParser} {boolean} parse ()
@@@ -10909,21 -10377,6 +11019,21 @@@ Run the syntactic analysis, and return 
  @code{false} otherwise.
  @end deftypemethod
  
 +@deftypemethod {YYParser} {boolean} getErrorVerbose ()
 +@deftypemethodx {YYParser} {void} setErrorVerbose (boolean @var{verbose})
 +Get or set the option to produce verbose error messages.  These are only
 +available with @samp{%define parse.error verbose}, which also turns on
 +verbose error messages.
 +@end deftypemethod
 +
 +@deftypemethod {YYParser} {void} yyerror (String @var{msg})
 +@deftypemethodx {YYParser} {void} yyerror (Position @var{pos}, String @var{msg})
 +@deftypemethodx {YYParser} {void} yyerror (Location @var{loc}, String @var{msg})
 +Print an error message using the @code{yyerror} method of the scanner
 +instance in use. The @code{Location} and @code{Position} parameters are
 +available only if location tracking is active.
 +@end deftypemethod
 +
  @deftypemethod {YYParser} {boolean} recovering ()
  During the syntactic analysis, return @code{true} if recovering
  from a syntax error.
@@@ -10942,11 -10395,6 +11052,11 @@@ Get or set the tracing level.  Currentl
  or nonzero, full tracing.
  @end deftypemethod
  
 +@deftypecv {Constant} {YYParser} {String} {bisonVersion}
 +@deftypecvx {Constant} {YYParser} {String} {bisonSkeleton}
 +Identify the Bison version and skeleton used to generate this parser.
 +@end deftypecv
 +
  
  @node Java Scanner Interface
  @subsection Java Scanner Interface
  There are two possible ways to interface a Bison-generated Java parser
  with a scanner: the scanner may be defined by @code{%code lexer}, or
  defined elsewhere.  In either case, the scanner has to implement the
 -@code{Lexer} inner interface of the parser class.
 +@code{Lexer} inner interface of the parser class.  This interface also
 +contain constants for all user-defined token names and the predefined
 +@code{EOF} token.
  
  In the first case, the body of the scanner class is placed in
  @code{%code lexer} blocks.  If you want to pass parameters from the
@@@ -10986,7 -10432,7 +11096,7 @@@ Return the next token.  Its type is th
  value and location are saved and returned by the their methods in the
  interface.
  
 -Use @code{%define lex_throws} to specify any uncaught exceptions.
 +Use @samp{%define lex_throws} to specify any uncaught exceptions.
  Default is @code{java.io.IOException}.
  @end deftypemethod
  
@@@ -11003,7 -10449,7 +11113,7 @@@ The return type can be changed using @c
  @deftypemethod {Lexer} {Object} getLVal ()
  Return the semantic value of the last token that yylex returned.
  
 -The return type can be changed using @code{%define stype
 +The return type can be changed using @samp{%define stype
  "@var{class-name}".}
  @end deftypemethod
  
  The following special constructs can be uses in Java actions.
  Other analogous C action features are currently unavailable for Java.
  
 -Use @code{%define throws} to specify any uncaught exceptions from parser
 +Use @samp{%define throws} to specify any uncaught exceptions from parser
  actions, and initial actions specified by @code{%initial-action}.
  
  @defvar $@var{n}
@@@ -11031,7 -10477,7 +11141,7 @@@ Like @code{$@var{n}} but specifies a al
  @defvar $$
  The semantic value for the grouping made by the current rule.  As a
  value, this is in the base type (@code{Object} or as specified by
 -@code{%define stype}) as in not cast to the declared subtype because
 +@samp{%define stype}) as in not cast to the declared subtype because
  casts are not allowed on the left-hand side of Java assignments.
  Use an explicit Java cast if the correct subtype is needed.
  @xref{Java Semantic Values}.
@@@ -11078,12 -10524,11 +11188,12 @@@ operation
  @xref{Error Recovery}.
  @end deftypefn
  
 -@deftypefn  {Function} {protected void} yyerror (String msg)
 -@deftypefnx {Function} {protected void} yyerror (Position pos, String msg)
 -@deftypefnx {Function} {protected void} yyerror (Location loc, String msg)
 +@deftypefn  {Function} {void} yyerror (String @var{msg})
 +@deftypefnx {Function} {void} yyerror (Position @var{loc}, String @var{msg})
 +@deftypefnx {Function} {void} yyerror (Location @var{loc}, String @var{msg})
  Print an error message using the @code{yyerror} method of the scanner
 -instance in use.
 +instance in use. The @code{Location} and @code{Position} parameters are
 +available only if location tracking is active.
  @end deftypefn
  
  
@@@ -11127,7 -10572,7 +11237,7 @@@ The prologue declarations have a differ
  @item @code{%code imports}
  blocks are placed at the beginning of the Java source code.  They may
  include copyright notices.  For a @code{package} declarations, it is
 -suggested to use @code{%define package} instead.
 +suggested to use @samp{%define package} instead.
  
  @item unqualified @code{%code}
  blocks are placed inside the parser class.
@@@ -11168,7 -10613,7 +11278,7 @@@ constructor that @emph{creates} a lexer
  
  @deffn {Directive} %name-prefix "@var{prefix}"
  The prefix of the parser class name @code{@var{prefix}Parser} if
 -@code{%define parser_class_name} is not used.  Default is @code{YY}.
 +@samp{%define parser_class_name} is not used.  Default is @code{YY}.
  @xref{Java Bison Interface}.
  @end deffn
  
@@@ -11199,11 -10644,6 +11309,11 @@@ Code inserted just after the @code{pack
  @xref{Java Differences}.
  @end deffn
  
 +@deffn {Directive} {%code init} @{ @var{code} @dots{} @}
 +Code inserted at the beginning of the parser constructor body.
 +@xref{Java Parser Interface}.
 +@end deffn
 +
  @deffn {Directive} {%code lexer} @{ @var{code} @dots{} @}
  Code added to the body of a inner lexer class within the parser class.
  @xref{Java Scanner Interface}.
@@@ -11216,7 -10656,7 +11326,7 @@@ Code (after the second @code{%%}) appen
  @end deffn
  
  @deffn {Directive} %@{ @var{code} @dots{} %@}
 -Not supported.  Use @code{%code import} instead.
 +Not supported.  Use @code{%code imports} instead.
  @xref{Java Differences}.
  @end deffn
  
@@@ -11225,11 -10665,6 +11335,11 @@@ Whether the parser class is declared @c
  @xref{Java Bison Interface}.
  @end deffn
  
 +@deffn {Directive} {%define annotations} "@var{annotations}"
 +The Java annotations for the parser class.  Default is none.
 +@xref{Java Bison Interface}.
 +@end deffn
 +
  @deffn {Directive} {%define extends} "@var{superclass}"
  The superclass of the parser class.  Default is none.
  @xref{Java Bison Interface}.
@@@ -11246,12 -10681,6 +11356,12 @@@ Default is none
  @xref{Java Bison Interface}.
  @end deffn
  
 +@deffn {Directive} {%define init_throws} "@var{exceptions}"
 +The exceptions thrown by @code{%code init} from the parser class
 +constructor.  Default is none.
 +@xref{Java Parser Interface}.
 +@end deffn
 +
  @deffn {Directive} {%define lex_throws} "@var{exceptions}"
  The exceptions thrown by the @code{yylex} method of the lexer, a
  comma-separated list.  Default is @code{java.io.IOException}.
@@@ -11771,19 -11200,6 +11881,19 @@@ the grammar file.  @xref{Grammar Outlin
  Grammar}.
  @end deffn
  
 +@deffn {Directive} %?@{@var{expression}@}
 +Predicate actions.  This is a type of action clause that may appear in
 +rules. The expression is evaluated, and if false, causes a syntax error.  In
 +GLR parsers during nondeterministic operation,
 +this silently causes an alternative parse to die.  During deterministic
 +operation, it is the same as the effect of YYERROR.
 +@xref{Semantic Predicates}.
 +
 +This feature is experimental.
 +More user feedback will help to determine whether it should become a permanent
 +feature.
 +@end deffn
 +
  @deffn {Construct} /*@dots{}*/
  Comment delimiters, as in C.
  @end deffn
@@@ -11893,8 -11309,8 +12003,8 @@@ token is reset to the token that origin
  @end deffn
  
  @deffn {Directive} %error-verbose
 -Bison declaration to request verbose, specific error message strings
 -when @code{yyerror} is called.  @xref{Error Reporting}.
 +An obsolete directive standing for @samp{%define parse.error verbose}
 +(@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}).
  @end deffn
  
  @deffn {Directive} %file-prefix "@var{prefix}"
@@@ -11917,12 -11333,12 +12027,12 @@@ Specify the programming language for th
  @end deffn
  
  @deffn {Directive} %left
 -Bison declaration to assign left associativity to token(s).
 +Bison declaration to assign precedence and left associativity to token(s).
  @xref{Precedence Decl, ,Operator Precedence}.
  @end deffn
  
 -@deffn {Directive} %lex-param @{@var{argument-declaration}@}
 -Bison declaration to specifying an additional parameter that
 +@deffn {Directive} %lex-param @{@var{argument-declaration}@} @dots{}
 +Bison declaration to specifying additional arguments that
  @code{yylex} should accept.  @xref{Pure Calling,, Calling Conventions
  for Pure Parsers}.
  @end deffn
@@@ -11967,7 -11383,7 +12077,7 @@@ parser implementation file.  @xref{Dec
  @end deffn
  
  @deffn {Directive} %nonassoc
 -Bison declaration to assign nonassociativity to token(s).
 +Bison declaration to assign precedence and nonassociativity to token(s).
  @xref{Precedence Decl, ,Operator Precedence}.
  @end deffn
  
@@@ -11976,15 -11392,10 +12086,15 @@@ Bison declaration to set the name of th
  @xref{Decl Summary}.
  @end deffn
  
 -@deffn {Directive} %parse-param @{@var{argument-declaration}@}
 -Bison declaration to specifying an additional parameter that
 -@code{yyparse} should accept.  @xref{Parser Function,, The Parser
 -Function @code{yyparse}}.
 +@deffn {Directive} %param @{@var{argument-declaration}@} @dots{}
 +Bison declaration to specify additional arguments that both
 +@code{yylex} and @code{yyparse} should accept.  @xref{Parser Function,, The
 +Parser Function @code{yyparse}}.
 +@end deffn
 +
 +@deffn {Directive} %parse-param @{@var{argument-declaration}@} @dots{}
 +Bison declaration to specify additional arguments that @code{yyparse}
 +should accept.  @xref{Parser Function,, The Parser Function @code{yyparse}}.
  @end deffn
  
  @deffn {Directive} %prec
@@@ -11992,13 -11403,8 +12102,13 @@@ Bison declaration to assign a precedenc
  @xref{Contextual Precedence, ,Context-Dependent Precedence}.
  @end deffn
  
 +@deffn {Directive} %precedence
 +Bison declaration to assign precedence to token(s), but no associativity
 +@xref{Precedence Decl, ,Operator Precedence}.
 +@end deffn
 +
  @deffn {Directive} %pure-parser
 -Deprecated version of @code{%define api.pure} (@pxref{%define
 +Deprecated version of @samp{%define api.pure} (@pxref{%define
  Summary,,api.pure}), for which Bison is more careful to warn about
  unreasonable usage.
  @end deffn
@@@ -12009,7 -11415,7 +12119,7 @@@ Require a Version of Bison}
  @end deffn
  
  @deffn {Directive} %right
 -Bison declaration to assign right associativity to token(s).
 +Bison declaration to assign precedence and right associativity to token(s).
  @xref{Precedence Decl, ,Operator Precedence}.
  @end deffn
  
@@@ -12114,16 -11520,17 +12224,16 @@@ instead
  
  @deffn {Function} yyerror
  User-supplied function to be called by @code{yyparse} on error.
 -@xref{Error Reporting, ,The Error
 -Reporting Function @code{yyerror}}.
 +@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}.
  @end deffn
  
  @deffn {Macro} YYERROR_VERBOSE
 -An obsolete macro that you define with @code{#define} in the prologue
 -to request verbose, specific error message strings
 -when @code{yyerror} is called.  It doesn't matter what definition you
 -use for @code{YYERROR_VERBOSE}, just whether you define it.
 -Supported by the C skeletons only; using
 -@code{%error-verbose} is preferred.  @xref{Error Reporting}.
 +An obsolete macro used in the @file{yacc.c} skeleton, that you define
 +with @code{#define} in the prologue to request verbose, specific error
 +message strings when @code{yyerror} is called.  It doesn't matter what
 +definition you use for @code{YYERROR_VERBOSE}, just whether you define
 +it.  Using @samp{%define parse.error verbose} is preferred
 +(@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}).
  @end deffn
  
  @deffn {Macro} YYFPRINTF
@@@ -12234,6 -11641,13 +12344,6 @@@ parse a single token.  @xref{Push Parse
  More user feedback will help to stabilize it.)
  @end deffn
  
 -@deffn {Macro} YYPARSE_PARAM
 -An obsolete macro for specifying the name of a parameter that
 -@code{yyparse} should accept.  The use of this macro is deprecated, and
 -is supported only for Yacc like parsers.  @xref{Pure Calling,, Calling
 -Conventions for Pure Parsers}.
 -@end deffn
 -
  @deffn {Macro} YYRECOVERING
  The expression @code{YYRECOVERING ()} yields 1 when the parser
  is recovering from a syntax error, and 0 otherwise.
@@@ -12580,9 -11994,9 +12690,9 @@@ London, Department of Computer Science
  @c LocalWords: subdirectory Solaris nonassociativity perror schemas Malloy ints
  @c LocalWords: Scannerless ispell american ChangeLog smallexample CSTYPE CLTYPE
  @c LocalWords: clval CDEBUG cdebug deftypeopx yyterminate LocationType
+ @c LocalWords: errorVerbose
  
  @c Local Variables:
  @c ispell-dictionary: "american"
  @c fill-column: 76
  @c End:
- @c  LocalWords:  errorVerbose
diff --combined doc/local.mk
index 54c03ebf2996f490ed55271cad10aad92a2a6345,0000000000000000000000000000000000000000..53c0142d025636453bbc7090fda0fd74083585a3
mode 100644,000000..100644
--- /dev/null
@@@ -1,141 -1,0 +1,171 @@@
 +## Copyright (C) 2001-2003, 2005-2012 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.texi
 +doc_bison_TEXINFOS =                            \
 +  $(CROSS_OPTIONS_TEXI)                         \
 +  doc/fdl.texi                                  \
 +  doc/gpl-3.0.texi
 +
 +TEXI2DVI = texi2dvi --build-dir=doc/bison.t2d
 +CLEANDIRS = doc/bison.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.
 +      $(AM_V_GEN){ test ! -f $@ || cat $@; } >$@~
 +      $(AM_V_at)test ! -f $@.tmp || rm -f $@.tmp
 +      $(AM_V_at)src/bison$(EXEEXT) --help |                            \
 +        $(PERL) $(CROSS_OPTIONS_PL) $(top_srcdir)/src/scan-gram.l >$@.tmp
 +      $(AM_V_at)diff -u $@~ $@.tmp || true
 +      $(AM_V_at)mv $@.tmp $@
 +MAINTAINERCLEANFILES = $(CROSS_OPTIONS_TEXI)
 +
 +## ---------- ##
 +## Ref card.  ##
 +## ---------- ##
 +
 +EXTRA_DIST += doc/refcard.tex
 +CLEANFILES += doc/refcard.pdf
 +
 +doc/refcard.pdf: doc/refcard.tex
 +      $(AM_V_GEN) cd doc && pdftex $(abs_top_srcdir)/doc/refcard.tex
 +
 +
 +
 +## ---------------- ##
 +## 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)
 +      $(AM_V_GEN)src/bison$(EXEEXT) --version >doc/bison.help.tmp
 +      $(AM_V_at) src/bison$(EXEEXT) --help   >>doc/bison.help.tmp
 +      $(AM_V_at)$(top_srcdir)/build-aux/move-if-change doc/bison.help.tmp $@
 +
 +
 +## ----------- ##
 +## 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
 +      $(AM_V_GEN)$(HELP2MAN)                  \
 +          --include=$(top_srcdir)/doc/bison.x \
 +          --output=$@.t src/bison$(EXEEXT)
 +      $(AM_V_at)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
 +      $(AM_V_at)rm -f $@*.t
 +
 +nodist_man_MANS = doc/yacc.1
 +
++## ----------------------------- ##
++## Graphviz examples generation. ##
++## ----------------------------- ##
++
++CLEANDIRS += doc/figs
++FIGS_DOT = doc/figs/example-reduce.dot doc/figs/example-shift.dot
++EXTRA_DIST +=                                                         \
++  $(FIGS_DOT)                                                         \
++  $(FIGS_DOT:.dot=.eps) $(FIGS_DOT:.dot=.pdf) $(FIGS_DOT:.dot=.png)
++SUFFIXES += .dot .eps .pdf .png
++
++bison.dvi:  $(FIGS_DOT:.dot=.eps)
++bison.html: $(FIGS_DOT:.dot=.png)
++bison.pdf:  $(FIGS_DOT:.dot=.pdf)
++
++.dot.eps:
++      $(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
++      $(AM_V_at) $(DOT) -Gmargin=0 -Teps $< >$@.tmp
++      $(AM_V_at) mv $@.tmp $@
++
++.dot.pdf:
++      $(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
++      $(AM_V_at) $(DOT) -Gmargin=0 -Tpdf $< >$@.tmp
++      $(AM_V_at) mv $@.tmp $@
++
++.dot.png:
++      $(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
++      $(AM_V_at) $(DOT) -Gmargin=0 -Tpng $< >$@.tmp
++      $(AM_V_at) mv $@.tmp $@
++
 +## -------------- ##
 +## Doxygenation.  ##
 +## -------------- ##
 +
 +DOXYGEN = doxygen
 +
 +.PHONY: doc html
 +
 +doc: html
 +
 +html-local: doc/Doxyfile
 +      $(AM_V_GEN) $(DOXYGEN) doc/Doxyfile
 +
 +edit = sed -e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \
 +         -e 's,@PACKAGE_VERSION\@,$(PACKAGE_VERSION),g' \
 +         -e 's,@PERL\@,$(PERL),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
 +      $(AM_V_GEN) $(edit) $(top_srcdir)/doc/Doxyfile.in >doc/Doxyfile
 +
 +CLEANDIRS += doc/html
diff --combined gnulib
index dcf27bef48c9800d5a2be8349226f73f1b8ff2e5,0e6a848c8cd1e9442e3794c7dcd2f535ea9797c6..6061979365c067965ee376b3d0a65819779a89c5
--- 1/gnulib
--- 2/gnulib
+++ b/gnulib
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit dcf27bef48c9800d5a2be8349226f73f1b8ff2e5
 -Subproject commit 0e6a848c8cd1e9442e3794c7dcd2f535ea9797c6
++Subproject commit 6061979365c067965ee376b3d0a65819779a89c5
diff --combined src/location.h
index 17da73ca6b174b29ea95a2f7ae656de97e395301,5ebb92e30e5272aa8e4e6fe3f950d55acdea35f6..369125b7cee7bbc6000acade29090d2f60f74cb0
@@@ -73,8 -73,8 +73,8 @@@ static inline boo
  equal_boundaries (boundary a, boundary b)
  {
    return (a.column == b.column
 -        && a.line == b.line
 -        && UNIQSTR_EQ (a.file, b.file));
 +          && a.line == b.line
 +          && UNIQSTR_EQ (a.file, b.file));
  }
  
  /* A location, that is, a region of source code.  */
@@@ -88,7 -88,7 +88,7 @@@ typedef struc
  
  } location;
  
- #define YYLTYPE location
+ #define GRAM_LTYPE location
  
  #define EMPTY_LOCATION_INIT {{NULL, 0, 0}, {NULL, 0, 0}}
  extern location const empty_location;
@@@ -96,7 -96,7 +96,7 @@@
  /* Set *LOC and adjust scanner cursor to account for token TOKEN of
     size SIZE.  */
  void location_compute (location *loc,
 -                     boundary *cur, char const *token, size_t size);
 +                       boundary *cur, char const *token, size_t size);
  
  /* Print location to file. Return number of actually printed
     characters.  */
diff --combined src/parse-gram.y
index 1624dde55a7a2549830fa37f78e7bb32ff281db6,5f77a5bd08abd0355531dadbbebe53503442c77a..6e58835aee4c6df7fc6fdd24d7c56f6cf7631b02
@@@ -31,7 -31,6 +31,7 @@@
  #include "quotearg.h"
  #include "reader.h"
  #include "symlist.h"
 +#include "symtab.h"
  #include "scan-gram.h"
  #include "scan-code.h"
  #include "xmemdup0.h"
@@@ -40,7 -39,7 +40,7 @@@
  static YYLTYPE lloc_default (YYLTYPE const *, int);
  
  #define YY_LOCATION_PRINT(File, Loc) \
 -        location_print (File, Loc)
 +          location_print (File, Loc)
  
  static void version_check (location const *loc, char const *version);
  
     FIXME: depends on the undocumented availability of YYLLOC.  */
  #undef  yyerror
  #define yyerror(Msg) \
 -      gram_error (&yylloc, Msg)
 +        gram_error (&yylloc, Msg)
  static void gram_error (location const *, char const *);
  
  static char const *char_name (char);
 +%}
  
 -/** Add a lex-param or a parse-param.
 - *
 - * \param type  \a lex_param or \a parse_param
 - * \param decl  the formal argument
 - * \param loc   the location in the source.
 - */
 -static void add_param (char const *type, char *decl, location loc);
 -
 -
 -static symbol_class current_class = unknown_sym;
 -static uniqstr current_type = NULL;
 -static symbol *current_lhs_symbol;
 -static location current_lhs_location;
 -static named_ref *current_lhs_named_ref;
 -static int current_prec = 0;
 -
 -/** Set the new current left-hand side symbol, possibly common
 - * to several right-hand side parts of rule.
 - */
 -static
 -void
 -current_lhs(symbol *sym, location loc, named_ref *ref)
 +%code
  {
 -  current_lhs_symbol = sym;
 -  current_lhs_location = loc;
 -  /* In order to simplify memory management, named references for lhs
 -     are always assigned by deep copy into the current symbol_list
 -     node.  This is because a single named-ref in the grammar may
 -     result in several uses when the user factors lhs between several
 -     rules using "|".  Therefore free the parser's original copy.  */
 -  free (current_lhs_named_ref);
 -  current_lhs_named_ref = ref;
 -}
 -
 +  static int current_prec = 0;
 +  static location current_lhs_location;
 +  static named_ref *current_lhs_named_ref;
 +  static symbol *current_lhs_symbol;
 +  static symbol_class current_class = unknown_sym;
 +  static uniqstr current_type = NULL;
 +
 +  /** Set the new current left-hand side symbol, possibly common
 +   * to several right-hand side parts of rule.
 +   */
 +  static
 +  void
 +  current_lhs(symbol *sym, location loc, named_ref *ref)
 +  {
 +    current_lhs_symbol = sym;
 +    current_lhs_location = loc;
 +    /* In order to simplify memory management, named references for lhs
 +       are always assigned by deep copy into the current symbol_list
 +       node.  This is because a single named-ref in the grammar may
 +       result in several uses when the user factors lhs between several
 +       rules using "|".  Therefore free the parser's original copy.  */
 +    free (current_lhs_named_ref);
 +    current_lhs_named_ref = ref;
 +  }
  
 -#define YYTYPE_INT16 int_fast16_t
 -#define YYTYPE_INT8 int_fast8_t
 -#define YYTYPE_UINT16 uint_fast16_t
 -#define YYTYPE_UINT8 uint_fast8_t
 -%}
 +  #define YYTYPE_INT16 int_fast16_t
 +  #define YYTYPE_INT8 int_fast8_t
 +  #define YYTYPE_UINT16 uint_fast16_t
 +  #define YYTYPE_UINT8 uint_fast8_t
 +}
  
- %verbose
- %defines
- %define locations
 -%debug
+ %define api.prefix "gram_"
  %define api.pure
++%define locations
 +%define parse.error verbose
  %define parse.lac full
- %name-prefix "gram_"
 +%define parse.trace
 -%error-verbose
+ %defines
  %expect 0
 -%locations
+ %verbose
  
  %initial-action
  {
  
  %union
  {
 +  assoc assoc;
 +  char *code;
 +  char const *chars;
 +  int integer;
 +  named_ref *named_ref;
    symbol *symbol;
    symbol_list *list;
 -  int integer;
 -  char const *chars;
 -  char *code;
 -  assoc assoc;
    uniqstr uniqstr;
    unsigned char character;
 -  named_ref *named_ref;
  };
  
  /* Define the tokens together with their human representation.  */
  %token PERCENT_LEFT        "%left"
  %token PERCENT_RIGHT       "%right"
  %token PERCENT_NONASSOC    "%nonassoc"
 +%token PERCENT_PRECEDENCE  "%precedence"
  
  %token PERCENT_PREC          "%prec"
  %token PERCENT_DPREC         "%dprec"
  %token PERCENT_MERGE         "%merge"
  
 -
  /*----------------------.
  | Global Declarations.  |
  `----------------------*/
  
  %token
    PERCENT_CODE            "%code"
 -  PERCENT_DEBUG           "%debug"
    PERCENT_DEFAULT_PREC    "%default-prec"
    PERCENT_DEFINE          "%define"
    PERCENT_DEFINES         "%defines"
    PERCENT_ERROR_VERBOSE   "%error-verbose"
    PERCENT_EXPECT          "%expect"
 -  PERCENT_EXPECT_RR     "%expect-rr"
 +  PERCENT_EXPECT_RR       "%expect-rr"
 +  PERCENT_FLAG            "%<flag>"
    PERCENT_FILE_PREFIX     "%file-prefix"
    PERCENT_GLR_PARSER      "%glr-parser"
    PERCENT_INITIAL_ACTION  "%initial-action"
    PERCENT_LANGUAGE        "%language"
 -  PERCENT_LEX_PARAM       "%lex-param"
 -  PERCENT_LOCATIONS       "%locations"
    PERCENT_NAME_PREFIX     "%name-prefix"
    PERCENT_NO_DEFAULT_PREC "%no-default-prec"
    PERCENT_NO_LINES        "%no-lines"
    PERCENT_NONDETERMINISTIC_PARSER
 -                        "%nondeterministic-parser"
 +                          "%nondeterministic-parser"
    PERCENT_OUTPUT          "%output"
 -  PERCENT_PARSE_PARAM     "%parse-param"
 -  PERCENT_PURE_PARSER     "%pure-parser"
 -  PERCENT_REQUIRE       "%require"
 +  PERCENT_REQUIRE         "%require"
    PERCENT_SKELETON        "%skeleton"
    PERCENT_START           "%start"
    PERCENT_TOKEN_TABLE     "%token-table"
  ;
  
  %token BRACED_CODE     "{...}"
 +%token BRACED_PREDICATE "%?{...}"
  %token BRACKETED_ID    "[identifier]"
  %token CHAR            "char"
  %token EPILOGUE        "epilogue"
  %token PIPE            "|"
  %token PROLOGUE        "%{...%}"
  %token SEMICOLON       ";"
 -%token TYPE            "type"
 -%token TYPE_TAG_ANY    "<*>"
 -%token TYPE_TAG_NONE   "<>"
 +%token TAG             "<tag>"
 +%token TAG_ANY         "<*>"
 +%token TAG_NONE        "<>"
  
  %type <character> CHAR
 -%printer { fputs (char_name ($$), stderr); } CHAR
 +%printer { fputs (char_name ($$), yyo); } CHAR
  
  /* braceless is not to be used for rule or symbol actions, as it
     calls code_props_plain_init.  */
  %type <chars> STRING "%{...%}" EPILOGUE braceless content.opt
 -%type <code> "{...}"
 -%printer { fputs (quotearg_style (c_quoting_style, $$), stderr); }
 -       STRING
 -%printer { fprintf (stderr, "{\n%s\n}", $$); }
 -       braceless content.opt "{...}" "%{...%}" EPILOGUE
 -
 -%type <uniqstr> BRACKETED_ID ID ID_COLON TYPE variable
 -%printer { fputs ($$, stderr); } <uniqstr>
 -%printer { fprintf (stderr, "[%s]", $$); } BRACKETED_ID
 -%printer { fprintf (stderr, "%s:", $$); } ID_COLON
 -%printer { fprintf (stderr, "<%s>", $$); } TYPE
 +%type <code> "{...}" "%?{...}"
 +%printer { fputs (quotearg_style (c_quoting_style, $$), yyo); }
 +         STRING
 +%printer { fprintf (yyo, "{\n%s\n}", $$); }
 +         braceless content.opt "{...}" "%{...%}" EPILOGUE
 +
 +%type <uniqstr> BRACKETED_ID ID ID_COLON PERCENT_FLAG TAG tag variable
 +%printer { fputs ($$, yyo); } <uniqstr>
 +%printer { fprintf (yyo, "[%s]", $$); } BRACKETED_ID
 +%printer { fprintf (yyo, "%s:", $$); } ID_COLON
 +%printer { fprintf (yyo, "%%%s", $$); } PERCENT_FLAG
 +%printer { fprintf (yyo, "<%s>", $$); } TAG tag
  
  %type <integer> INT
 -%printer { fprintf (stderr, "%d", $$); } <integer>
 +%printer { fprintf (yyo, "%d", $$); } <integer>
  
  %type <symbol> id id_colon string_as_id symbol symbol.prec
 -%printer { fprintf (stderr, "%s", $$->tag); } <symbol>
 -%printer { fprintf (stderr, "%s:", $$->tag); } id_colon
 +%printer { fprintf (yyo, "%s", $$->tag); } <symbol>
 +%printer { fprintf (yyo, "%s:", $$->tag); } id_colon
  
  %type <assoc> precedence_declarator
  %type <list>  symbols.1 symbols.prec generic_symlist generic_symlist_item
  %type <named_ref> named_ref.opt
  
 +/*---------.
 +| %param.  |
 +`---------*/
 +%code requires
 +{
 +# ifndef PARAM_TYPE
 +#  define PARAM_TYPE
 +  typedef enum
 +  {
 +    param_none   = 0,
 +    param_lex    = 1 << 0,
 +    param_parse  = 1 << 1,
 +    param_both   = param_lex | param_parse
 +  } param_type;
 +# endif
 +};
 +%code
 +{
 +  /** Add a lex-param and/or a parse-param.
 +   *
 +   * \param type  where to push this formal argument.
 +   * \param decl  the formal argument.  Destroyed.
 +   * \param loc   the location in the source.
 +   */
 +  static void add_param (param_type type, char *decl, location loc);
 +  static param_type current_param = param_none;
 +};
 +%union
 +{
 +  param_type param;
 +}
 +%token <param> PERCENT_PARAM "%param";
 +%printer
 +{
 +  switch ($$)
 +    {
 +#define CASE(In, Out)                                           \
 +      case param_ ## In: fputs ("%" #Out, stderr); break
 +      CASE(lex,   lex-param);
 +      CASE(parse, parse-param);
 +      CASE(both,  param);
 +#undef CASE
 +      case param_none: aver (false); break;
 +    }
 +} <param>;
 +
 +
 +                     /*==========\
 +                     | Grammar.  |
 +                     \==========*/
  %%
  
  input:
  ;
  
  
 -      /*------------------------------------.
 -      | Declarations: before the first %%.  |
 -      `------------------------------------*/
 +        /*------------------------------------.
 +        | Declarations: before the first %%.  |
 +        `------------------------------------*/
  
  prologue_declarations:
    /* Nothing */
@@@ -294,10 -252,7 +294,10 @@@ prologue_declaration
                          plain_code.code, @1);
        code_scanner_last_string_free ();
      }
 -| "%debug"                         { debug = true; }
 +| "%<flag>"
 +    {
 +      muscle_percent_define_ensure ($1, @1, true);
 +    }
  | "%define" variable content.opt
      {
        muscle_percent_define_insert ($2, @2, $3,
        defines_flag = true;
        spec_defines_file = xstrdup ($2);
      }
 -| "%error-verbose"                 { error_verbose = true; }
 +| "%error-verbose"
 +    {
 +      muscle_percent_define_insert ("parse.error", @1, "verbose",
 +                                    MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
 +    }
  | "%expect" INT                    { expected_sr_conflicts = $2; }
 -| "%expect-rr" INT               { expected_rr_conflicts = $2; }
 +| "%expect-rr" INT                 { expected_rr_conflicts = $2; }
  | "%file-prefix" STRING            { spec_file_prefix = $2; }
 -| "%file-prefix" "=" STRING        { spec_file_prefix = $3; } /* deprecated */
  | "%glr-parser"
      {
        nondeterministic_parser = true;
        muscle_code_grow ("initial_action", action.code, @2);
        code_scanner_last_string_free ();
      }
 -| "%language" STRING          { language_argmatch ($2, grammar_prio, @1); }
 -| "%lex-param" "{...}"                { add_param ("lex_param", $2, @2); }
 -| "%locations"                  { locations_flag = true; }
 +| "%language" STRING            { language_argmatch ($2, grammar_prio, @1); }
  | "%name-prefix" STRING         { spec_name_prefix = $2; }
 -| "%name-prefix" "=" STRING     { spec_name_prefix = $3; } /* deprecated */
  | "%no-lines"                   { no_lines_flag = true; }
 -| "%nondeterministic-parser"  { nondeterministic_parser = true; }
 +| "%nondeterministic-parser"    { nondeterministic_parser = true; }
  | "%output" STRING              { spec_outfile = $2; }
 -| "%output" "=" STRING          { spec_outfile = $3; }  /* deprecated */
 -| "%parse-param" "{...}"      { add_param ("parse_param", $2, @2); }
 -| "%pure-parser"
 -    {
 -      /* %pure-parser is deprecated in favor of `%define api.pure', so use
 -         `%define api.pure' in a backward-compatible manner here.  First, don't
 -         complain if %pure-parser is specified multiple times.  */
 -      if (!muscle_find_const ("percent_define(api.pure)"))
 -        muscle_percent_define_insert ("api.pure", @1, "",
 -                                      MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
 -      /* In all cases, use api.pure now so that the backend doesn't complain if
 -         the skeleton ignores api.pure, but do warn now if there's a previous
 -         conflicting definition from an actual %define.  */
 -      if (!muscle_percent_define_flag_if ("api.pure"))
 -        muscle_percent_define_insert ("api.pure", @1, "",
 -                                      MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
 -    }
 +| "%param" { current_param = $1; } params { current_param = param_none; }
  | "%require" STRING             { version_check (&@2, $2); }
  | "%skeleton" STRING
      {
        char const *skeleton_user = $2;
 -      if (mbschr (skeleton_user, '/'))
 +      if (strchr (skeleton_user, '/'))
          {
            size_t dir_length = strlen (current_file);
            char *skeleton_build;
  | /*FIXME: Err?  What is this horror doing here? */ ";"
  ;
  
 +params:
 +   params "{...}"  { add_param (current_param, $2, @2); }
 +| "{...}"          { add_param (current_param, $1, @1); }
 +;
 +
 +
 +/*----------------------.
 +| grammar_declaration.  |
 +`----------------------*/
 +
  grammar_declaration:
    precedence_declaration
  | symbol_declaration
      {
        grammar_start_symbol_set ($2, @2);
      }
 -| "%destructor" "{...}" generic_symlist
 +| code_props_type "{...}" generic_symlist
      {
        code_props code;
        code_props_symbol_action_init (&code, $2, @2);
        {
          symbol_list *list;
          for (list = $3; list; list = list->next)
 -          symbol_list_destructor_set (list, &code);
 -        symbol_list_free ($3);
 -      }
 -    }
 -| "%printer" "{...}" generic_symlist
 -    {
 -      code_props code;
 -      code_props_symbol_action_init (&code, $2, @2);
 -      code_props_translate_code (&code);
 -      {
 -        symbol_list *list;
 -        for (list = $3; list; list = list->next)
 -          symbol_list_printer_set (list, &code);
 +          symbol_list_code_props_set (list, $1, &code);
          symbol_list_free ($3);
        }
      }
      }
  ;
  
 +%type <code_type> code_props_type;
 +%union {code_props_type code_type;};
 +%printer { fprintf (yyo, "%s", code_props_type_string ($$)); } <code_type>;
 +code_props_type:
 +  "%destructor"  { $$ = destructor; }
 +| "%printer"     { $$ = printer; }
 +;
  
 -/*----------*
 - | %union.  |
 - *----------*/
 +/*---------.
 +| %union.  |
 +`---------*/
  
  %token PERCENT_UNION "%union";
  
@@@ -461,41 -427,40 +461,41 @@@ symbol_declaration
        current_class = unknown_sym;
        current_type = NULL;
      }
 -| "%type" TYPE symbols.1
 +| "%type" TAG symbols.1
      {
        symbol_list *list;
        tag_seen = true;
        for (list = $3; list; list = list->next)
 -      symbol_type_set (list->content.sym, $2, @2);
 +        symbol_type_set (list->content.sym, $2, @2);
        symbol_list_free ($3);
      }
  ;
  
  precedence_declaration:
 -  precedence_declarator type.opt symbols.prec
 +  precedence_declarator tag.opt symbols.prec
      {
        symbol_list *list;
        ++current_prec;
        for (list = $3; list; list = list->next)
 -      {
 -        symbol_type_set (list->content.sym, current_type, @2);
 -        symbol_precedence_set (list->content.sym, current_prec, $1, @1);
 -      }
 +        {
 +          symbol_type_set (list->content.sym, current_type, @2);
 +          symbol_precedence_set (list->content.sym, current_prec, $1, @1);
 +        }
        symbol_list_free ($3);
        current_type = NULL;
      }
  ;
  
  precedence_declarator:
 -  "%left"     { $$ = left_assoc; }
 -| "%right"    { $$ = right_assoc; }
 -| "%nonassoc" { $$ = non_assoc; }
 +  "%left"       { $$ = left_assoc; }
 +| "%right"      { $$ = right_assoc; }
 +| "%nonassoc"   { $$ = non_assoc; }
 +| "%precedence" { $$ = precedence_assoc; }
  ;
  
 -type.opt:
 +tag.opt:
    /* Nothing. */ { current_type = NULL; }
 -| TYPE           { current_type = $1; tag_seen = true; }
 +| TAG            { current_type = $1; tag_seen = true; }
  ;
  
  /* Just like symbols.1 but accept INT for the sake of POSIX.  */
@@@ -507,9 -472,9 +507,9 @@@ symbols.prec
  ;
  
  symbol.prec:
 -    symbol { $$ = $1; }
 -  | symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); }
 -  ;
 +  symbol     { $$ = $1; }
 +| symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); }
 +;
  
  /* One or more symbols to be %typed. */
  symbols.1:
@@@ -525,19 -490,15 +525,19 @@@ generic_symlist
  ;
  
  generic_symlist_item:
 -  symbol            { $$ = symbol_list_sym_new ($1, @1); }
 -| TYPE              { $$ = symbol_list_type_new ($1, @1); }
 -| "<*>"             { $$ = symbol_list_default_tagged_new (@1); }
 -| "<>"             { $$ = symbol_list_default_tagless_new (@1); }
 +  symbol    { $$ = symbol_list_sym_new ($1, @1); }
 +| tag       { $$ = symbol_list_type_new ($1, @1); }
 +;
 +
 +tag:
 +  TAG
 +| "<*>" { $$ = uniqstr_new ("*"); }
 +| "<>"  { $$ = uniqstr_new (""); }
  ;
  
  /* One token definition.  */
  symbol_def:
 -  TYPE
 +  TAG
       {
         current_type = $1;
         tag_seen = true;
@@@ -575,9 -536,9 +575,9 @@@ symbol_defs.1
  ;
  
  
 -      /*------------------------------------------.
 -      | The grammar section: between the two %%.  |
 -      `------------------------------------------*/
 +        /*------------------------------------------.
 +        | The grammar section: between the two %%.  |
 +        `------------------------------------------*/
  
  grammar:
    rules_or_grammar_declaration
@@@ -612,18 -573,16 +612,18 @@@ rhses.1
  rhs:
    /* Nothing.  */
      { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
 -                                current_lhs_named_ref); }
 +                                  current_lhs_named_ref); }
  | rhs symbol named_ref.opt
      { grammar_current_rule_symbol_append ($2, @2, $3); }
  | rhs "{...}" named_ref.opt
 -    { grammar_current_rule_action_append ($2, @2, $3); }
 +    { grammar_current_rule_action_append ($2, @2, $3, false); }
 +| rhs "%?{...}"
 +    { grammar_current_rule_action_append ($2, @2, NULL, true); }
  | rhs "%prec" symbol
      { grammar_current_rule_prec_set ($3, @3); }
  | rhs "%dprec" INT
      { grammar_current_rule_dprec_set ($3, @3); }
 -| rhs "%merge" TYPE
 +| rhs "%merge" TAG
      { grammar_current_rule_merge_set ($3, @3); }
  ;
  
@@@ -633,9 -592,10 +633,9 @@@ named_ref.opt
    BRACKETED_ID   { $$ = named_ref_new($1, @1); }
  ;
  
 -
 -/*----------------------------*
 - | variable and content.opt.  |
 - *---------------------------*/
 +/*---------------------------.
 +| variable and content.opt.  |
 +`---------------------------*/
  
  /* The STRING form of variable is deprecated and is not M4-friendly.
     For example, M4 fails for `%define "[" "value"'.  */
@@@ -652,9 -612,9 +652,9 @@@ content.opt
  ;
  
  
 -/*-------------*
 - | braceless.  |
 - *-------------*/
 +/*------------.
 +| braceless.  |
 +`------------*/
  
  braceless:
    "{...}"
  ;
  
  
 -/*---------------*
 - | Identifiers.  |
 - *---------------*/
 +/*--------------.
 +| Identifiers.  |
 +`--------------*/
  
  /* Identifiers are returned as uniqstr values by the scanner.
     Depending on their use, we may need to make them genuine symbols.  */
@@@ -721,6 -681,7 +721,6 @@@ epilogue.opt
  
  %%
  
 -
  /* Return the location of the left-hand side of a rule whose
     right-hand side is RHS[1] ... RHS[N].  Ignore empty nonterminals in
     the right-hand side, and return an empty location equal to the end
@@@ -743,53 -704,51 +743,53 @@@ lloc_default (YYLTYPE const *rhs, int n
    for (i = 1; i <= n; i++)
      if (! equal_boundaries (rhs[i].start, rhs[i].end))
        {
 -      loc.start = rhs[i].start;
 -      break;
 +        loc.start = rhs[i].start;
 +        break;
        }
  
    return loc;
  }
  
  
 -/* Add a lex-param or a parse-param (depending on TYPE) with
 -   declaration DECL and location LOC.  */
 -
  static void
 -add_param (char const *type, char *decl, location loc)
 +add_param (param_type type, char *decl, location loc)
  {
    static char const alphanum[26 + 26 + 1 + 10] =
      "abcdefghijklmnopqrstuvwxyz"
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      "_"
      "0123456789";
 +
    char const *name_start = NULL;
 -  char *p;
 -
 -  /* Stop on last actual character.  */
 -  for (p = decl; p[1]; p++)
 -    if ((p == decl
 -       || ! memchr (alphanum, p[-1], sizeof alphanum))
 -      && memchr (alphanum, p[0], sizeof alphanum - 10))
 -      name_start = p;
 -
 -  /* Strip the surrounding '{' and '}', and any blanks just inside
 -     the braces.  */
 -  --p;
 -  while (c_isspace ((unsigned char) *p))
 +  {
 +    char *p;
 +    /* Stop on last actual character.  */
 +    for (p = decl; p[1]; p++)
 +      if ((p == decl
 +           || ! memchr (alphanum, p[-1], sizeof alphanum))
 +          && memchr (alphanum, p[0], sizeof alphanum - 10))
 +        name_start = p;
 +
 +    /* Strip the surrounding '{' and '}', and any blanks just inside
 +       the braces.  */
      --p;
 -  p[1] = '\0';
 -  ++decl;
 -  while (c_isspace ((unsigned char) *decl))
 +  while (c_isspace ((unsigned char) *p))
 +      --p;
 +    p[1] = '\0';
      ++decl;
 +  while (c_isspace ((unsigned char) *decl))
 +      ++decl;
 +  }
  
    if (! name_start)
 -    complain_at (loc, _("missing identifier in parameter declaration"));
 +    complain (&loc, complaint, _("missing identifier in parameter declaration"));
    else
      {
        char *name = xmemdup0 (name_start, strspn (name_start, alphanum));
 -      muscle_pair_list_grow (type, decl, name);
 +      if (type & param_lex)
 +        muscle_pair_list_grow ("lex_param", decl, name);
 +      if (type & param_parse)
 +        muscle_pair_list_grow ("parse_param", decl, name);
        free (name);
      }
  
@@@ -802,8 -761,8 +802,8 @@@ version_check (location const *loc, cha
  {
    if (strverscmp (version, PACKAGE_VERSION) > 0)
      {
 -      complain_at (*loc, "require bison %s, but have %s",
 -                   version, PACKAGE_VERSION);
 +      complain (loc, complaint, "require bison %s, but have %s",
 +                version, PACKAGE_VERSION);
        exit (EX_MISMATCH);
      }
  }
  static void
  gram_error (location const *loc, char const *msg)
  {
 -  complain_at (*loc, "%s", msg);
 +  complain (loc, complaint, "%s", msg);
  }
  
  char const *
diff --combined src/print_graph.c
index ca1dc24ea54a89713b3426219d50d7dd457be73e,d5ec5fb4212497fe2ddd865786e4951f23fcc581..5aa3cc62593e4a8cb12c7eacdfcbbe483fa75749
  | Construct the node labels.  |
  `----------------------------*/
  
+ /* Print the lhs of a rule in such a manner that there is no vertical
+    repetition, like in *.output files. */
+ static void
+ print_lhs (struct obstack *oout, rule *previous_rule, rule *r)
+ {
+   if (previous_rule && STREQ (previous_rule->lhs->tag, r->lhs->tag))
+     {
+       int i;
+       for (i = 0; i < strlen (r->lhs->tag); ++i)
+         obstack_1grow (oout, ' ');
+       obstack_1grow (oout, '|');
+     }
+   else
+     {
+       obstack_sgrow (oout, escape (r->lhs->tag));
+       obstack_1grow (oout, ':');
+     }
+ }
  static void
  print_core (struct obstack *oout, state *s)
  {
-   size_t i;
    item_number *sitems = s->items;
+   rule *previous_rule = NULL;
+   size_t i;
    size_t snritems = s->nitems;
  
    /* Output all the items of a state, not only its kernel.  */
@@@ -55,7 -76,8 +76,8 @@@
        snritems = nitemset;
      }
  
-   obstack_printf (oout, "state %d\\n", s->number);
+   obstack_printf (oout, _("State %d"), s->number);
+   obstack_sgrow (oout, "\\n");
    for (i = 0; i < snritems; i++)
      {
        item_number *sp;
  
        r = item_number_as_rule_number (*sp);
  
-       obstack_printf (oout, "%d: %s -> ", r, escape (rules[r].lhs->tag));
+       obstack_printf (oout, "%3d ", r);
+       print_lhs (oout, previous_rule, &rules[r]);
+       previous_rule = &rules[r];
  
        for (sp = rules[r].rhs; sp < sp1; sp++)
 -        obstack_printf (oout, " %s", escape (symbols[*sp]->tag));
 +        obstack_printf (oout, "%s ", escape (symbols[*sp]->tag));
  
-       obstack_1grow (oout, '.');
+       obstack_sgrow (oout, " .");
  
        for (/* Nothing */; *sp >= 0; ++sp)
          obstack_printf (oout, " %s", escape (symbols[*sp]->tag));
                bitset_iterator biter;
                int k;
                char const *sep = "";
-               obstack_1grow (oout, '[');
+               obstack_sgrow (oout, "  [");
                BITSET_FOR_EACH (biter, reds->lookahead_tokens[redno], k, 0)
                  {
                    obstack_sgrow (oout, sep);
  static void
  print_actions (state const *s, FILE *fgraph)
  {
-   int i;
    transitions const *trans = s->transitions;
+   int i;
  
    /* Display reductions. */
    output_red (s, s->reductions, fgraph);
    for (i = 0; i < trans->num; i++)
      if (!TRANSITION_IS_DISABLED (trans, i))
        {
 -      state *s1 = trans->states[i];
 -      symbol_number sym = s1->accessing_symbol;
 -
 -      /* Shifts are solid, gotos are dashed, and error is dotted.  */
 -      char const *style =
 -        (TRANSITION_IS_ERROR (trans, i) ? "dotted"
 -         : TRANSITION_IS_SHIFT (trans, i) ? "solid"
 -         : "dashed");
 -
 -      if (TRANSITION_IS_ERROR (trans, i)
 -          && strcmp (symbols[sym]->tag, "error") != 0)
 -        abort ();
 -      output_edge (s->number, s1->number,
 -                   TRANSITION_IS_ERROR (trans, i) ? NULL : symbols[sym]->tag,
 -                   style, fgraph);
 +        state *s1 = trans->states[i];
 +        symbol_number sym = s1->accessing_symbol;
 +
 +        /* Shifts are solid, gotos are dashed, and error is dotted.  */
 +        char const *style =
 +          (TRANSITION_IS_ERROR (trans, i) ? "dotted"
 +           : TRANSITION_IS_SHIFT (trans, i) ? "solid"
 +           : "dashed");
 +
 +        if (TRANSITION_IS_ERROR (trans, i)
 +            && STRNEQ (symbols[sym]->tag, "error"))
 +          abort ();
 +        output_edge (s->number, s1->number,
 +                     TRANSITION_IS_ERROR (trans, i) ? NULL : symbols[sym]->tag,
 +                     style, fgraph);
        }
  }
  
@@@ -161,7 -184,8 +184,7 @@@ print_state (state *s, FILE *fgraph
    /* A node's label contains its items.  */
    obstack_init (&node_obstack);
    print_core (&node_obstack, s);
 -  obstack_1grow (&node_obstack, '\0');
 -  output_node (s->number, obstack_finish (&node_obstack), fgraph);
 +  output_node (s->number, obstack_finish0 (&node_obstack), fgraph);
    obstack_free (&node_obstack, 0);
  
    /* Output the edges.  */
diff --combined src/reader.h
index 2a78f30ab863e2b95b9060824d31f36fc3825d44,e154deb02e234929e83d481aaeffe09fe0178294..badd372dc14c4e94d06de7d638549c753f8f192c
@@@ -44,16 -44,16 +44,16 @@@ char const *token_name (int type)
  /* From reader.c. */
  void grammar_start_symbol_set (symbol *sym, location loc);
  void grammar_current_rule_begin (symbol *lhs, location loc,
 -                               named_ref *lhs_named_ref);
 +                                 named_ref *lhs_named_ref);
  void grammar_current_rule_end (location loc);
  void grammar_midrule_action (void);
  void grammar_current_rule_prec_set (symbol *precsym, location loc);
  void grammar_current_rule_dprec_set (int dprec, location loc);
  void grammar_current_rule_merge_set (uniqstr name, location loc);
  void grammar_current_rule_symbol_append (symbol *sym, location loc,
-                                          named_ref *named_ref);
 -                                       named_ref *nref);
++                                         named_ref *nref);
  void grammar_current_rule_action_append (const char *action, location loc,
-                                          named_ref *named_ref, bool);
 -                                       named_ref *nref);
++                                         named_ref *nref, bool);
  void reader (void);
  void free_merger_functions (void);
  
diff --combined tests/local.at
index ac266daacdb31c7e19455ce72723a7ed51cdc1e0,f172b2445055dc87b7d1deefff793024c3b5f865..bddcb00e8166f1fa6300878d48a8ba8a92bc3cc3
@@@ -109,7 -109,7 +109,7 @@@ m4_define([AT_BISON_OPTION_PUSHDEFS]
  # --------------------------------------------------
  # This macro works around the impossibility to define macros
  # inside macros, because issuing `[$1]' is not possible in M4 :(.
 -# This sucks hard, GNU M4 should really provide M5 like $$1.
 +# This sucks hard, GNU M4 should really provide M5-like $$1.
  m4_define([_AT_BISON_OPTION_PUSHDEFS],
  [m4_if([$1$2], $[1]$[2], [],
         [m4_fatal([$0: Invalid arguments: $@])])dnl
@@@ -152,9 -152,6 +152,9 @@@ m4_pushdef([AT_NAME_PREFIX]
  [m4_bmatch([$3], [\(%define api\.prefix\|%name-prefix\) ".*"],
             [m4_bregexp([$3], [\(%define api\.prefix\|%name-prefix\) "\([^""]*\)"], [\2])],
             [yy])])
 +m4_pushdef([AT_TOKEN_PREFIX],
 +[m4_bmatch([$3], [%define api.token.prefix ".*"],
 +           [m4_bregexp([$3], [%define api.token.prefix "\(.*\)"], [\1])])])
  m4_pushdef([AT_API_prefix],
  [m4_bmatch([$3], [%define api\.prefix ".*"],
             [m4_bregexp([$3], [%define api\.prefix "\([^""]*\)"], [\1])],
@@@ -164,20 -161,20 +164,20 @@@ m4_pushdef([AT_API_PREFIX]
  # yyerror receives the location if %location & %pure & (%glr or %parse-param).
  m4_pushdef([AT_YYERROR_ARG_LOC_IF],
  [AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])],
 -                  [$2])])
 +                    [$2])])
  # yyerror always sees the locations (when activated), except if
  # (yacc & pure & !param).  FIXME: This is wrong.  See the manual.
  m4_pushdef([AT_YYERROR_SEES_LOC_IF],
  [AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
 -                                      [$1])],
 -                          [$1])],
 -              [$2])])
 +                                        [$1])],
 +                            [$1])],
 +                [$2])])
  
  # The interface is pure: either because %define api.pure, or because we
  # are using the C++ parsers.
  m4_pushdef([AT_PURE_LEX_IF],
  [AT_PURE_IF([$1],
 -          [AT_SKEL_CC_IF([$1], [$2])])])
 +            [AT_SKEL_CC_IF([$1], [$2])])])
  
  m4_pushdef([AT_YYSTYPE],
  [AT_SKEL_CC_IF([AT_NAME_PREFIX[::parser::semantic_type]],
@@@ -191,15 -188,15 +191,15 @@@ AT_PURE_LEX_IF
  [m4_pushdef([AT_LOC], [(*llocp)])
   m4_pushdef([AT_VAL], [(*lvalp)])
   m4_pushdef([AT_YYLEX_FORMALS],
 -          [AT_YYSTYPE *lvalp[]AT_LOCATION_IF([, AT_YYLTYPE *llocp])])
 +            [AT_YYSTYPE *lvalp[]AT_LOCATION_IF([, AT_YYLTYPE *llocp])])
   m4_pushdef([AT_YYLEX_ARGS],
 -          [lvalp[]AT_LOCATION_IF([, llocp])])
 +            [lvalp[]AT_LOCATION_IF([, llocp])])
   m4_pushdef([AT_USE_LEX_ARGS],
 -          [(void) lvalp;AT_LOCATION_IF([(void) llocp])])
 +            [(void) lvalp;AT_LOCATION_IF([(void) llocp])])
   m4_pushdef([AT_YYLEX_PRE_FORMALS],
 -          [AT_YYLEX_FORMALS, ])
 +            [AT_YYLEX_FORMALS, ])
   m4_pushdef([AT_YYLEX_PRE_ARGS],
 -          [AT_YYLEX_ARGS, ])
 +            [AT_YYLEX_ARGS, ])
  ],
  [m4_pushdef([AT_LOC], [[(]AT_NAME_PREFIX[lloc)]])
   m4_pushdef([AT_VAL], [[(]AT_NAME_PREFIX[lval)]])
@@@ -218,8 -215,6 +218,8 @@@ AT_SKEL_CC_IF
      [AT_LOC_PUSHDEF([begin.line], [begin.column], [end.line], [end.column])])],
    [AT_LOC_PUSHDEF([first_line], [first_column], [last_line], [last_column])])
  
 +
 +AT_GLR_IF([AT_KEYWORDS([glr])])
  ])# _AT_BISON_OPTION_PUSHDEFS
  
  
@@@ -394,11 -389,13 +394,11 @@@ stati
  }]],
  [c++], [[/* A C++ error reporting function.  */
  void
 -]AT_NAME_PREFIX[::parser::error (const location_type& l, const std::string& m)
 -{
 -  (void) l;
 -  std::cerr << ]AT_LOCATION_IF([l << ": " << ])[m << std::endl;
 +]AT_NAME_PREFIX[::parser::error (]AT_LOCATION_IF([[const location_type& l, ]])[const std::string& m)
 +{  std::cerr << ]AT_LOCATION_IF([l << ": " << ])[m << std::endl;
  }]],
  [java], [AT_LOCATION_IF([[public void yyerror (Calc.Location l, String s)
 -  {
 +{
      if (l == null)
        System.err.println (s);
      else
@@@ -465,59 -462,63 +465,63 @@@ m4_define([AT_BISON_CHECK_WARNINGS]
        [m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])])
  
  m4_define([AT_BISON_CHECK_WARNINGS_],
- [[# Defining POSIXLY_CORRECT causes bison to complain if options
-         # are added after the grammar file name, so skip these checks
-         # in that case.
-         if test -z "${POSIXLY_CORRECT+set}"; then
+ [[# Defining POSIXLY_CORRECT causes bison to complain if options are
+ # added after the grammar file name, so skip these checks in that
+ # case.
+ #
+ # Don't just check if $POSIXLY_CORRECT is set, as Bash, when launched
+ # as /bin/sh, sets the shell variable POSIXLY_CORRECT to y, but not
+ # the environment variable.
+ if env | grep '^POSIXLY_CORRECT=' >/dev/null; then :; else
 -  ]AT_SAVE_SPECIAL_FILES[
 +          ]AT_SAVE_SPECIAL_FILES[
  
 -  # To avoid expanding it repeatedly, store specified stdout.
 -  ]AT_DATA([expout], [$3])[
 +          # To avoid expanding it repeatedly, store specified stdout.
 +          ]AT_DATA([expout], [$3])[
  
 -  # Run with -Werror.
 +          # Run with -Werror.
    ]AT_BISON_CHECK_([$1[ -Werror]], [[1]], [expout], [stderr])[
  
 -  # Build expected stderr up to and including the "warnings being
 -  # treated as errors" message.
 -  ]AT_DATA([[at-bison-check-warnings]], [$4])[
 -  at_bison_check_first=`sed -n \
 -    '/: warning: /{=;q;}' at-bison-check-warnings`
 -  : ${at_bison_check_first:=1}
 -  at_bison_check_first_tmp=`sed -n \
 -    '/conflicts: [0-9].*reduce$/{=;q;}' at-bison-check-warnings`
 -  : ${at_bison_check_first_tmp:=1}
 -  if test $at_bison_check_first_tmp -lt $at_bison_check_first; then
 -    at_bison_check_first=$at_bison_check_first_tmp
 -  fi
 -  if test $at_bison_check_first -gt 1; then
 -    sed -n "1,`expr $at_bison_check_first - 1`"p \
 -      at-bison-check-warnings > experr
 -  fi
 -  echo ']AT_BISON_WERROR_MSG[' >> experr
 -
 -  # Finish building expected stderr and check.  Unlike warnings,
 -  # complaints cause bison to exit early.  Thus, with -Werror, bison
 -  # does not necessarily report all warnings that it does without
 -  # -Werror, but it at least reports one.
 -  at_bison_check_last=`sed -n '$=' stderr`
 -  : ${at_bison_check_last:=1}
 -  at_bison_check_last=`expr $at_bison_check_last - 1`
 -  sed -n "$at_bison_check_first,$at_bison_check_last"p \
 -    at-bison-check-warnings >> experr
 -  ]AT_CHECK([[sed 's,.*/\(]AT_BISON_WERROR_MSG[\)$,\1,' \
 -              stderr 1>&2]], [[0]], [[]], [experr])[
 -
 -  # Now check --warnings=error.
 -  cp stderr experr
 +          # Build expected stderr up to and including the "warnings being
 +          # treated as errors" message.
 +          ]AT_DATA([[at-bison-check-warnings]], [$4])[
 +          at_bison_check_first=`sed -n \
 +            '/: warning: /{=;q;}' at-bison-check-warnings`
 +          : ${at_bison_check_first:=1}
 +          at_bison_check_first_tmp=`sed -n \
 +            '/conflicts: [0-9].*reduce$/{=;q;}' at-bison-check-warnings`
 +          : ${at_bison_check_first_tmp:=1}
 +          if test $at_bison_check_first_tmp -lt $at_bison_check_first; then
 +            at_bison_check_first=$at_bison_check_first_tmp
 +          fi
 +          if test $at_bison_check_first -gt 1; then
 +            sed -n "1,`expr $at_bison_check_first - 1`"p \
 +              at-bison-check-warnings > experr
 +          fi
 +          echo ']AT_BISON_WERROR_MSG[' >> experr
 +
 +          # Finish building expected stderr and check.  Unlike warnings,
 +          # complaints cause bison to exit early.  Thus, with -Werror, bison
 +          # does not necessarily report all warnings that it does without
 +          # -Werror, but it at least reports one.
 +          at_bison_check_last=`sed -n '$=' stderr`
 +          : ${at_bison_check_last:=1}
 +          at_bison_check_last=`expr $at_bison_check_last - 1`
 +          sed -n "$at_bison_check_first,$at_bison_check_last"p \
 +            at-bison-check-warnings >> experr
 +          ]AT_CHECK([[sed 's,.*/\(]AT_BISON_WERROR_MSG[\)$,\1,' \
 +                      stderr 1>&2]], [[0]], [[]], [experr])[
 +
 +          # Now check --warnings=error.
 +          cp stderr experr
    ]AT_BISON_CHECK_([$1[ --warnings=error]], [[1]], [expout], [experr])[
  
 -  # Now check -Wnone and --warnings=none by making sure that
 -  # -Werror doesn't change the exit status when -Wnone or
 -  # --warnings=none is specified.
 +          # Now check -Wnone and --warnings=none by making sure that
 +          # -Werror doesn't change the exit status when -Wnone or
 +          # --warnings=none is specified.
    ]AT_BISON_CHECK_([$1[ -Wnone -Werror]], [[0]], [expout])[
    ]AT_BISON_CHECK_([$1[ --warnings=none -Werror]], [[0]], [expout])[
  
 -  ]AT_RESTORE_SPECIAL_FILES[
 +          ]AT_RESTORE_SPECIAL_FILES[
  fi]dnl
  ])
  
@@@ -547,10 -548,10 +551,10 @@@ m4_define([AT_BISON_CHECK_XML]
    # Don't combine these Bison invocations since we want to be sure that
    # --report=all isn't required to get the full XML file.
    AT_BISON_CHECK_([[--report=all --report-file=xml-tests/test.output \
 -                  --graph=xml-tests/test.dot ]]AT_BISON_ARGS,
 -                  [[0]], [ignore], [ignore])
 +             --graph=xml-tests/test.dot ]]AT_BISON_ARGS,
 +           [[0]], [ignore], [ignore])
    AT_BISON_CHECK_([[--xml=xml-tests/test.xml ]]AT_BISON_ARGS,
 -                 [[0]], [ignore], [ignore])
 +           [[0]], [ignore], [ignore])
    m4_popdef([AT_BISON_ARGS])dnl
    [cp xml-tests/test.output expout]
    AT_CHECK([[$XSLTPROC \
@@@ -599,7 -600,7 +603,7 @@@ m4_define([AT_COMPILE]
                    [-o $1],
                    [m4_default([$2], [m4_bpatsubst([$1], [\.o$]).c])],
                    [m4_bmatch([$1], [[.]], [], [$LIBS])]),
 -         0, [ignore], [ignore])])
 +           0, [ignore], [ignore])])
  
  # AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.cc])
  # ---------------------------------------------
@@@ -618,7 -619,7 +622,7 @@@ AT_CHECK(m4_join([ ]
                   [-o $1],
                   [m4_default([$2], [m4_bpatsubst([$1], [\.o$]).cc])],
                   [m4_bmatch([$1], [[.]], [], [$LIBS])]),
 -       0, [ignore], [ignore])])
 +         0, [ignore], [ignore])])
  
  # AT_JAVA_COMPILE(SOURCES)
  # ------------------------
@@@ -658,23 -659,23 +662,23 @@@ m4_define([AT_FULL_COMPILE]
  [java],
    [AT_BISON_CHECK([-o $1.java $1.y])
     AT_LANG_COMPILE([$1],
 -                   m4_join([ ],
 -                           [$1.java],
 -                           m4_ifval($2, [[$1-$2.java]]),
 +                    m4_join([ ],
 +                            [$1.java],
 +                            m4_ifval($2, [[$1-$2.java]]),
                             m4_ifval($3, [[$1-$3.java]])))],
  [c++],
    [AT_BISON_CHECK([-o $1.cc $1.y])
     AT_LANG_COMPILE([$1],
 -                   m4_join([ ],
 -                           [$1.cc],
 -                           m4_ifval($2, [[$1-$2.cc]]),
 +                     m4_join([ ],
 +                             [$1.cc],
 +                             m4_ifval($2, [[$1-$2.cc]]),
                             m4_ifval($3, [[$1-$3.cc]])))],
  [c],
    [AT_BISON_CHECK([-o $1.c $1.y])
     AT_LANG_COMPILE([$1],
 -                   m4_join([ ],
 -                           [$1.c],
 -                           m4_ifval($2, [[$1-$2.c]]),
 +                  m4_join([ ],
 +                          [$1.c],
 +                          m4_ifval($2, [[$1-$2.c]]),
                             m4_ifval($3, [[$1-$3.c]])))])
  ])
  
diff --combined tests/output.at
index d3e3e6e881de222d9e79a812a60a2dac7854b50a,37d2c3da6bf5acb63989761c775703587bb3ebd8..81710245e6b7bfb66679a6e3b8730689c4226315
@@@ -22,91 -22,85 +22,91 @@@ AT_BANNER([[Output file names.]]
  #                 [ADDITIONAL-TESTS], [PRE-TESTS])
  # -----------------------------------------------------------------------------
  m4_define([AT_CHECK_OUTPUT],
 -[AT_SETUP([[Output files: $2 $3 $5]])
 -$7
 -for file in $1 $4; do
 -  case "$file" in
 -    */*) mkdir -p `echo "$file" | sed 's,/.*,,'`;;
 +[AT_SETUP([[Output files: ]$2 $3 $5])[
 +]$7[
 +for file in ]$1 $4[; do
 +  case $file in
 +    */*) mkdir -p `echo "$file" | sed 's,/[^/]*,,'`;;
    esac
  done
 -AT_DATA([$1],
 -[[$2
 +]AT_DATA([$1],
 +[$2[
  %%
  foo: {};
 +]])[
 +
 +]AT_BISON_CHECK([$3 $1 $5], 0)[
 +# Ignore the files non-generated files
 +]AT_CHECK([find . -type f -and -not -path './$1' -and -not -path './testsuite.log' |
 +           sed 's,\./,,' |
 +           sort |
 +           xargs echo],
 +          [], [$4
 +])[
 +]$6[
 +]AT_CLEANUP[
  ]])
  
 -AT_BISON_CHECK([$3 $1 $5], 0)
 -AT_CHECK([ls $4], [], [ignore])
 -$6
 -AT_CLEANUP
 -])
 -
  AT_CHECK_OUTPUT([foo.y], [], [-dv],
 -              [foo.output foo.tab.c foo.tab.h])
 +                [foo.output foo.tab.c foo.tab.h])
  
  # Some versions of Valgrind (at least valgrind-3.6.0.SVN-Debian) report
  # "fgrep: write error: Bad file descriptor" when stdout is closed, so we
  # skip this test group during maintainer-check-valgrind.
  AT_CHECK_OUTPUT([foo.y], [], [-dv],
 -              [foo.output foo.tab.c foo.tab.h],
 -              [>&-], [],
 -              [AT_CHECK([[case "$PREBISON" in *valgrind*) exit 77;; esac]])])
 +                [foo.output foo.tab.c foo.tab.h],
 +                [>&-], [],
 +                [AT_CHECK([[case "$PREBISON" in *valgrind*) exit 77;; esac]])])
  
  AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c],
 -              [foo.c foo.h foo.output])
 +                [foo.c foo.h foo.output])
  AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.tab.c],
 -              [foo.output foo.tab.c foo.tab.h])
 +                [foo.output foo.tab.c foo.tab.h])
  AT_CHECK_OUTPUT([foo.y], [], [-dv -y],
 -              [y.output y.tab.c y.tab.h])
 +                [y.output y.tab.c y.tab.h])
  AT_CHECK_OUTPUT([foo.y], [], [-dv -b bar],
 -              [bar.output bar.tab.c bar.tab.h])
 +                [bar.output bar.tab.c bar.tab.h])
  AT_CHECK_OUTPUT([foo.y], [], [-dv -g -o foo.c],
 -              [foo.c foo.dot foo.h foo.output])
 +                [foo.c foo.dot foo.h foo.output])
  
  
  AT_CHECK_OUTPUT([foo.y], [%defines %verbose],      [],
 -              [foo.output foo.tab.c foo.tab.h])
 +                [foo.output foo.tab.c foo.tab.h])
  AT_CHECK_OUTPUT([foo.y], [%defines %verbose %yacc],[],
 -              [y.output y.tab.c y.tab.h])
 +                [y.output y.tab.c y.tab.h])
  
  AT_CHECK_OUTPUT([foo.yy], [%defines %verbose %yacc],[],
 -              [y.output y.tab.c y.tab.h])
 +                [y.output y.tab.c y.tab.h])
  
  # Exercise %output and %file-prefix including deprecated '='
  AT_CHECK_OUTPUT([foo.y], [%file-prefix "bar" %defines %verbose],      [],
 -              [bar.output bar.tab.c bar.tab.h])
 -AT_CHECK_OUTPUT([foo.y], [%output="bar.c" %defines %verbose %yacc],[],
 -              [bar.output bar.c bar.h])
 +                [bar.output bar.tab.c bar.tab.h])
 +AT_CHECK_OUTPUT([foo.y], [%output "bar.c" %defines %verbose %yacc],[],
 +                [bar.c bar.h bar.output])
  AT_CHECK_OUTPUT([foo.y],
 -              [%file-prefix="baz" %output "bar.c" %defines %verbose %yacc],
 -              [],
 -              [bar.output bar.c bar.h])
 +                [%file-prefix "baz" %output "bar.c" %defines %verbose %yacc],
 +                [],
 +                [bar.c bar.h bar.output])
  
  
  # Check priorities of extension control.
  AT_CHECK_OUTPUT([foo.yy], [%defines %verbose], [],
 -              [foo.output foo.tab.cc foo.tab.hh])
 +                [foo.output foo.tab.cc foo.tab.hh])
  
  AT_CHECK_OUTPUT([foo.yy], [%defines %verbose ], [-o foo.c],
 -              [foo.c foo.h foo.output])
 +                [foo.c foo.h foo.output])
  
  AT_CHECK_OUTPUT([foo.yy], [],
 -              [--defines=foo.hpp -o foo.c++],
 -              [foo.c++ foo.hpp])
 +                [--defines=foo.hpp -o foo.c++],
 +                [foo.c++ foo.hpp])
  
  AT_CHECK_OUTPUT([foo.yy], [%defines "foo.hpp"],
 -              [-o foo.c++],
 -              [foo.c++ foo.hpp])
 +                [-o foo.c++],
 +                [foo.c++ foo.hpp])
  
  AT_CHECK_OUTPUT([foo.yy], [],
 -              [-o foo.c++ --graph=foo.gph],
 -              [foo.c++ foo.gph])
 +                [-o foo.c++ --graph=foo.gph],
 +                [foo.c++ foo.gph])
  
  
  ## ------------ ##
@@@ -119,36 -113,22 +119,36 @@@ AT_CHECK([grep 'include .subdir/' $1.cc
  AT_CHECK([grep 'include .subdir/' $1.hh], 1, [])
  ])
  
 +AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose], [],
 +                [foo.output foo.tab.cc])
 +
  AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
 -              [foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh])
 +                [foo.output foo.tab.cc foo.tab.hh stack.hh])
 +
 +AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose %locations], [],
 +                [foo.output foo.tab.cc])
 +
 +AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations], [],
 +                [foo.output foo.tab.cc foo.tab.hh location.hh position.hh stack.hh])
  
  AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [],
 -              [foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh],
 -              [], [AT_CHECK_NO_SUBDIR_PART([foo.tab])])
 +                [foo.output foo.tab.cc foo.tab.hh stack.hh],
 +                [], [AT_CHECK_NO_SUBDIR_PART([foo.tab])])
  
 -AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose],
 -              [-o subdir/foo.cc],
 -              [subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/stack.hh subdir/position.hh],
 -              [], [AT_CHECK_NO_SUBDIR_PART([subdir/foo])])
 +AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations],
 +                [-o subdir/foo.cc],
 +                [subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/position.hh subdir/stack.hh],
 +                [], [AT_CHECK_NO_SUBDIR_PART([subdir/foo])])
  
  AT_CHECK_OUTPUT([gram_dir/foo.yy],
                  [%skeleton "lalr1.cc" %defines %verbose %file-prefix "output_dir/foo"],
                  [],
 -              [output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/foo.output output_dir/location.hh output_dir/stack.hh output_dir/position.hh])
 +                [output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/stack.hh])
 +
 +AT_CHECK_OUTPUT([gram_dir/foo.yy],
 +                [%skeleton "lalr1.cc" %defines %locations %verbose %file-prefix "output_dir/foo"],
 +                [],
 +                [output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/location.hh output_dir/position.hh output_dir/stack.hh])
  
  
  # AT_CHECK_CONFLICTING_OUTPUT(INPUT-FILE, DIRECTIVES, FLAGS, STDERR,
@@@ -177,22 -157,22 +177,22 @@@ AT_CLEANU
  
  AT_CHECK_CONFLICTING_OUTPUT([foo.y],
  [], [--graph="foo.tab.c"],
 -[foo.y: warning: conflicting outputs to file 'foo.tab.c'
 -])
 +[[foo.y: warning: conflicting outputs to file 'foo.tab.c' [-Wother]
 +]])
  
  AT_CHECK_CONFLICTING_OUTPUT([foo.y],
  [%defines "foo.output"], [-v],
 -[foo.y: warning: conflicting outputs to file 'foo.output'
 -])
 +[[foo.y: warning: conflicting outputs to file 'foo.output' [-Wother]
 +]])
  
  AT_CHECK_CONFLICTING_OUTPUT([foo.y],
 -[%skeleton "lalr1.cc" %defines], [--graph="location.hh"],
 -[foo.y: warning: conflicting outputs to file 'location.hh'
 -])
 +[%skeleton "lalr1.cc" %defines %locations], [--graph="location.hh"],
 +[[foo.y: warning: conflicting outputs to file 'location.hh' [-Wother]
 +]])
  
  AT_CHECK_CONFLICTING_OUTPUT([foo.y], [], [-o foo.y],
 -[foo.y: error: refusing to overwrite the input file 'foo.y'
 -], 1)
 +[[foo.y: error: refusing to overwrite the input file 'foo.y'
 +]], 1)
  
  
  # AT_CHECK_OUTPUT_FILE_NAME(FILE-NAME-PREFIX, [ADDITIONAL-TESTS])
@@@ -251,3 -231,368 +251,368 @@@ AT_CHECK_OUTPUT_FILE_NAME([[@{]]
  AT_CHECK_OUTPUT_FILE_NAME([[@}]])
  AT_CHECK_OUTPUT_FILE_NAME([[@<:@]])
  AT_CHECK_OUTPUT_FILE_NAME([[@:>@]])
+ # AT_TEST(SETUP-NAME, GRAMMAR, DOT-BODY)
+ # --------------------------------------
+ # Check that the DOT graph for GRAMMAR is DOT-BODY.
+ m4_pushdef([AT_TEST],
+ [AT_SETUP([$1])
+ AT_KEYWORDS([[graph]])
+ AT_DATA([[input.y]], [$2])
+ AT_BISON_CHECK([[-rall --graph input.y]], [0], [[]], [[ignore]])
+ AT_CHECK([[grep -v // input.dot]], [0],
+ [[
+ digraph "input.y"
+ {
+   node [fontname = courier, shape = box, colorscheme = paired6]
+   edge [fontname = courier]
+   ]$3[}
+ ]])
+ AT_CLEANUP
+ ])
+ ## ------------------------ ##
+ ## Graph with no conflicts. ##
+ ## ------------------------ ##
+ AT_TEST([Graph with no conflicts],
+ [[%%
+ exp: a '?' b;
+ a: ;
+ b: 'b';
+ ]],
+ [[
+   0 [label="State 0\n  0 $accept: . exp $end\l  1 exp: . a '?' b\l  2 a: .\l"]
+   0 -> "0R2e" [style = solid]
+  "0R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"]
+   0 -> 1 [style=dashed label="exp"]
+   0 -> 2 [style=dashed label="a"]
+   1 [label="State 1\n  0 $accept: exp . $end\l"]
+   1 -> 3 [style=solid label="$end"]
+   2 [label="State 2\n  1 exp: a . '?' b\l"]
+   2 -> 4 [style=solid label="'?'"]
+   3 [label="State 3\n  0 $accept: exp $end .\l"]
+   3 -> "3R0e" [style = solid]
+  "3R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"]
+   4 [label="State 4\n  1 exp: a '?' . b\l  3 b: . 'b'\l"]
+   4 -> 5 [style=solid label="'b'"]
+   4 -> 6 [style=dashed label="b"]
+   5 [label="State 5\n  3 b: 'b' .\l"]
+   5 -> "5R3e" [style = solid]
+  "5R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"]
+   6 [label="State 6\n  1 exp: a '?' b .\l"]
+   6 -> "6R1e" [style = solid]
+  "6R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"]
+ ]])
+ ## ------------------------ ##
+ ## Graph with unsolved S/R. ##
+ ## ------------------------ ##
+ AT_TEST([Graph with unsolved S/R],
+ [[%%
+ start:
+     'a'
+   | empty_a 'a'
+   | 'b'
+   | empty_b 'b'
+   | 'c'
+   | empty_c 'c'
+   ;
+ empty_a: %prec 'a';
+ empty_b: %prec 'b';
+ empty_c: %prec 'c';
+ ]],
+ [[
+   0 [label="State 0\n  0 $accept: . start $end\l  1 start: . 'a'\l  2      | . empty_a 'a'\l  3      | . 'b'\l  4      | . empty_b 'b'\l  5      | . 'c'\l  6      | . empty_c 'c'\l  7 empty_a: .  ['a']\l  8 empty_b: .  ['b']\l  9 empty_c: .  ['c']\l"]
+   0 -> "0R7d" [label = "['a']" style = solid]
+  "0R7d" [style = filled, shape = diamond, fillcolor = 5, label = "R7"]
+   0 -> "0R8d" [label = "['b']" style = solid]
+  "0R8d" [style = filled, shape = diamond, fillcolor = 5, label = "R8"]
+   0 -> "0R9d" [label = "['c']" style = solid]
+  "0R9d" [style = filled, shape = diamond, fillcolor = 5, label = "R9"]
+   0 -> 1 [style=solid label="'a'"]
+   0 -> 2 [style=solid label="'b'"]
+   0 -> 3 [style=solid label="'c'"]
+   0 -> 4 [style=dashed label="start"]
+   0 -> 5 [style=dashed label="empty_a"]
+   0 -> 6 [style=dashed label="empty_b"]
+   0 -> 7 [style=dashed label="empty_c"]
+   1 [label="State 1\n  1 start: 'a' .\l"]
+   1 -> "1R1e" [style = solid]
+  "1R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"]
+   2 [label="State 2\n  3 start: 'b' .\l"]
+   2 -> "2R3e" [style = solid]
+  "2R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"]
+   3 [label="State 3\n  5 start: 'c' .\l"]
+   3 -> "3R5e" [style = solid]
+  "3R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"]
+   4 [label="State 4\n  0 $accept: start . $end\l"]
+   4 -> 8 [style=solid label="$end"]
+   5 [label="State 5\n  2 start: empty_a . 'a'\l"]
+   5 -> 9 [style=solid label="'a'"]
+   6 [label="State 6\n  4 start: empty_b . 'b'\l"]
+   6 -> 10 [style=solid label="'b'"]
+   7 [label="State 7\n  6 start: empty_c . 'c'\l"]
+   7 -> 11 [style=solid label="'c'"]
+   8 [label="State 8\n  0 $accept: start $end .\l"]
+   8 -> "8R0e" [style = solid]
+  "8R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"]
+   9 [label="State 9\n  2 start: empty_a 'a' .\l"]
+   9 -> "9R2e" [style = solid]
+  "9R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"]
+   10 [label="State 10\n  4 start: empty_b 'b' .\l"]
+   10 -> "10R4e" [style = solid]
+  "10R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"]
+   11 [label="State 11\n  6 start: empty_c 'c' .\l"]
+   11 -> "11R6e" [style = solid]
+  "11R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"]
+ ]])
+ ## ---------------------- ##
+ ## Graph with solved S/R. ##
+ ## ---------------------- ##
+ AT_TEST([Graph with solved S/R],
+ [[%left 'a'
+ %right 'b'
+ %right 'c'
+ %%
+ start:
+     'a'
+   | empty_a 'a'
+   | 'b'
+   | empty_b 'b'
+   | 'c'
+   | empty_c 'c'
+   ;
+ empty_a: %prec 'a';
+ empty_b: %prec 'b';
+ empty_c: %prec 'c';
+ ]],
+ [[
+   0 [label="State 0\n  0 $accept: . start $end\l  1 start: . 'a'\l  2      | . empty_a 'a'\l  3      | . 'b'\l  4      | . empty_b 'b'\l  5      | . 'c'\l  6      | . empty_c 'c'\l  7 empty_a: .  ['a']\l  8 empty_b: .  []\l  9 empty_c: .  []\l"]
+   0 -> "0R7e" [style = solid]
+  "0R7e" [style = filled, shape = diamond, fillcolor = 3, label = "R7"]
+   0 -> 1 [style=solid label="'b'"]
+   0 -> 2 [style=solid label="'c'"]
+   0 -> 3 [style=dashed label="start"]
+   0 -> 4 [style=dashed label="empty_a"]
+   0 -> 5 [style=dashed label="empty_b"]
+   0 -> 6 [style=dashed label="empty_c"]
+   1 [label="State 1\n  3 start: 'b' .\l"]
+   1 -> "1R3e" [style = solid]
+  "1R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"]
+   2 [label="State 2\n  5 start: 'c' .\l"]
+   2 -> "2R5e" [style = solid]
+  "2R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"]
+   3 [label="State 3\n  0 $accept: start . $end\l"]
+   3 -> 7 [style=solid label="$end"]
+   4 [label="State 4\n  2 start: empty_a . 'a'\l"]
+   4 -> 8 [style=solid label="'a'"]
+   5 [label="State 5\n  4 start: empty_b . 'b'\l"]
+   5 -> 9 [style=solid label="'b'"]
+   6 [label="State 6\n  6 start: empty_c . 'c'\l"]
+   6 -> 10 [style=solid label="'c'"]
+   7 [label="State 7\n  0 $accept: start $end .\l"]
+   7 -> "7R0e" [style = solid]
+  "7R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"]
+   8 [label="State 8\n  2 start: empty_a 'a' .\l"]
+   8 -> "8R2e" [style = solid]
+  "8R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"]
+   9 [label="State 9\n  4 start: empty_b 'b' .\l"]
+   9 -> "9R4e" [style = solid]
+  "9R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"]
+   10 [label="State 10\n  6 start: empty_c 'c' .\l"]
+   10 -> "10R6e" [style = solid]
+  "10R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"]
+ ]])
+ ## ---------------- ##
+ ## Graph with  R/R. ##
+ ## ---------------- ##
+ AT_TEST([Graph with R/R],
+ [[%%
+ exp: a | b;
+ a: ;
+ b: ;
+ ]],
+ [[
+   0 [label="State 0\n  0 $accept: . exp $end\l  1 exp: . a\l  2    | . b\l  3 a: .  [$end]\l  4 b: .  [$end]\l"]
+   0 -> "0R3e" [style = solid]
+  "0R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"]
+   0 -> "0R4d" [label = "[$end]" style = solid]
+  "0R4d" [style = filled, shape = diamond, fillcolor = 5, label = "R4"]
+   0 -> 1 [style=dashed label="exp"]
+   0 -> 2 [style=dashed label="a"]
+   0 -> 3 [style=dashed label="b"]
+   1 [label="State 1\n  0 $accept: exp . $end\l"]
+   1 -> 4 [style=solid label="$end"]
+   2 [label="State 2\n  1 exp: a .\l"]
+   2 -> "2R1e" [style = solid]
+  "2R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"]
+   3 [label="State 3\n  2 exp: b .\l"]
+   3 -> "3R2e" [style = solid]
+  "3R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"]
+   4 [label="State 4\n  0 $accept: exp $end .\l"]
+   4 -> "4R0e" [style = solid]
+  "4R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"]
+ ]])
+ ## ---------------------------------------- ##
+ ## Graph with reductions with multiple LAT. ##
+ ## ---------------------------------------- ##
+ AT_TEST([Graph with reductions with multiple LAT],
+ [[%%
+ exp: a ';' | a ';' | a '.' | b '?' | b '!' | c '?' | c ';';
+ a: ;
+ b: ;
+ c: ;
+ ]],
+ [[
+   0 [label="State 0\n  0 $accept: . exp $end\l  1 exp: . a ';'\l  2    | . a ';'\l  3    | . a '.'\l  4    | . b '?'\l  5    | . b '!'\l  6    | . c '?'\l  7    | . c ';'\l  8 a: .  [';', '.']\l  9 b: .  ['?', '!']\l 10 c: .  [';', '?']\l"]
+   0 -> "0R8e" [style = solid]
+  "0R8e" [style = filled, shape = diamond, fillcolor = 3, label = "R8"]
+   0 -> "0R9e" [label = "['?', '!']" style = solid]
+  "0R9e" [style = filled, shape = diamond, fillcolor = 3, label = "R9"]
+   0 -> "0R10d" [label = "[';', '?']" style = solid]
+  "0R10d" [style = filled, shape = diamond, fillcolor = 5, label = "R10"]
+   0 -> 1 [style=dashed label="exp"]
+   0 -> 2 [style=dashed label="a"]
+   0 -> 3 [style=dashed label="b"]
+   0 -> 4 [style=dashed label="c"]
+   1 [label="State 1\n  0 $accept: exp . $end\l"]
+   1 -> 5 [style=solid label="$end"]
+   2 [label="State 2\n  1 exp: a . ';'\l  2    | a . ';'\l  3    | a . '.'\l"]
+   2 -> 6 [style=solid label="';'"]
+   2 -> 7 [style=solid label="'.'"]
+   3 [label="State 3\n  4 exp: b . '?'\l  5    | b . '!'\l"]
+   3 -> 8 [style=solid label="'?'"]
+   3 -> 9 [style=solid label="'!'"]
+   4 [label="State 4\n  6 exp: c . '?'\l  7    | c . ';'\l"]
+   4 -> 10 [style=solid label="';'"]
+   4 -> 11 [style=solid label="'?'"]
+   5 [label="State 5\n  0 $accept: exp $end .\l"]
+   5 -> "5R0e" [style = solid]
+  "5R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"]
+   6 [label="State 6\n  1 exp: a ';' .  [$end]\l  2    | a ';' .  [$end]\l"]
+   6 -> "6R1e" [style = solid]
+  "6R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"]
+   6 -> "6R2d" [label = "[$end]" style = solid]
+  "6R2d" [style = filled, shape = diamond, fillcolor = 5, label = "R2"]
+   7 [label="State 7\n  3 exp: a '.' .\l"]
+   7 -> "7R3e" [style = solid]
+  "7R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"]
+   8 [label="State 8\n  4 exp: b '?' .\l"]
+   8 -> "8R4e" [style = solid]
+  "8R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"]
+   9 [label="State 9\n  5 exp: b '!' .\l"]
+   9 -> "9R5e" [style = solid]
+  "9R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"]
+   10 [label="State 10\n  7 exp: c ';' .\l"]
+   10 -> "10R7e" [style = solid]
+  "10R7e" [style = filled, shape = diamond, fillcolor = 3, label = "R7"]
+   11 [label="State 11\n  6 exp: c '?' .\l"]
+   11 -> "11R6e" [style = solid]
+  "11R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"]
+ ]])
+ ## ------------------------------------------------------ ##
+ ## Graph with a reduction rule both enabled and disabled. ##
+ ## ------------------------------------------------------ ##
+ AT_TEST([Graph with a reduction rule both enabled and disabled],
+ [[%%
+ exp: ifexp | opexp | imm;
+ ifexp: "if" exp "then" exp elseexp;
+ elseexp: "else" exp | ;
+ opexp: exp '+' exp;
+ imm: '0';
+ ]],
+ [[
+   0 [label="State 0\n  0 $accept: . exp $end\l  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+   0 -> 1 [style=solid label="\"if\""]
+   0 -> 2 [style=solid label="'0'"]
+   0 -> 3 [style=dashed label="exp"]
+   0 -> 4 [style=dashed label="ifexp"]
+   0 -> 5 [style=dashed label="opexp"]
+   0 -> 6 [style=dashed label="imm"]
+   1 [label="State 1\n  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  4      | \"if\" . exp \"then\" exp elseexp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+   1 -> 1 [style=solid label="\"if\""]
+   1 -> 2 [style=solid label="'0'"]
+   1 -> 7 [style=dashed label="exp"]
+   1 -> 4 [style=dashed label="ifexp"]
+   1 -> 5 [style=dashed label="opexp"]
+   1 -> 6 [style=dashed label="imm"]
+   2 [label="State 2\n  8 imm: '0' .\l"]
+   2 -> "2R8e" [style = solid]
+  "2R8e" [style = filled, shape = diamond, fillcolor = 3, label = "R8"]
+   3 [label="State 3\n  0 $accept: exp . $end\l  7 opexp: exp . '+' exp\l"]
+   3 -> 8 [style=solid label="$end"]
+   3 -> 9 [style=solid label="'+'"]
+   4 [label="State 4\n  1 exp: ifexp .\l"]
+   4 -> "4R1e" [style = solid]
+  "4R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"]
+   5 [label="State 5\n  2 exp: opexp .\l"]
+   5 -> "5R2e" [style = solid]
+  "5R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"]
+   6 [label="State 6\n  3 exp: imm .\l"]
+   6 -> "6R3e" [style = solid]
+  "6R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"]
+   7 [label="State 7\n  4 ifexp: \"if\" exp . \"then\" exp elseexp\l  7 opexp: exp . '+' exp\l"]
+   7 -> 10 [style=solid label="\"then\""]
+   7 -> 9 [style=solid label="'+'"]
+   8 [label="State 8\n  0 $accept: exp $end .\l"]
+   8 -> "8R0e" [style = solid]
+  "8R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"]
+   9 [label="State 9\n  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  7 opexp: . exp '+' exp\l  7      | exp '+' . exp\l  8 imm: . '0'\l"]
+   9 -> 1 [style=solid label="\"if\""]
+   9 -> 2 [style=solid label="'0'"]
+   9 -> 11 [style=dashed label="exp"]
+   9 -> 4 [style=dashed label="ifexp"]
+   9 -> 5 [style=dashed label="opexp"]
+   9 -> 6 [style=dashed label="imm"]
+   10 [label="State 10\n  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  4      | \"if\" exp \"then\" . exp elseexp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+   10 -> 1 [style=solid label="\"if\""]
+   10 -> 2 [style=solid label="'0'"]
+   10 -> 12 [style=dashed label="exp"]
+   10 -> 4 [style=dashed label="ifexp"]
+   10 -> 5 [style=dashed label="opexp"]
+   10 -> 6 [style=dashed label="imm"]
+   11 [label="State 11\n  7 opexp: exp . '+' exp\l  7      | exp '+' exp .  [$end, \"then\", \"else\", '+']\l"]
+   11 -> "11R7e" [style = solid]
+  "11R7e" [style = filled, shape = diamond, fillcolor = 3, label = "R7"]
+   11 -> "11R7d" [label = "['+']" style = solid]
+  "11R7d" [style = filled, shape = diamond, fillcolor = 5, label = "R7"]
+   11 -> 9 [style=solid label="'+'"]
+   12 [label="State 12\n  4 ifexp: \"if\" exp \"then\" exp . elseexp\l  5 elseexp: . \"else\" exp\l  6        | .  [$end, \"then\", \"else\", '+']\l  7 opexp: exp . '+' exp\l"]
+   12 -> "12R6e" [style = solid]
+  "12R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"]
+   12 -> "12R6d" [label = "[\"else\", '+']" style = solid]
+  "12R6d" [style = filled, shape = diamond, fillcolor = 5, label = "R6"]
+   12 -> 13 [style=solid label="\"else\""]
+   12 -> 9 [style=solid label="'+'"]
+   12 -> 14 [style=dashed label="elseexp"]
+   13 [label="State 13\n  1 exp: . ifexp\l  2    | . opexp\l  3    | . imm\l  4 ifexp: . \"if\" exp \"then\" exp elseexp\l  5 elseexp: \"else\" . exp\l  7 opexp: . exp '+' exp\l  8 imm: . '0'\l"]
+   13 -> 1 [style=solid label="\"if\""]
+   13 -> 2 [style=solid label="'0'"]
+   13 -> 15 [style=dashed label="exp"]
+   13 -> 4 [style=dashed label="ifexp"]
+   13 -> 5 [style=dashed label="opexp"]
+   13 -> 6 [style=dashed label="imm"]
+   14 [label="State 14\n  4 ifexp: \"if\" exp \"then\" exp elseexp .\l"]
+   14 -> "14R4e" [style = solid]
+  "14R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"]
+   15 [label="State 15\n  5 elseexp: \"else\" exp .  [$end, \"then\", \"else\", '+']\l  7 opexp: exp . '+' exp\l"]
+   15 -> "15R5e" [style = solid]
+  "15R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"]
+   15 -> "15R5d" [label = "['+']" style = solid]
+  "15R5d" [style = filled, shape = diamond, fillcolor = 5, label = "R5"]
+   15 -> 9 [style=solid label="'+'"]
+ ]])
+ m4_popdef([AT_TEST])