]> git.saurik.com Git - bison.git/commitdiff
Merge remote-tracking branch 'origin/maint'
authorAkim Demaille <akim@lrde.epita.fr>
Wed, 10 Apr 2013 07:23:20 +0000 (09:23 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Wed, 10 Apr 2013 08:24:56 +0000 (10:24 +0200)
* origin/maint:
  glr.cc: fix a clang warning
  maint: update copyright years
  build: fix VPATH issue
  build: avoid clang's colored diagnostics in the test suite
  tests: please clang and use ".cc", not ".c", for C++ input
  gnulib: update
  skeletons: avoid empty switch constructs
  lalr1.cc: fix compiler warnings
  yacc.c: do not use __attribute__ unprotected
  tests: style changes

12 files changed:
1  2 
Makefile.am
NEWS
THANKS
build-aux/local.mk
data/bison.m4
data/c.m4
data/glr.c
data/glr.cc
data/lalr1.cc
data/stack.hh
data/yacc.c
tests/glr-regression.at

diff --combined Makefile.am
index 7a752d7d6be0d0df25243882f563729048d14713,798704dd3ad4df896955c92fc36e9a36af7b3f10..339a3c63ae4eb14b0fd645b2a64b0cdc51963101
@@@ -1,7 -1,7 +1,7 @@@
 -## Process this file with automake to produce Makefile.in -*-Makefile-*-
 -
 -## Copyright (C) 2001-2013 Free Software Foundation, Inc.
 +## Process this file with automake to produce Makefile.in.
  
 +# Copyright (C) 2001-2013 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
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
 +AUTOMAKE_OPTIONS = subdir-objects
  ACLOCAL_AMFLAGS = -I m4
  
 -SUBDIRS = build-aux po runtime-po lib data src doc examples tests etc
 +SUBDIRS = po runtime-po .
  
  # Files installed for use by Automake.
  aclocaldir = @aclocaldir@
  aclocal_DATA = m4/bison-i18n.m4
  
  EXTRA_DIST = .prev-version .version \
 -  cfg.mk ChangeLog-1998 ChangeLog-2012 PACKAGING \
 -  djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \
 -  djgpp/config.sed djgpp/config.site djgpp/config_h.sed \
 -  djgpp/subpipe.c djgpp/subpipe.h djgpp/djunpack.bat \
 -  djgpp/fnchange.lst djgpp/testsuite.sed
 +  cfg.mk ChangeLog-1998 ChangeLog-2012 PACKAGING
 +
 +## Running the bison from this tarball.  To generate our own parser,
 +## but also to run the tests.  Of course, you ought to keep a sane
 +## version of Bison nearby...
 +BISON = $(top_builddir)/tests/bison
 +BISON_IN = $(top_srcdir)/tests/bison.in
 +YACC = $(BISON) -o y.tab.c
 +AM_YFLAGS = -d -v -Werror -Wall -Wno-yacc --report=all
 +
 +# Initialization before completion by local.mk's.
 +AM_CFLAGS = $(WARN_CFLAGS)
 +# Find builddir/src/scan-code.c etc.
 +AM_CPPFLAGS = -I. -Ilib -I$(top_srcdir) -I$(top_srcdir)/lib
 +BUILT_SOURCES =
 +CLEANFILES =
 +DISTCLEANFILES =
 +EXTRA_DIST += $(dist_TESTS)
 +MOSTLYCLEANDIRS =
 +MOSTLYCLEANFILES =
 +SUFFIXES =
 +TESTS = $(dist_TESTS)
 +check_PROGRAMS =
 +dist_TESTS =
 +noinst_LIBRARIES =
  
 -MAINTAINER_CHECKS =                           \
 -  maintainer-check                            \
 -  maintainer-push-check                               \
 -  maintainer-xml-check                                \
 -  maintainer-release-check
 -.PHONY: $(MAINTAINER_CHECKS)
 -$(MAINTAINER_CHECKS):
 -      $(AM_V_GEN)cd tests && $(MAKE) $(AM_MAKEFLAGS) $@
 +include build-aux/local.mk
 +include data/local.mk
 +include djgpp/local.mk
 +include doc/local.mk
 +include etc/local.mk
 +include examples/local.mk
 +include lib/local.mk
 +include src/local.mk
 +include tests/local.mk
  
  # See comments in build-aux/git-version-gen.  However, we make .version depend
  # on configure so that .version and VERSION/PACKAGE_VERSION stay in sync in the
  # a developer might naively reference .version in a test case while the bison
  # executable still compiles with VERSION, and so the test case might fail or
  # pass incorrectly.
 -BUILT_SOURCES = $(top_srcdir)/.version
 +BUILT_SOURCES += $(top_srcdir)/.version
  $(top_srcdir)/.version: configure
 -      $(AM_V_GEN)echo $(VERSION) > $@-t && mv $@-t $@
 +      echo $(VERSION) > $@-t && mv $@-t $@
  dist-hook: gen-ChangeLog
 -      $(AM_V_GEN)echo $(VERSION) > $(distdir)/.tarball-version
 +      echo $(VERSION) > $(distdir)/.tarball-version
  
  .PHONY: update-b4-copyright update-package-copyright-year
  update-b4-copyright:
-       find $(srcdir)/data -type f          \
+       $(AM_V_GEN)find $(srcdir)/data -type f          \
          | xargs $(srcdir)/build-aux/$@
        @echo 'warning: src/parse-gram.[hc] may need to be regenerated.'
  update-package-copyright-year:
-       $(srcdir)/build-aux/$@ $(srcdir)/configure.ac
+       $(AM_V_GEN)$(srcdir)/build-aux/$@ $(srcdir)/configure.ac
  
  gen_start_date = 2012-01-16
  .PHONY: gen-ChangeLog
diff --combined NEWS
index 406521b9a9dfd0ca61761d156f5fa873b1c33623,42c79408e9d4b17cebc6e97beaca21fc9fb3d98b..d7d89d2a86589bb9dcb73364dcd55da9ce306a25
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -2,573 -2,14 +2,583 @@@ GNU Bison NEW
  
  * Noteworthy changes in release ?.? (????-??-??) [?]
  
 +** WARNING: Future backward-incompatibilities!
 +
 +  Like other GNU packages, Bison will start using some of the C99 features
 +  for its own code, especially the definition of variables after statements.
 +  The generated C parsers still aim at C90.
 +
 +** Backward incompatible changes
 +
 +*** Obsolete features
 +
 +  Support for YYFAIL is removed (deprecated in Bison 2.4.2): use YYERROR.
 +
 +  Support for yystype and yyltype is removed (deprecated in Bison 1.875):
 +  use YYSTYPE and YYLTYPE.
 +
 +  Support for YYLEX_PARAM and YYPARSE_PARAM is removed (deprecated in Bison
 +  1.875): use %lex-param, %parse-param, or %param.
 +
 +  Missing semicolons at the end of actions are no longer added (as announced
 +  in the release 2.5).
 +
 +*** Use of YACC='bison -y'
 +
 +  TL;DR: With Autoconf <= 2.69, pass -Wno-yacc to (AM_)YFLAGS if you use
 +  Bison extensions.
 +
 +  Traditional Yacc generates 'y.tab.c' whatever the name of the input file.
 +  Therefore Makefiles written for Yacc expect 'y.tab.c' (and possibly
 +  'y.tab.h' and 'y.outout') to be generated from 'foo.y'.
 +
 +  To this end, for ages, AC_PROG_YACC, Autoconf's macro to look for an
 +  implementation of Yacc, was using Bison as 'bison -y'.  While it does
 +  ensure compatible output file names, it also enables warnings for
 +  incompatibilities with POSIX Yacc.  In other words, 'bison -y' triggers
 +  warnings for Bison extensions.
 +
 +  Autoconf 2.70+ fixes this incompatibility by using YACC='bison -o y.tab.c'
 +  (which also generates 'y.tab.h' and 'y.output' when needed).
 +  Alternatively, disable Yacc warnings by passing '-Wno-yacc' to your Yacc
 +  flags (YFLAGS, or AM_YFLAGS with Automake).
 +
 +** Bug fixes
 +
 +*** The epilogue is no longer affected by internal #defines (glr.c)
 +
 +  The glr.c skeleton uses defines such as #define yylval (yystackp->yyval) in
 +  generated code.  These weren't properly undefined before the inclusion of
 +  the user epilogue, so functions such as the following were butchered by the
 +  preprocessor expansion:
 +
 +    int yylex (YYSTYPE *yylval);
 +
 +  This is fixed: yylval, yynerrs, yychar, and yylloc are now valid
 +  identifiers for user-provided variables.
 +
 +*** stdio.h is no longer needed when locations are enabled (yacc.c)
 +
 +  Changes in Bison 2.7 introduced a dependency on FILE and fprintf when
 +  locations are enabled.  This is fixed.
 +
 +** Diagnostics reported by Bison
 +
 +  Most of these features were contributed by Théophile Ranquet and Victor
 +  Santet.
 +
 +*** Carets
 +
 +  Version 2.7 introduced caret errors, for a prettier output.  These are now
 +  activated by default.  The old format can still be used by invoking Bison
 +  with -fno-caret (or -fnone).
 +
 +  Some error messages that reproduced excerpts of the grammar are now using
 +  the caret information only.  For instance on:
 +
 +    %%
 +    exp: 'a' | 'a';
 +
 +  Bison 2.7 reports:
 +
 +    in.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +    in.y:2.12-14: warning: rule useless in parser due to conflicts: exp: 'a' [-Wother]
 +
 +  Now bison reports:
 +
 +    in.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +    in.y:2.12-14: warning: rule useless in parser due to conflicts [-Wother]
 +     exp: 'a' | 'a';
 +                ^^^
 +
 +  and "bison -fno-caret" reports:
 +
 +    in.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +    in.y:2.12-14: warning: rule useless in parser due to conflicts [-Wother]
 +
 +*** 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
 +
 +** Incompatibilities with POSIX Yacc
 +
 +  The 'yacc' category is no longer part of '-Wall', enable it explicitly
 +  with '-Wyacc'.
 +
 +** 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}
 +
 +** 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).
 +
 +** Variable api.value.type
 +
 +  This new %define variable supersedes the #define macro YYSTYPE.  The use
 +  of YYSTYPE is discouraged.  In particular, #defining YYSTYPE *and* either
 +  using %union or %defining api.value.type results in undefined behavior.
 +
 +  Either define api.value.type, or use "%union":
 +
 +    %union
 +    {
 +      int ival;
 +      char *sval;
 +    }
 +    %token <ival> INT "integer"
 +    %token <sval> STRING "string"
 +    %printer { fprintf (yyo, "%d", $$); } <ival>
 +    %destructor { free ($$); } <sval>
 +
 +    /* In yylex().  */
 +    yylval.ival = 42; return INT;
 +    yylval.sval = "42"; return STRING;
 +
 +  The %define variable api.value.type supports several special values.  The
 +  keyword value 'union' means that the user provides genuine types, not
 +  union member names such as "ival" and "sval" above (WARNING: will fail if
 +  -y/--yacc/%yacc is enabled).
 +
 +    %define api.value.type union
 +    %token <int> INT "integer"
 +    %token <char *> STRING "string"
 +    %printer { fprintf (yyo, "%d", $$); } <int>
 +    %destructor { free ($$); } <char *>
 +
 +    /* In yylex().  */
 +    yylval.INT = 42; return INT;
 +    yylval.STRING = "42"; return STRING;
 +
 +  The keyword value variant is somewhat equivalent, but for C++ special
 +  provision is made to allow classes to be used (more about this below).
 +
 +    %define api.value.type variant
 +    %token <int> INT "integer"
 +    %token <std::string> STRING "string"
 +
 +  Values between braces denote user defined types.  This is where YYSTYPE
 +  used to be used.
 +
 +    %code requires
 +    {
 +      struct my_value
 +      {
 +        enum
 +        {
 +          is_int, is_string
 +        } kind;
 +        union
 +        {
 +          int ival;
 +          char *sval;
 +        } u;
 +      };
 +    }
 +    %define api.value.type {struct my_value}
 +    %token <u.ival> INT "integer"
 +    %token <u.sval> STRING "string"
 +    %printer { fprintf (yyo, "%d", $$); } <u.ival>
 +    %destructor { free ($$); } <u.sval>
 +
 +    /* In yylex().  */
 +    yylval.u.ival = 42; return INT;
 +    yylval.u.sval = "42"; return STRING;
 +
 +** 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".
 +
 +** 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
 +    stype                      -> api.value.type
 +
 +** Semantic predicates
 +
 +  Contributed by Paul Hilfinger.
 +
 +  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.
 +
 +** Tokens are numbered in their order of appearance
 +
 +  Contributed by Valentin Tolmer.
 +
 +  With '%token A B', A had a number less than the one of B.  However,
 +  precedence declarations used to generate a reversed order.  This is now
 +  fixed, and introducing tokens with any of %token, %left, %right,
 +  %precedence, or %nonassoc yields the same result.
 +
 +  When mixing declarations of tokens with a litteral character (e.g., 'a')
 +  or with an identifier (e.g., B) in a precedence declaration, Bison
 +  numbered the litteral characters first.  For example
 +
 +    %right A B 'c' 'd'
 +
 +  would lead to the tokens declared in this order: 'c' 'd' A B.  Again, the
 +  input order is now preserved.
 +
 +  These changes were made so that one can remove useless precedence and
 +  associativity declarations (i.e., map %nonassoc, %left or %right to
 +  %precedence, or to %token) and get exactly the same output.
 +
 +** Useless precedence and associativity
 +
 +  Contributed by Valentin Tolmer.
 +
 +  When developing and maintaining a grammar, useless associativity and
 +  precedence directives are common.  They can be a nuisance: new ambiguities
 +  arising are sometimes masked because their conflicts are resolved due to
 +  the extra precedence or associativity information.  Furthermore, it can
 +  hinder the comprehension of a new grammar: one will wonder about the role
 +  of a precedence, where in fact it is useless.  The following changes aim
 +  at detecting and reporting these extra directives.
 +
 +*** Precedence warning category
 +
 +  A new category of warning, -Wprecedence, was introduced. It flags the
 +  useless precedence and associativity directives.
 +
 +*** Useless associativity
 +
 +  Bison now warns about symbols with a declared associativity that is never
 +  used to resolve conflicts.  In that case, using %precedence is sufficient;
 +  the parsing tables will remain unchanged.  Solving these warnings may raise
 +  useless precedence warnings, as the symbols no longer have associativity.
 +  For example:
 +
 +    %left '+'
 +    %left '*'
 +    %%
 +    exp:
 +      "number"
 +    | exp '+' "number"
 +    | exp '*' exp
 +    ;
 +
 +  will produce a
 +
 +    warning: useless associativity for '+', use %precedence [-Wprecedence]
 +     %left '+'
 +           ^^^
 +
 +*** Useless precedence
 +
 +  Bison now warns about symbols with a declared precedence and no declared
 +  associativity (i.e., declared with %precedence), and whose precedence is
 +  never used.  In that case, the symbol can be safely declared with %token
 +  instead, without modifying the parsing tables.  For example:
 +
 +    %precedence '='
 +    %%
 +    exp: "var" '=' "number";
 +
 +  will produce a
 +
 +    warning: useless precedence for '=' [-Wprecedence]
 +     %precedence '='
 +                 ^^^
 +
 +*** Useless precedence and associativity
 +
 +  In case of both useless precedence and associativity, the issue is flagged
 +  as follows:
 +
 +    %nonassoc '='
 +    %%
 +    exp: "var" '=' "number";
 +
 +  The warning is:
 +
 +    warning: useless precedence and associativity for '=' [-Wprecedence]
 +     %nonassoc '='
 +               ^^^
 +
 +** Empty rules
 +
 +  With help from Joel E. Denny and Gabriel Rassoul.
 +
 +  Empty rules (i.e., with an empty right-hand side) can now be explicitly
 +  marked by the new %empty directive.  Using %empty on a non-empty rule is
 +  an error.  The new -Wempty-rule warning reports empty rules without
 +  %empty.  On the following grammar:
 +
 +    %%
 +    s: a b c;
 +    a: ;
 +    b: %empty;
 +    c: 'a' %empty;
 +
 +  bison reports:
 +
 +    3.4-5: warning: empty rule without %empty [-Wempty-rule]
 +     a: {}
 +        ^^
 +    5.8-13: error: %empty on non-empty rule
 +     c: 'a' %empty {};
 +            ^^^^^^
 +
 +** Java skeleton improvements
 +
 +  Contributed by Paolo Bonzini.
 +
 +  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).
 +
 +*** %define api.value.type variant
 +
 +  This is based on a submission from Michiel De Wilde.  With help
 +  from Théophile Ranquet.
 +
 +  In this mode, complex C++ objects can be used as semantic values.  For
 +  instance:
 +
 +    %token <::std::string> TEXT;
 +    %token <int> NUMBER;
 +    %token SEMICOLON ";"
 +    %type <::std::string> item;
 +    %type <::std::list<std::string>> list;
 +    %%
 +    result:
 +      list  { std::cout << $1 << std::endl; }
 +    ;
 +
 +    list:
 +      %empty        { /* Generates an empty string list. */ }
 +    | list item ";" { std::swap ($$, $1); $$.push_back ($2); }
 +    ;
 +
 +    item:
 +      TEXT    { std::swap ($$, $1); }
 +    | NUMBER  { $$ = string_cast ($1); }
 +    ;
 +
 +*** %define api.token.constructor
 +
 +  When variants are enabled, Bison can generate functions to build the
 +  tokens.  This guarantees that the token type (e.g., NUMBER) is consistent
 +  with the semantic value (e.g., int):
 +
 +    parser::symbol_type yylex ()
 +    {
 +      parser::location_type loc = ...;
 +      ...
 +      return parser::make_TEXT ("Hello, world!", loc);
 +      ...
 +      return parser::make_NUMBER (42, loc);
 +      ...
 +      return parser::make_SEMICOLON (loc);
 +      ...
 +    }
 +
++* Noteworthy changes in release ?.? (????-??-??) [?]
++
+ ** Bug fixes
+ *** Fix compiler attribute portability (yacc.c)
+   With locations enabled, __attribute__ was used unprotected.
+ *** Fix some compiler warnings (lalr1.cc)
  * Noteworthy changes in release 2.7 (2012-12-12) [stable]
  
  ** Bug fixes
  
  ** Diagnostics are improved
  
 +  Contributed by Théophile Ranquet.
 +
  *** Changes in the format of error messages
  
    This used to be the format of many error reports:
       exp: exp '+' exp { $exp = $1 + $3; };
                    ^^^
  
 -  The default behaviour for now is still not to display these unless
 -  explictly asked with -fcaret (or -fall). However, in a later release, it
 +  The default behavior for now is still not to display these unless
 +  explicitly asked with -fcaret (or -fall). However, in a later release, it
    will be made the default behavior (but may still be deactivated with
    -fno-caret).
  
  
  ** Graph improvements in DOT and XSLT
  
 +  Contributed by Théophile Ranquet.
 +
    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.
  
    Other issues in the test suite have been addressed.
  
 -  Nul characters are correctly displayed in error messages.
 +  Null characters are correctly displayed in error messages.
  
    When possible, yylloc is correctly initialized before calling yylex.  It
    is no longer necessary to initialize it in the %initial-action.
  
  * 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
  
    The next major release of Bison will drop support for the following
    deprecated features.  Please report disagreements to bug-bison@gnu.org.
    These features are experimental.  More user feedback will help to
    stabilize them.
  
 -** LAC (Lookahead Correction) for syntax error handling:
 +** LAC (Lookahead Correction) for syntax error handling
 +
 +  Contributed by Joel E. Denny.
  
    Canonical LR, IELR, and LALR can suffer from a couple of problems
    upon encountering a syntax error.  First, the parser might perform
@@@ -2622,13 -2057,8 +2632,13 @@@ 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 parsers yystackp yyval yynerrs
 + LocalWords:  Théophile Ranquet Santet fno fnone stype associativity Tolmer
 + LocalWords:  Wprecedence Rassoul Wempty Paolo Bonzini parser's Michiel loc
 + LocalWords:  redeclaration sval fcaret reentrant XSLT xsl Wmaybe yyvsp Tedi
 + LocalWords:  pragmas noreturn untyped Rozenman unexpanded Wojciech Polak
 + LocalWords:  Alexandre MERCHANTABILITY yytype
  
  Local Variables:
  mode: outline
diff --combined THANKS
index f30602cb49f49260c6999ab54670f46496e52a6c,a2d3ea231d4e03a7140e89a0f856cecd48b30cf7..a7d1d47ec9c244f9d4dd74dafd2c3e0134a75106
--- 1/THANKS
--- 2/THANKS
+++ b/THANKS
@@@ -44,7 -44,6 +44,7 @@@ Fabrice Bauzac            noon@cote-daz
  Florian Krohm             florian@edamail.fishkill.ibm.com
  Frank Heckenbach          frank@g-n-u.de
  Frans Englich             frans.englich@telia.com
 +Gabriel Rassoul           gabriel.rassoul@epita.fr
  Georg Sauthoff            gsauthof@TechFak.Uni-Bielefeld.DE
  George Neuner             gneuner2@comcast.net
  Gilles Espinasse          g.esp@free.fr
@@@ -77,12 -76,10 +77,12 @@@ Matt Kraai                kraai@alumni.
  Matt Rosing               rosing@peakfive.com
  Michael Hayes             m.hayes@elec.canterbury.ac.nz
  Michael Raskin            7c6f434c@mail.ru
 +Michiel De Wilde          mdewilde.agilent@gmail.com
  Mickael Labau             labau_m@epita.fr
  Mike Castle               dalgoda@ix.netcom.com
  Neil Booth                NeilB@earthling.net
  Nelson H. F. Beebe        beebe@math.utah.edu
 +Nick Bowler               nbowler@elliptictech.com
  Nicolas Burrus            nicolas.burrus@epita.fr
  Nicolas Tisserand         nicolas.tisserand@epita.fr
  Noah Friedman             friedman@gnu.org
@@@ -99,7 -96,6 +99,7 @@@ Peter Fales               psfales@lucen
  Peter Hamorsky            hamo@upjs.sk
  Peter Simons              simons@cryp.to
  Piotr Gackiewicz          gacek@intertel.com.pl
 +Quentin Hocquet           hocquet@gostai.com
  Quoc Peyrot               chojin@lrde.epita.fr
  R Blake                   blakers@mac.com
  Raja R Harinath           harinath@cs.umn.edu
@@@ -107,7 -103,7 +107,8 @@@ Ralf Wildenhues           Ralf.Wildenhu
  Richard Stallman          rms@gnu.org
  Rob Vermaas               rob.vermaas@gmail.com
  Robert Anisko             anisko_r@epita.fr
+ Rob Conde                 rob.conde@ai-solutions.com
 +Roland Levillain          roland@lrde.epita.fr
  Satya Kiran Popuri        satyakiran@gmail.com
  Sebastian Setzer          sebastian.setzer.ext@siemens.com
  Sebastien Fricker         sebastien.fricker@gmail.com
@@@ -126,7 -122,7 +127,8 @@@ Tom Tromey                tromey@cygnus
  Tommy Nordgren            tommy.nordgren@chello.se
  Troy A. Johnson           troyj@ecn.purdue.edu
  Tys Lefering              gccbison@gmail.com
 +Valentin Tolmer           nitnelave1@gmail.com
+ Victor Khomenko           victor.khomenko@newcastle.ac.uk
  Vin Shelton               acs@alumni.princeton.edu
  W.C.A. Wijngaards         wouter@NLnetLabs.nl
  Wayne Green               wayne@infosavvy.com
diff --combined build-aux/local.mk
index c5f87ad281db455fcbe6663845f6693171f6e8b1,0000000000000000000000000000000000000000..8922ea5fec77274a29014aa383b292fd947c2a67
mode 100644,000000..100644
--- /dev/null
@@@ -1,23 -1,0 +1,21 @@@
- ## Makefile for Bison testsuite.
 +# Copyright (C) 2000-2013 Free Software Foundation, Inc.
 +#
 +# This program is free software: you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
 +# the Free Software Foundation, either version 3 of the License, or
 +# (at your option) any later version.
 +#
 +# This program is distributed in the hope that it will be useful,
 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +# GNU General Public License for more details.
 +#
 +# You should have received a copy of the GNU General Public License
 +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 +
 +EXTRA_DIST +=                                   \
 +  build-aux/cross-options.pl                    \
 +  build-aux/darwin11.4.0.valgrind               \
 +  build-aux/move-if-change                      \
 +  build-aux/prev-version.txt                    \
 +  build-aux/update-b4-copyright
diff --combined data/bison.m4
index dc12ad2bad9faf192b9a9412c20f0075643b59f6,d87082840a3b5ff85047d8593a37267ff8056af6..910cdf26270e79a6cc4a0fddcaa9feb5c116f8e4
  ## Identification.  ##
  ## ---------------- ##
  
 -# b4_copyright(TITLE, YEARS)
 -# --------------------------
 +# b4_copyright(TITLE, [YEARS])
 +# ----------------------------
 +# If YEARS are not defined, use b4_copyright_years.
  m4_define([b4_copyright],
  [b4_comment([A Bison parser, made by GNU Bison b4_version.])
  
  b4_comment([$1
  
 -m4_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [   ])
 +]m4_dquote(m4_text_wrap([Copyright (C)
 +]m4_ifval([$2], [[$2]], [m4_defn([b4_copyright_years])])[
 +Free Software Foundation, Inc.]))[
  
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
@@@ -85,20 -82,6 +85,20 @@@ m4_changecom([#]
  ])
  
  
 +# b4_divert_kill(CODE)
 +# --------------------
 +# Expand CODE for its side effects, discard its output.
 +m4_define([b4_divert_kill],
 +[m4_divert_text([KILL], [$1])])
 +
 +
 +# b4_define_silent(MACRO, CODE)
 +# -----------------------------
 +# Same as m4_define, but throw away the expansion of CODE.
 +m4_define([b4_define_silent],
 +[m4_define([$1], [b4_divert_kill([$2])])])
 +
 +
  ## ---------------- ##
  ## Error handling.  ##
  ## ---------------- ##
@@@ -120,16 -103,30 +120,16 @@@ _m4eo
  ])dnl
  m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])])
  
 -# b4_error(KIND, FORMAT, [ARG1], [ARG2], ...)
 -# -------------------------------------------
 -# Write @KIND(FORMAT@,ARG1@,ARG2@,...@) to stdout.
 +# b4_error(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
 +# -------------------------------------------------------
 +# Write @KIND(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
  #
  # For example:
  #
 -#   b4_error([[warn]], [[invalid value for '%s': %s]], [[foo]], [[3]])
 +#   b4_error([[complain]], [[input.y:2.3]], [[input.y:5.4]],
 +#            [[invalid %s]], [[foo]])
  m4_define([b4_error],
 -[b4_cat([[@]$1[(]$2[]]dnl
 -[m4_if([$#], [2], [],
 -       [m4_foreach([b4_arg],
 -                   m4_dquote(m4_shift(m4_shift($@))),
 -                   [[@,]b4_arg])])[@)]])])
 -
 -# b4_error_at(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
 -# ----------------------------------------------------------
 -# Write @KIND_at(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
 -#
 -# For example:
 -#
 -#   b4_error_at([[complain]], [[input.y:2.3]], [[input.y:5.4]],
 -#               [[invalid %s]], [[foo]])
 -m4_define([b4_error_at],
 -[b4_cat([[@]$1[_at(]$2[@,]$3[@,]$4[]]dnl
 +[b4_cat([[@complain][(]$1[@,]$2[@,]$3[@,]$4[]]dnl
  [m4_if([$#], [4], [],
         [m4_foreach([b4_arg],
                     m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))),
  #   m4_define([asdf], [ASDF])
  #   m4_define([fsa], [FSA])
  #   m4_define([fdsa], [FDSA])
 -#   b4_warn([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
 -#   b4_warn([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
 -#   b4_warn()
 -#   b4_warn(1)
 -#   b4_warn(1, 2)
 +#   b4_warn_at([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
 +#   b4_warn_at([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
 +#   b4_warn_at()
 +#   b4_warn_at(1)
 +#   b4_warn_at(1, 2)
  #
  # Should produce this without newlines:
  #
 -#   @warn([asdf), asdf]@,[fsa), fsa]@,[fdsa), fdsa]@)
 -#   @warn(asdf), asdf@,fsa), fsa@,fdsa), fdsa@)
 +#   @warn_at([asdf), asdf]@,@,@,[fsa), fsa]@,[fdsa), fdsa]@)
 +#   @warn(asdf), asdf@,@,@,fsa), fsa@,fdsa), fdsa@)
  #   @warn(@)
  #   @warn(1@)
  #   @warn(1@,2@)
  m4_define([b4_warn],
 -[b4_error([[warn]], $@)])
 +[b4_error([[warn]], [], [], $@)])
  
  # b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...)
  # ---------------------------------------------------
  #
  #   b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]])
  m4_define([b4_warn_at],
 -[b4_error_at([[warn]], $@)])
 +[b4_error([[warn]], $@)])
  
  # b4_complain(FORMAT, [ARG1], [ARG2], ...)
  # ----------------------------------------
 -# Write @complain(FORMAT@,ARG1@,ARG2@,...@) to stdout.
 +# Bounce to b4_complain_at.
  #
  # See b4_warn example.
  m4_define([b4_complain],
 -[b4_error([[complain]], $@)])
 +[b4_error([[complain]], [], [], $@)])
  
  # b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...)
  # -------------------------------------------------------
  #
  # See b4_warn_at example.
  m4_define([b4_complain_at],
 -[b4_error_at([[complain]], $@)])
 +[b4_error([[complain]], $@)])
  
  # b4_fatal(FORMAT, [ARG1], [ARG2], ...)
  # -------------------------------------
 -# Write @fatal(FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
 +# Bounce to b4_fatal_at.
  #
  # See b4_warn example.
  m4_define([b4_fatal],
 -[b4_error([[fatal]], $@)dnl
 +[b4_error([[fatal]], [], [], $@)dnl
  m4_exit(1)])
  
  # b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...)
  #
  # See b4_warn_at example.
  m4_define([b4_fatal_at],
 -[b4_error_at([[fatal]], $@)dnl
 +[b4_error([[fatal]], $@)dnl
  m4_exit(1)])
  
  
@@@ -221,87 -218,6 +221,87 @@@ m4_define([b4_ints_in]
  [m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])])
  
  
 +# b4_subtract(LHS, RHS)
 +# ---------------------
 +# Evaluate LHS - RHS if they are integer literals, otherwise expand
 +# to (LHS) - (RHS).
 +m4_define([b4_subtract],
 +[m4_bmatch([$1$2], [^[0123456789]*$],
 +           [m4_eval([$1 - $2])],
 +           [($1) - ($2)])])
 +
 +# b4_join(ARG1, ...)
 +# _b4_join(ARG1, ...)
 +# -------------------
 +# Join with comma, skipping empty arguments.
 +# b4_join calls itself recursively until it sees the first non-empty
 +# argument, then calls _b4_join which prepends each non-empty argument
 +# with a comma.
 +m4_define([b4_join],
 +[m4_if([$#$1],
 +       [1], [],
 +       [m4_ifval([$1],
 +                 [$1[]_$0(m4_shift($@))],
 +                 [$0(m4_shift($@))])])])
 +
 +# _b4_join(ARGS1, ...)
 +# --------------------
 +m4_define([_b4_join],
 +[m4_if([$#$1],
 +       [1], [],
 +       [m4_ifval([$1], [, $1])[]$0(m4_shift($@))])])
 +
 +
 +
 +
 +# b4_integral_parser_tables_map(MACRO)
 +# -------------------------------------
 +# Map MACRO on all the integral tables.  MACRO is expected to have
 +# the signature MACRO(TABLE-NAME, CONTENT, COMMENT).
 +m4_define([b4_integral_parser_tables_map],
 +[$1([pact], [b4_pact],
 +    [[YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 +STATE-NUM.]])
 +
 +$1([defact], [b4_defact],
 +   [[YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
 +Performed when YYTABLE does not specify something else to do.  Zero
 +means the default is an error.]])
 +
 +$1([pgoto], [b4_pgoto], [[YYPGOTO[NTERM-NUM].]])
 +
 +$1([defgoto], [b4_defgoto], [[YYDEFGOTO[NTERM-NUM].]])
 +
 +$1([table], [b4_table],
 +   [[YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
 +positive, shift that token.  If negative, reduce the rule whose
 +number is the opposite.  If YYTABLE_NINF, syntax error.]])
 +
 +$1([check], [b4_check])
 +
 +$1([stos], [b4_stos],
 +   [[YYSTOS[STATE-NUM] -- The (internal number of the) accessing
 +symbol of state STATE-NUM.]])
 +
 +$1([r1], [b4_r1],
 +   [[YYR1[YYN] -- Symbol number of symbol that rule YYN derives.]])
 +
 +$1([r2], [b4_r2],
 +   [[YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.]])
 +])
 +
 +
 +# b4_parser_tables_declare
 +# b4_parser_tables_define
 +# ------------------------
 +# Define/declare the (deterministic) parser tables.
 +m4_define([b4_parser_tables_declare],
 +[b4_integral_parser_tables_map([b4_integral_parser_table_declare])])
 +
 +m4_define([b4_parser_tables_define],
 +[b4_integral_parser_tables_map([b4_integral_parser_table_define])])
 +
 +
  
  ## ------------------ ##
  ## Decoding options.  ##
  m4_define([b4_flag_if],
  [m4_case(b4_$1_flag,
           [0], [$3],
 -       [1], [$2],
 -       [m4_fatal([invalid $1 value: ]$1)])])
 +         [1], [$2],
 +         [m4_fatal([invalid $1 value: ]b4_$1_flag)])])
  
  
  # b4_define_flag_if(FLAG)
@@@ -327,7 -243,7 +327,7 @@@ m4_define([b4_define_flag_if]
  # _b4_define_flag_if($1, $2, FLAG)
  # --------------------------------
  # Work around the impossibility to define macros inside macros,
 -# because issuing `[$1]' is not possible in M4.  GNU M4 should provide
 +# because issuing '[$1]' is not possible in M4.  GNU M4 should provide
  # $$1 a la M5/TeX.
  m4_define([_b4_define_flag_if],
  [m4_if([$1$2], $[1]$[2], [],
@@@ -340,207 -256,15 +340,225 @@@ m4_define([b4_$3_if]
  # -----------------------------
  # Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise.
  b4_define_flag_if([defines])            # Whether headers are requested.
 -b4_define_flag_if([error_verbose])      # Whether error are verbose.
  b4_define_flag_if([glr])                # Whether a GLR parser is requested.
 -b4_define_flag_if([locations])          # Whether locations are tracked.
  b4_define_flag_if([nondeterministic])   # Whether conflicts should be handled.
  b4_define_flag_if([token_table])        # Whether yytoken_table is demanded.
  b4_define_flag_if([yacc])               # Whether POSIX Yacc is emulated.
  
 -# yytoken_table is needed to support verbose errors.
 -b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
 +
 +## --------- ##
 +## Symbols.  ##
 +## --------- ##
 +
 +# In order to unify the handling of the various aspects of symbols
 +# (tag, type_name, whether terminal, etc.), bison.exe defines one
 +# macro per (token, field), where field can has_id, id, etc.: see
 +# src/output.c:prepare_symbols_definitions().
 +#
 +# The various FIELDS are:
 +#
 +# - has_id: 0 or 1.
 +#   Whether the symbol has an id.
 +# - id: string
 +#   If has_id, the id.  Guaranteed to be usable as a C identifier.
 +#   Prefixed by api.token.prefix if defined.
 +# - tag: string.
 +#   A representat of the symbol.  Can be 'foo', 'foo.id', '"foo"' etc.
 +# - user_number: integer
 +#   The assigned (external) number as used by yylex.
 +# - is_token: 0 or 1
 +#   Whether this is a terminal symbol.
 +# - number: integer
 +#   The internalized number (used after yytranslate).
 +# - has_type: 0, 1
 +#   Whether has a semantic value.
 +# - type_tag: string
 +#   When api.value.type=union, the generated name for the union member.
 +#   yytype_INT etc. for symbols that has_id, otherwise yytype_1 etc.
 +# - type
 +#   If it has a semantic value, its type tag, or, if variant are used,
 +#   its type.
 +#   In the case of api.value.type=union, type is the real type (e.g. int).
 +# - has_printer: 0, 1
 +# - printer: string
 +# - printer_file: string
 +# - printer_line: integer
 +#   If the symbol has a printer, everything about it.
 +# - has_destructor, destructor, destructor_file, destructor_line
 +#   Likewise.
 +#
 +# The following macros provide access to these values.
 +
 +# b4_symbol_(NUM, FIELD)
 +# ----------------------
 +# Recover a FIELD about symbol #NUM.  Thanks to m4_indir, fails if
 +# undefined.
 +m4_define([b4_symbol_],
 +[m4_indir([b4_symbol($1, $2)])])
 +
 +
 +# b4_symbol(NUM, FIELD)
 +# ---------------------
 +# Recover a FIELD about symbol #NUM.  Thanks to m4_indir, fails if
 +# undefined.  If FIELD = id, prepend the token prefix.
 +m4_define([b4_symbol],
 +[m4_case([$2],
 +         [id],    [m4_do([b4_percent_define_get([api.token.prefix])],
 +                         [b4_symbol_([$1], [id])])],
 +         [b4_symbol_($@)])])
 +
 +
 +# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
 +# -------------------------------------------
 +# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE.
 +# Otherwise an error.
 +m4_define([b4_symbol_if],
 +[m4_case(b4_symbol([$1], [$2]),
 +         [1], [$3],
 +         [0], [$4],
 +         [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
 +
 +
 +# b4_symbol_tag_comment(SYMBOL-NUM)
 +# ---------------------------------
 +# Issue a comment giving the tag of symbol NUM.
 +m4_define([b4_symbol_tag_comment],
 +[b4_comment([b4_symbol([$1], [tag])])
 +])
 +
 +
 +# b4_symbol_action_location(SYMBOL-NUM, KIND)
 +# -------------------------------------------
 +# Report the location of the KIND action as FILE:LINE.
 +m4_define([b4_symbol_action_location],
 +[b4_symbol([$1], [$2_file]):b4_syncline([b4_symbol([$1], [$2_line])])])
 +
 +
 +# b4_symbol_action(SYMBOL-NUM, KIND)
 +# ----------------------------------
 +# Run the action KIND (destructor or printer) for SYMBOL-NUM.
 +# Same as in C, but using references instead of pointers.
 +m4_define([b4_symbol_action],
 +[b4_symbol_if([$1], [has_$2],
 +[b4_dollar_pushdef([(*yyvaluep)],
 +                   b4_symbol_if([$1], [has_type],
 +                                [m4_dquote(b4_symbol([$1], [type]))]),
 +                   [(*yylocationp)])dnl
 +    b4_symbol_case_([$1])[]dnl
 +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
 +      b4_symbol([$1], [$2])
 +b4_syncline([@oline@], [@ofile@])
 +        break;
 +
 +b4_dollar_popdef[]dnl
 +])])
 +
 +
 +# b4_symbol_destructor(SYMBOL-NUM)
 +# b4_symbol_printer(SYMBOL-NUM)
 +# --------------------------------
 +m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])])
 +m4_define([b4_symbol_printer],    [b4_symbol_action([$1], [printer])])
 +
 +
++# b4_symbol_actions(KIND, [TYPE = yytype])
++# ----------------------------------------
++# Emit the symbol actions for KIND ("printer" or "destructor").
++# Dispatch on TYPE.
++m4_define([b4_symbol_actions],
++[m4_pushdef([b4_actions_], m4_expand([b4_symbol_foreach([b4_symbol_$1])]))dnl
++m4_ifval(m4_defn([b4_actions_]),
++[switch (m4_default([$2], [yytype]))
++    {
++      m4_defn([b4_actions_])
++      default:
++        break;
++    }dnl
++],
++[YYUSE (m4_default([$2], [yytype]));])dnl
++m4_popdef([b4_actions_])dnl
++])
++
 +# b4_symbol_case_(SYMBOL-NUM)
 +# ---------------------------
 +# Issue a "case NUM" for SYMBOL-NUM.
 +m4_define([b4_symbol_case_],
 +[case b4_symbol([$1], [number]): b4_symbol_tag_comment([$1])])
 +])
 +
 +
 +# b4_symbol_foreach(MACRO)
 +# ------------------------
 +# Invoke MACRO(SYMBOL-NUM) for each SYMBOL-NUM.
 +m4_define([b4_symbol_foreach],
 +          [m4_map([$1], m4_defn([b4_symbol_numbers]))])
 +
 +# b4_symbol_map(MACRO)
 +# --------------------
 +# Return a list (possibly empty elements) of MACRO invoked for each
 +# SYMBOL-NUM.
 +m4_define([b4_symbol_map],
 +[m4_map_args_sep([$1(], [)], [,], b4_symbol_numbers)])
 +
 +
 +# b4_token_visible_if(NUM, IF-TRUE, IF-FALSE)
 +# -------------------------------------------
 +# Whether NUM denotes a token that has an exported definition (i.e.,
 +# shows in enum yytokentype).
 +m4_define([b4_token_visible_if],
 +[b4_symbol_if([$1], [is_token],
 +              [b4_symbol_if([$1], [has_id], [$2], [$3])],
 +              [$3])])
 +
 +# b4_token_has_definition(NUM)
 +# ----------------------------
 +# 1 if NUM is visible, nothing otherwise.
 +m4_define([b4_token_has_definition],
 +[b4_token_visible_if([$1], [1])])
 +
 +# b4_any_token_visible_if([IF-TRUE], [IF-FALSE])
 +# ----------------------------------------------
 +# Whether there is a token that needs to be defined.
 +m4_define([b4_any_token_visible_if],
 +[m4_ifval(b4_symbol_foreach([b4_token_has_definition]),
 +          [$1], [$2])])
 +
 +
 +# b4_token_format(FORMAT, NUM)
 +# ----------------------------
 +m4_define([b4_token_format],
 +[b4_token_visible_if([$2],
 +[m4_quote(m4_format([$1],
 +                     [b4_symbol([$2], [id])],
 +                     [b4_symbol([$2], [user_number])]))])])
 +
 +
 +## ------- ##
 +## Types.  ##
 +## ------- ##
 +
 +# b4_type_action_(NUMS)
 +# ---------------------
 +# Run actions for the symbol NUMS that all have the same type-name.
 +# Skip NUMS that have no type-name.
 +#
 +# To specify the action to run, define b4_dollar_dollar(NUMBER,
 +# TAG, TYPE).
 +m4_define([b4_type_action_],
 +[b4_symbol_if([$1], [has_type],
 +[m4_map([      b4_symbol_case_], [$@])[]dnl
 +        b4_dollar_dollar([b4_symbol([$1], [number])],
 +                         [b4_symbol([$1], [tag])],
 +                         [b4_symbol([$1], [type])]);
 +        break;
 +
 +])])
 +
 +# b4_type_foreach(MACRO)
 +# ----------------------
 +# Invoke MACRO(SYMBOL-NUMS) for each set of SYMBOL-NUMS for each type set.
 +m4_define([b4_type_foreach],
 +          [m4_map([$1], m4_defn([b4_type_names]))])
  
  
  
@@@ -560,21 -284,11 +578,21 @@@ m4_define([b4_basename]
  # -----------------------
  m4_define([b4_syncline],
  [b4_flag_if([synclines],
 -[b4_sync_end([__line__], [b4_basename(m4_quote(__file__))])
 -b4_sync_start([$1], [$2])])])
 +[b4_sync_start([$1], [$2]) b4_sync_end([__line__],
 +                                       [b4_basename(m4_quote(__file__))])[]dnl
 +])])
 +
 +# b4_sync_start(LINE, FILE)
 +# -----------------------
 +# Syncline for the new place.  Typically a directive for the compiler.
 +m4_define([b4_sync_start], [b4_comment([$2:$1])])
 +
 +# b4_sync_end(LINE, FILE)
 +# -----------------------
 +# Syncline for the current place, which ends.  Typically a comment
 +# left for the reader.
 +m4_define([b4_sync_end],   [b4_comment([$2:$1])])
  
 -m4_define([b4_sync_end], [b4_comment([Line $1 of $2])])
 -m4_define([b4_sync_start], [b4_comment([Line $1 of $2])])
  
  # b4_user_code(USER-CODE)
  # -----------------------
@@@ -596,14 -310,14 +614,14 @@@ m4_define([b4_define_user_code]
  # b4_user_initial_action
  # b4_user_post_prologue
  # b4_user_pre_prologue
 -# b4_user_stype
 +# b4_user_union_members
  # ----------------------
  # Macros that issue user code, ending with synclines.
  b4_define_user_code([actions])
  b4_define_user_code([initial_action])
  b4_define_user_code([post_prologue])
  b4_define_user_code([pre_prologue])
 -b4_define_user_code([stype])
 +b4_define_user_code([union_members])
  
  
  # b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE)
@@@ -659,6 -373,7 +677,6 @@@ m4_popdef([b4_end])dn
  
  
  
 -
  ## --------------------- ##
  ## b4_percent_define_*.  ##
  ## --------------------- ##
@@@ -688,6 -403,7 +706,6 @@@ m4_ifdef([b4_percent_define(]$1[)]
           [m4_indir([b4_percent_define(]$1[)])],
           [$2])])
  
 -
  # b4_percent_define_get_loc(VARIABLE)
  # -----------------------------------
  # Mimic muscle_percent_define_get_loc in ../src/muscle-tab.h exactly.  That is,
@@@ -705,21 -421,7 +723,21 @@@ m4_define([b4_percent_define_get_loc]
            [m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl
  b4_loc[]dnl
  m4_popdef([b4_loc])],
 -          [b4_fatal([[b4_percent_define_get_loc: undefined %%define variable '%s']], [$1])])])
 +          [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
 +
 +# b4_percent_define_get_kind(VARIABLE)
 +# ------------------------------------
 +# Get the kind (code, keyword, string) of VARIABLE, i.e., how its
 +# value was defined (braces, not delimiters, quotes).
 +#
 +# If the %define variable VARIABLE is undefined, complain fatally
 +# since that's a Bison or skeleton error.  Don't record this as a
 +# Bison usage of VARIABLE as there's no reason to suspect that the
 +# user-supplied value has yet influenced the output.
 +m4_define([b4_percent_define_get_kind],
 +[m4_ifdef([b4_percent_define_kind(]$1[)],
 +          [m4_indir([b4_percent_define_kind(]$1[)])],
 +          [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
  
  # b4_percent_define_get_syncline(VARIABLE)
  # ----------------------------------------
  m4_define([b4_percent_define_get_syncline],
  [m4_ifdef([b4_percent_define_syncline(]$1[)],
            [m4_indir([b4_percent_define_syncline(]$1[)])],
 -          [b4_fatal([[b4_percent_define_get_syncline: undefined %%define variable '%s']], [$1])])])
 +          [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
  
  # b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
  # ------------------------------------------------------
  #   b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
  m4_define([b4_percent_define_ifdef],
  [m4_ifdef([b4_percent_define(]$1[)],
 -        [m4_define([b4_percent_define_bison_variables(]$1[)])$2],
 -        [$3])])
 +          [b4_percent_define_use([$1])$2],
 +          [$3])])
 +
 +
 +## --------- ##
 +## Options.  ##
 +## --------- ##
 +
  
  # b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE])
  # --------------------------------------------------------
@@@ -780,8 -476,7 +798,8 @@@ m4_define([b4_percent_define_flag_if]
                                             [[invalid value for %%define Boolean variable '%s']],
                                             [$1])],
                             [[b4_percent_define_flag_if($1)]])])],
 -  [b4_fatal([[b4_percent_define_flag_if: undefined %%define variable '%s']], [$1])])])
 +  [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
 +
  
  # b4_percent_define_default(VARIABLE, DEFAULT)
  # --------------------------------------------
@@@ -801,21 -496,6 +819,21 @@@ m4_define([b4_percent_define_default]
                          [[<skeleton default value>:-1.-1]]]])dnl
              m4_define([b4_percent_define_syncline(]$1[)], [[]])])])
  
 +
 +# b4_percent_define_if_define(NAME, [VARIABLE = NAME])
 +# ----------------------------------------------------
 +# Define b4_NAME_if that executes its $1 or $2 depending whether
 +# VARIABLE was %defined.  The characters '.' and `-' in VARIABLE are mapped
 +# to '_'.
 +m4_define([b4_percent_define_if_define_],
 +[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]),
 +           [b4_percent_define_flag_if(m4_default([$2], [$1]),
 +                                      [$3], [$4])])])
 +m4_define([b4_percent_define_if_define],
 +[b4_percent_define_default([m4_default([$2], [$1])], [[false]])
 +b4_percent_define_if_define_([$1], [$2], $[1], $[2])])
 +
 +
  # b4_percent_define_check_values(VALUES)
  # --------------------------------------
  # Mimic muscle_percent_define_check_values in ../src/muscle-tab.h exactly
@@@ -849,11 -529,11 +867,11 @@@ m4_define([_b4_percent_define_check_val
                           [$1],
                           m4_dquote(m4_indir([b4_percent_define(]$1[)])))
            m4_foreach([b4_value], m4_dquote(m4_shift($@)),
 -                     [b4_complain_at(b4_percent_define_get_loc([$1]),
 +                     [b4_error([[note]], b4_percent_define_get_loc([$1]), []
                                       [[accepted value: '%s']],
                                       m4_dquote(b4_value))])])dnl
     m4_popdef([b4_good_value])],
 -  [b4_fatal([[b4_percent_define_check_values: undefined %%define variable '%s']], [$1])])])
 +  [b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
  
  # b4_percent_code_get([QUALIFIER])
  # --------------------------------
@@@ -887,62 -567,7 +905,62 @@@ m4_popdef([b4_macro_name])]
  m4_define([b4_percent_code_ifdef],
  [m4_ifdef([b4_percent_code(]$1[)],
            [m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2],
 -        [$3])])
 +          [$3])])
 +
 +
 +## ------------------ ##
 +## Common variables.  ##
 +## ------------------ ##
 +
 +# Default values for %define.
 +# ---------------------------
 +# If the api.token.prefix, it is empty.
 +m4_percent_define_default([[api.token.prefix]], [[]])
 +
 +# b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT])
 +# b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT])
 +# b4_token_ctor_if([IF-YYLEX-RETURNS-A-TOKEN], [IF-NOT])
 +# ----------------------------------------------
 +b4_percent_define_if_define([token_ctor], [api.token.constructor])
 +b4_percent_define_if_define([locations])     # Whether locations are tracked.
 +b4_percent_define_if_define([parse.assert])
 +b4_percent_define_if_define([parse.trace])
 +
 +
 +# b4_bison_locations_if([IF-TRUE])
 +# --------------------------------
 +# Expand IF-TRUE if using locations, and using the default location
 +# type.
 +m4_define([b4_bison_locations_if],
 +[b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [], [$1])])])
 +
 +
 +# b4_error_verbose_if([IF-ERRORS-ARE-VERBOSE], [IF-NOT])
 +# ------------------------------------------------------
 +# Map %define parse.error "(simple|verbose)" to b4_error_verbose_if and
 +# b4_error_verbose_flag.
 +b4_percent_define_default([[parse.error]], [[simple]])
 +b4_percent_define_check_values([[[[parse.error]],
 +                                 [[simple]], [[verbose]]]])
 +m4_define([b4_error_verbose_flag],
 +          [m4_case(b4_percent_define_get([[parse.error]]),
 +                   [simple],  [[0]],
 +                   [verbose], [[1]])])
 +b4_define_flag_if([error_verbose])
 +
 +# yytoken_table is needed to support verbose errors.
 +b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
 +
 +
 +# b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT])
 +# ----------------------------------------------
 +b4_percent_define_if_define([variant])
 +m4_define([b4_variant_flag], [[0]])
 +b4_percent_define_ifdef([[api.value.type]],
 +   [m4_case(b4_percent_define_get_kind([[api.value.type]]), [keyword],
 +            [m4_case(b4_percent_define_get([[api.value.type]]), [variant],
 +                    [m4_define([b4_variant_flag], [[1]])])])])
 +b4_define_flag_if([variant])
  
  
  ## ----------------------------------------------------------- ##
@@@ -976,32 -601,10 +994,32 @@@ m4_define_default([b4_parse_param], []
  m4_define_default([b4_location_initial_column], [1])
  m4_define_default([b4_location_initial_line],   [1])
  
 -# Sanity checks.
 +
 +## --------------- ##
 +## Sanity checks.  ##
 +## --------------- ##
 +
 +# api.prefix >< %name-prefix.
  b4_percent_define_ifdef([api.prefix],
  [m4_ifdef([b4_prefix],
  [b4_complain_at(b4_percent_define_get_loc([api.prefix]),
                  [['%s' and '%s' cannot be used together]],
                  [%name-prefix],
                  [%define api.prefix])])])
 +
 +# api.value.type >< %union.
 +b4_percent_define_ifdef([api.value.type],
 +[m4_ifdef([b4_union_members],
 +[b4_complain_at(b4_percent_define_get_loc([api.value.type]),
 +                [['%s' and '%s' cannot be used together]],
 +                [%union],
 +                [%define api.value.type])])])
 +
 +# api.value.type=union >< %yacc.
 +b4_percent_define_ifdef([api.value.type],
 +[m4_if(b4_percent_define_get([api.value.type]), [union],
 +[b4_yacc_if(dnl
 +[b4_complain_at(b4_percent_define_get_loc([api.value.type]),
 +                [['%s' and '%s' cannot be used together]],
 +                [%yacc],
 +                [%define api.value.type "union"])])])])
diff --combined data/c.m4
index edf9991ff8d5415b77e4c5e5edd88efa997b6213,b1b6e2895937d19b8521030e4eff2d37d140f6e9..abc769b9c3adfa1483e566ecca61d6d1d19577cc
+++ b/data/c.m4
@@@ -51,6 -51,12 +51,6 @@@ m4_define([b4_cpp_guard_close]
  ## Identification.  ##
  ## ---------------- ##
  
 -# b4_comment(TEXT)
 -# ----------------
 -m4_define([b4_comment], [/* m4_bpatsubst([$1], [
 -], [
 -   ])  */])
 -
  # b4_identification
  # -----------------
  # Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or
@@@ -104,27 -110,10 +104,27 @@@ m4_define_default([b4_union_name], [b4_
  ## Pure/impure interfaces.  ##
  ## ------------------------ ##
  
 +# b4_lex_formals
 +# --------------
 +# All the yylex formal arguments.
 +# b4_lex_param arrives quoted twice, but we want to keep only one level.
 +m4_define([b4_lex_formals],
 +[b4_pure_if([[[[YYSTYPE *yylvalp]], [[&yylval]]][]dnl
 +b4_locations_if([, [[YYLTYPE *yyllocp], [&yylloc]]])])dnl
 +m4_ifdef([b4_lex_param], [, ]b4_lex_param)])
 +
 +
 +# b4_lex
 +# ------
 +# Call yylex.
 +m4_define([b4_lex],
 +[b4_function_call([yylex], [int], b4_lex_formals)])
 +
 +
  # b4_user_args
  # ------------
  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
@@@ -148,13 -137,11 +148,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 -169,7 +182,7 @@@ m4_define([b4_int_type]
  # b4_int_type_for(NAME)
  # ---------------------
  # Return the smallest int type able to handle numbers ranging from
 -# `NAME_min' to `NAME_max' (included).
 +# 'NAME_min' to 'NAME_max' (included).
  m4_define([b4_int_type_for],
  [b4_int_type($1_min, $1_max)])
  
  # --------------------------------------------
  # 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)))])])
  
  
+ ## ----------------- ##
+ ## Compiler issues.  ##
+ ## ----------------- ##
+ # b4_attribute_define
+ # -------------------
+ # Provide portability for __attribute__.
+ m4_define([b4_attribute_define],
+ [#ifndef __attribute__
+ /* This feature is available in gcc versions 2.5 and later.  */
+ # if (! defined __GNUC__ || __GNUC__ < 2 \
+       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
+ #  define __attribute__(Spec) /* empty */
+ # endif
+ #endif
+ /* Suppress unused-variable warnings by "using" E.  */
+ #if ! defined lint || defined __GNUC__
+ # define YYUSE(E) ((void) (E))
+ #else
+ # define YYUSE(E) /* empty */
+ #endif
+ ])
 +## ---------##
 +## Values.  ##
 +## ---------##
 +
 +
  # b4_null_define
  # --------------
  # Portability issues: define a YY_NULL appropriate for the current
@@@ -224,148 -232,191 +249,148 @@@ 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>" whose 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([[/* Token type.  */
  #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], [,
 -],
 -           [$@])[
 -   };
 +  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])
  
 +## ----------------------- ##
 +## Declaring C functions.  ##
 +## ----------------------- ##
  
 -# b4_c_knr_formal_decls([DECL1, NAME1], ...)
 -# ------------------------------------------
 -# Output the K&R argument declarations.
 -m4_define([b4_c_knr_formal_decls],
 -[m4_map_sep([b4_c_knr_formal_decl],
 -            [
 -],
 -            [$@])])
  
 -m4_define([b4_c_knr_formal_decl],
 -[    $1;])
 -
 -
 -
 -## ------------------------------------------------------------ ##
 -## Declaring (prototyping) C functions in both K&R and ANSI-C.  ##
 -## ------------------------------------------------------------ ##
 -
 -
 -# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# ----------------------------------------------------------------
 -# Declare the function NAME ANSI C style.
 -m4_define([b4_c_ansi_function_decl],
 -[$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl
 +# b4_function_declare(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 +# ------------------------------------------------------------
 +# Declare the function NAME.
 +m4_define([b4_function_declare],
 +[$2 $1 (b4_formals(m4_shift2($@)));[]dnl
  ])
  
  
  
 -# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
 -# -----------------------------------------------------------
 -# Declare the function NAME in both K&R and ANSI C.
 -m4_define([b4_c_function_decl],
 -[#if defined __STDC__ || defined __cplusplus
 -b4_c_ansi_function_decl($@)
 -#else
 -$2 $1 ();
 -#endif[]dnl
 -])
 -
 -
  
  ## --------------------- ##
  ## Calling C functions.  ##
  ## --------------------- ##
  
  
 -# 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])
  
  
@@@ -387,28 -438,53 +412,28 @@@ m4_define([b4_sync_start], [[#]line $1 
  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_symbol_actions(KIND)
 -# -----------------------
 -# Emit the symbol actions for KIND ("printers" or "destructors").
 -# Dispatch on "yytype".
 -m4_define([b4_symbol_actions],
 -[m4_ifval(m4_defn([b4_symbol_$1]),
 -[[switch (yytype)
 -    {
 -]m4_map([_b4_symbol_actions], m4_defn([b4_symbol_$1]))[
 -      default:
 -        break;
 -    }]],
 -[YYUSE (yytype);])])
 -
 -
 -# 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)
-     {
- ]b4_symbol_foreach([b4_symbol_destructor])dnl
- [      default:
-         break;
-     }
 -  ]b4_symbol_actions([destructors])[
++  ]b4_symbol_actions([destructor])[
  }]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]],
@@@ -449,22 -527,19 +469,17 @@@ b4_locations_if([, [[YYLTYPE const * co
  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
 -  ]b4_symbol_actions([printers])[
 +]])dnl
- [  switch (yytype)
-     {
- ]b4_symbol_foreach([b4_symbol_printer])dnl
- [      default:
-         break;
-     }
++  b4_symbol_actions([printer])[
  }
  
  
  | Print this symbol on YYOUTPUT.  |
  `--------------------------------*/
  
 -]$1([yy_symbol_print],
 +]b4_function_define([yy_symbol_print],
      [static void],
                 [[FILE *yyoutput],                       [yyoutput]],
                 [[int yytype],                           [yytype]],
  b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
 -  if (yytype < YYNTOKENS)
 -    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
 -  else
 -    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
 +  YYFPRINTF (yyoutput, "%s %s (",
 +             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
  
  ]b4_locations_if([  YY_LOCATION_PRINT (yyoutput, *yylocationp);
    YYFPRINTF (yyoutput, ": ");
@@@ -492,205 -569,63 +507,205 @@@ b4_locations_if([, yylocationp])[]b4_us
  }]dnl
  ])
  
 +
 +## ---------------- ##
 +## api.value.type.  ##
 +## ---------------- ##
 +
 +
 +# ---------------------- #
 +# api.value.type=union.  #
 +# ---------------------- #
 +
 +# b4_symbol_type_register(SYMBOL-NUM)
 +# -----------------------------------
 +# Symbol SYMBOL-NUM has a type (for variant) instead of a type-tag.
 +# Extend the definition of %union's body with a field of that type,
 +# and extend the symbol's "type" field to point to the field name,
 +# instead of the type name.
 +m4_define([b4_symbol_type_register],
 +[m4_define([b4_symbol($1, type_tag)],
 +           [b4_symbol_if([$1], [has_id],
 +                         [b4_symbol([$1], [id])],
 +                         [yytype_[]b4_symbol([$1], [number])])])dnl
 +m4_append([b4_user_union_members],
 +m4_expand([
 +  b4_symbol_tag_comment([$1])dnl
 +  b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]))
 +])
 +
 +
 +# b4_type_define_tag(SYMBOL1-NUM, ...)
 +# ------------------------------------
 +# For the batch of symbols SYMBOL1-NUM... (which all have the same
 +# type), enhance the %union definition for each of them, and set
 +# there "type" field to the field tag name, instead of the type name.
 +m4_define([b4_type_define_tag],
 +[b4_symbol_if([$1], [has_type],
 +              [m4_map([b4_symbol_type_register], [$@])])
 +])
 +
 +
 +# b4_symbol_value_union(VAL, [TYPE])
 +# ----------------------------------
 +# Same of b4_symbol_value, but when api.value.type=union.
 +m4_define([b4_symbol_value_union],
 +[m4_ifval([$2],
 +          [(*($2*)(&$1))],
 +          [$1])])
 +])
 +
 +
 +# b4_value_type_setup_union
 +# -------------------------
 +# Setup support for api.value.type=union.  Symbols are defined with a
 +# type instead of a union member name: build the corresponding union,
 +# and give the symbols their tag.
 +m4_define([b4_value_type_setup_union],
 +[m4_define([b4_union_members])
 +b4_type_foreach([b4_type_define_tag])
 +m4_copy_force([b4_symbol_value_union], [b4_symbol_value])
 +])
 +
 +
 +# ---------------- #
 +# api.value.type.  #
 +# ---------------- #
 +
 +
 +# b4_value_type_setup_variant
 +# ---------------------------
 +# Setup support for api.value.type=variant.  By default, fail, specialized
 +# by other skeletons.
 +m4_define([b4_value_type_setup_variant],
 +[b4_complain_at(b4_percent_define_get_loc([[api.value.type]]),
 +                [['%s' does not support '%s']],
 +                [b4_skeleton],
 +                [%define api.value.type variant])])
 +
 +
 +# _b4_value_type_setup_keyword
 +# ----------------------------
 +# api.value.type is defined with a keyword/string syntax.  Check if
 +# that is properly defined, and prepare its use.
 +m4_define([_b4_value_type_setup_keyword],
 +[b4_percent_define_check_values([[[[api.value.type]],
 +                                  [[none]],
 +                                  [[union]],
 +                                  [[union-directive]],
 +                                  [[variant]],
 +                                  [[yystype]]]])dnl
 +m4_case(b4_percent_define_get([[api.value.type]]),
 +        [union],   [b4_value_type_setup_union],
 +        [variant], [b4_value_type_setup_variant])])
 +
 +
 +# b4_value_type_setup
 +# -------------------
 +# Check if api.value.type is properly defined, and possibly prepare
 +# its use.
 +b4_define_silent([b4_value_type_setup],
 +[# Define default value.
 +b4_percent_define_ifdef([[api.value.type]], [],
 +[# %union => api.value.type=union-directive
 +m4_ifdef([b4_union_members],
 +[m4_define([b4_percent_define_kind(api.value.type)], [keyword])
 +m4_define([b4_percent_define(api.value.type)], [union-directive])],
 +[# no tag seen => api.value.type={int}
 +m4_if(b4_tag_seen_flag, 0,
 +[m4_define([b4_percent_define_kind(api.value.type)], [code])
 +m4_define([b4_percent_define(api.value.type)], [int])],
 +[# otherwise api.value.type=yystype
 +m4_define([b4_percent_define_kind(api.value.type)], [keyword])
 +m4_define([b4_percent_define(api.value.type)], [yystype])])])])
 +
 +# Set up.
 +m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
 +   [keyword\|string], [_b4_value_type_setup_keyword])
 +])
 +
 +
  ## -------------- ##
  ## Declarations.  ##
  ## -------------- ##
  
 -# b4_declare_yylstype
 -# -------------------
 -# Declarations that might either go into the header (if --defines) or
 -# in the parser body.  Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
 -m4_define([b4_declare_yylstype],
 +
 +# b4_value_type_define
 +# --------------------
 +m4_define([b4_value_type_define],
 +[b4_value_type_setup[]dnl
 +/* Value type.  */
 +m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
 +[code],
  [[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
 -]m4_ifdef([b4_stype],
 -[[typedef union ]b4_union_name[
 +typedef ]b4_percent_define_get([[api.value.type]])[ ]b4_api_PREFIX[STYPE;
 +# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
 +# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
 +#endif
 +]],
 +[m4_bmatch(b4_percent_define_get([[api.value.type]]),
 +[union\|union-directive],
 +[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
 +typedef union ]b4_union_name[ ]b4_api_PREFIX[STYPE;
 +union ]b4_union_name[
  {
 -]b4_user_stype[
 -} ]b4_api_PREFIX[STYPE;
 -# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]],
 -[m4_if(b4_tag_seen_flag, 0,
 -[[typedef int ]b4_api_PREFIX[STYPE;
 -# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[
 -# define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */
 +]b4_user_union_members[
 +};
 +# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
  # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
 -#endif]b4_locations_if([[
 +#endif
 +]])])])
 +
  
 +# b4_location_type_define
 +# -----------------------
 +m4_define([b4_location_type_define],
 +[[/* Location type.  */
  #if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED
 -typedef struct ]b4_api_PREFIX[LTYPE
 +typedef struct ]b4_api_PREFIX[LTYPE ]b4_api_PREFIX[LTYPE;
 +struct ]b4_api_PREFIX[LTYPE
  {
    int first_line;
    int first_column;
    int last_line;
    int last_column;
 -} ]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]])
 +#endif
 +]])
 +
 +
 +# b4_declare_yylstype
 +# -------------------
 +# Declarations that might either go into the header (if --defines) or
 +# in the parser body.  Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
 +m4_define([b4_declare_yylstype],
 +[b4_value_type_define[]b4_locations_if([
 +b4_location_type_define])
  
  b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval;
  ]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl
  ])
  
 +
  # b4_YYDEBUG_define
 -# ------------------
 +# -----------------
  m4_define([b4_YYDEBUG_define],
 -[[/* Enabling traces.  */
 +[[/* Debug 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 YYDEBUG */
  #endif  /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
  ])
@@@ -715,7 -650,7 +730,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
  ]])
  
@@@ -748,7 -683,7 +763,7 @@@ m4_define([b4_yy_location_print_define]
  /* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
  
  __attribute__((__unused__))
 -]b4_c_function_def([yy_location_print_],
 +]b4_function_define([yy_location_print_],
      [static unsigned],
                 [[FILE *yyo],                    [yyo]],
                 [[YYLTYPE const * const yylocp], [yylocp]])[
    int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
    if (0 <= yylocp->first_line)
      {
 -      res += fprintf (yyo, "%d", yylocp->first_line);
 +      res += YYFPRINTF (yyo, "%d", yylocp->first_line);
        if (0 <= yylocp->first_column)
 -        res += fprintf (yyo, ".%d", yylocp->first_column);
 +        res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
      }
    if (0 <= yylocp->last_line)
      {
        if (yylocp->first_line < yylocp->last_line)
          {
 -          res += fprintf (yyo, "-%d", yylocp->last_line);
 +          res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
            if (0 <= end_col)
 -            res += fprintf (yyo, ".%d", end_col);
 +            res += YYFPRINTF (yyo, ".%d", end_col);
          }
        else if (0 <= end_col && yylocp->first_column < end_col)
 -        res += fprintf (yyo, "-%d", end_col);
 +        res += YYFPRINTF (yyo, "-%d", end_col);
      }
    return res;
   }
diff --combined data/glr.c
index 7ab3823589e99d7f05fa02aa69e70e2737fec23a,1a2e6ba68729beaf1517c86ce1c0e35eab8408da..ff70890f334f6b739e94d09d82004ae438ee099f
@@@ -52,7 -52,17 +52,7 @@@ m4_ifndef([b4_pure_flag]
  # This is not shared with yacc.c in c.m4 because  GLR relies on ISO C
  # formal argument declarations.
  m4_define([b4_user_formals],
 -[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])])
 -
 -
 -# b4_lex_param
 -# ------------
 -# Accumule in b4_lex_param all the yylex arguments.
 -# Yes, this is quite ugly...
 -m4_define([b4_lex_param],
 -m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[&yylval]]][]dnl
 -b4_locations_if([, [[YYLTYPE *], [&yylloc]]])])dnl
 -m4_ifdef([b4_lex_param], [, ]b4_lex_param)))
 +[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
  
  
  # b4_yyerror_args
@@@ -61,7 -71,7 +61,7 @@@
  # a trailing comma.
  m4_define([b4_yyerror_args],
  [b4_pure_if([b4_locations_if([yylocp, ])])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_lyyerror_args
@@@ -69,7 -79,7 +69,7 @@@
  # Same as above, but on the lookahead, hence &yylloc instead of yylocp.
  m4_define([b4_lyyerror_args],
  [b4_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_pure_args
@@@ -116,15 -126,7 +116,15 @@@ m4_define([b4_locuser_args]
  # --------------------
  # Expansion of $<TYPE>$.
  m4_define([b4_lhs_value],
 -[((*yyvalp)[]m4_ifval([$1], [.$1]))])
 +[b4_symbol_value([(*yyvalp)], [$1])])
 +
 +
 +# b4_rhs_data(RULE-LENGTH, NUM)
 +# -----------------------------
 +# Expand to the semantic stack place that contains value and location
 +# of symbol number NUM in a rule of length RULE-LENGTH.
 +m4_define([b4_rhs_data],
 +[((yyGLRStackItem const *)yyvsp)@{YYFILL (b4_subtract([$2], [$1]))@}.yystate])
  
  
  # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
  # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
  # symbols on RHS.
  m4_define([b4_rhs_value],
 -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))])
 +[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yysval], [$3])])
  
  
  
@@@ -152,7 -154,7 +152,7 @@@ m4_define([b4_lhs_location]
  # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
  # on RHS.
  m4_define([b4_rhs_location],
 -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)])
 +[(b4_rhs_data([$1], [$2]).yyloc)])
  
  
  ## -------------- ##
  # b4_shared_declarations
  # ----------------------
  # Declaration that might either go into the header (if --defines)
 -# or open coded in the parser body.
 -m4_define([b4_shared_declarations],
 +# or open coded in the parser body.  glr.cc has its own definition.
 +m4_if(b4_skeleton, ["glr.c"],
 +[m4_define([b4_shared_declarations],
  [b4_declare_yydebug[
  ]b4_percent_code_get([[requires]])[
 -]b4_token_enums(b4_tokens)[
 +]b4_token_enums[
  ]b4_declare_yylstype[
 -]b4_c_ansi_function_decl(b4_prefix[parse], [int], b4_parse_param)[
 +]b4_function_declare(b4_prefix[parse], [int], b4_parse_param)[
  ]b4_percent_code_get([[provides]])[]dnl
  ])
 -
 +])
  
  ## -------------- ##
  ## Output files.  ##
@@@ -196,14 -197,13 +196,14 @@@ b4_percent_code_get([[top]])
  #define yyparse ]b4_prefix[parse
  #define yylex   ]b4_prefix[lex
  #define yyerror ]b4_prefix[error
 +#define yydebug ]b4_prefix[debug
 +]]b4_pure_if([], [[
  #define yylval  ]b4_prefix[lval
  #define yychar  ]b4_prefix[char
 -#define yydebug ]b4_prefix[debug
  #define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
 -#define yylloc  ]b4_prefix[lloc]])])[
 +#define yylloc  ]b4_prefix[lloc]])]))[
  
 -/* Copy the first part of user declarations.  */
 +/* First part of user declarations.  */
  ]b4_user_pre_prologue[
  
  ]b4_null_define[
  # 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
  
  /* Default (constant) value used for initialization for null
@@@ -246,13 -246,16 +246,6 @@@ b4_percent_code_get[]dn
  # endif
  #endif
  
- /* Suppress unused-variable warnings by "using" E.  */
- #ifdef __GNUC__
- # define YYUSE(E) ((void) (E))
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
--#else
- # define YYUSE(E) /* empty */
 -]b4_c_function_def([YYID], [static int], [[int i], [i]])[
 -{
 -  return i;
 -}
--#endif
--
  #ifndef YYFREE
  # define YYFREE free
  #endif
  # define YYLONGJMP(Env, Val) (longjmp (Env, Val), YYASSERT (0))
  #endif
  
- /*-----------------.
- | GCC extensions.  |
- `-----------------*/
- #ifndef __attribute__
- /* This feature is available in gcc versions 2.5 and later.  */
- # if (! defined __GNUC__ || __GNUC__ < 2 \
-       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
- #  define __attribute__(Spec) /* empty */
- # endif
- #endif
+ ]b4_attribute_define[
  
  #ifndef YYASSERT
  # define YYASSERT(Condition) ((void) ((Condition) || (abort (), 0)))
@@@ -330,6 -323,19 +313,6 @@@ static const ]b4_int_type_for([b4_trans
  };
  
  #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[] =
  {
@@@ -346,10 -352,17 +329,10 @@@ static const char *const yytname[] 
  };
  #endif
  
 -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -static const ]b4_int_type_for([b4_r1])[ yyr1[] =
 -{
 -  ]b4_r1[
 -};
 +#define YYPACT_NINF ]b4_pact_ninf[
 +#define YYTABLE_NINF ]b4_table_ninf[
  
 -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -static const ]b4_int_type_for([b4_r2])[ yyr2[] =
 -{
 -  ]b4_r2[
 -};
 +]b4_parser_tables_define[
  
  /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none).  */
  static const ]b4_int_type_for([b4_dprec])[ yydprec[] =
@@@ -363,11 -376,41 +346,11 @@@ static const ]b4_int_type_for([b4_merge
    ]b4_merger[
  };
  
 -/* YYDEFACT[S] -- default reduction number in state S.  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[
 -};
 -
 -/* YYPDEFGOTO[NTERM-NUM].  */
 -static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
 -{
 -  ]b4_defgoto[
 -};
 -
 -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -   STATE-NUM.  */
 -#define YYPACT_NINF ]b4_pact_ninf[
 -static const ]b4_int_type_for([b4_pact])[ yypact[] =
 +/* YYIMMEDIATE[RULE-NUM] -- True iff rule #RULE-NUM is not to be deferred, as
 +   in the case of predicates.  */
 +static const yybool yyimmediate[] =
  {
 -  ]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[
 +  ]b4_immediate[
  };
  
  /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
@@@ -382,13 -425,25 +365,13 @@@ static const ]b4_int_type_for([b4_confl
  /* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by
     0, pointed into by YYCONFLP.  */
  ]dnl Do not use b4_int_type_for here, since there are places where
 -dnl pointers onto yyconfl are taken, which type is "short int *".
 +dnl pointers onto yyconfl are taken, whose type is "short int *".
  dnl We probably ought to introduce a type for confl.
  [static const short int yyconfl[] =
  {
    ]b4_conflicting_rules[
  };
  
 -static const ]b4_int_type_for([b4_check])[ yycheck[] =
 -{
 -  ]b4_check[
 -};
 -
 -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
 -   symbol of state STATE-NUM.  */
 -static const ]b4_int_type_for([b4_stos])[ yystos[] =
 -{
 -  ]b4_stos[
 -};
 -
  /* Error token number */
  #define YYTERROR 1
  
  ]b4_yylloc_default_define[
  # define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
  ]])[
 -]b4_yy_location_print_define[
 -
 -/* YYLEX -- calling `yylex' with the right arguments.  */
 -#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
  
  ]b4_pure_if(
  [
@@@ -423,12 -482,9 +406,12 @@@ static const int YYEMPTY = -2
  
  typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
  
 -#define YYCHK(YYE)                                                           \
 -   do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; }       \
 -   while (YYID (0))
 +#define YYCHK(YYE)                              \
 +  do {                                          \
 +    YYRESULTTAG yychk_flag = YYE;               \
 +    if (yychk_flag != yyok)                     \
 +      return yychk_flag;                        \
 +  } while (0)
  
  #if ]b4_api_PREFIX[DEBUG
  
  #  define YYFPRINTF fprintf
  # endif
  
 +]b4_yy_location_print_define[
 +
  # define YYDPRINTF(Args)                        \
 -do {                                            \
 -  if (yydebug)                                  \
 -    YYFPRINTF Args;                             \
 -} while (YYID (0))
 -
 -]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[
 -
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)          \
 -do {                                                            \
 -  if (yydebug)                                                  \
 -    {                                                           \
 -      YYFPRINTF (stderr, "%s ", Title);                         \
 -      yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
 -      YYFPRINTF (stderr, "\n");                                 \
 -    }                                                           \
 -} while (YYID (0))
 +  do {                                          \
 +    if (yydebug)                                \
 +      YYFPRINTF Args;                           \
 +  } while (0)
 +
 +]b4_yy_symbol_print_define[
 +
 +# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                  \
 +  do {                                                                  \
 +    if (yydebug)                                                        \
 +      {                                                                 \
 +        YYFPRINTF (stderr, "%s ", Title);                               \
 +        yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
 +        YYFPRINTF (stderr, "\n");                                       \
 +      }                                                                 \
 +  } while (0)
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
     multiple parsers can coexist.  */
  int yydebug;
  
 +struct yyGLRStack;
 +static void yypstack (struct yyGLRStack* yystackp, size_t yyk)
 +  __attribute__ ((__unused__));
 +static void yypdumpstack (struct yyGLRStack* yystackp)
 +  __attribute__ ((__unused__));
 +
  #else /* !]b4_api_PREFIX[DEBUG */
  
  # define YYDPRINTF(Args)
  #define YYHEADROOM 2
  
  #ifndef YYSTACKEXPANDABLE
 -# if (! 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))
  #  define YYSTACKEXPANDABLE 1
 -# else
 -#  define YYSTACKEXPANDABLE 0
 -# endif
  #endif
  
  #if YYSTACKEXPANDABLE
    do {                                                  \
      if (Yystack->yyspaceLeft < YYHEADROOM)              \
        yyexpandGLRStack (Yystack);                       \
 -  } while (YYID (0))
 +  } while (0)
  #else
  # define YY_RESERVE_GLRSTACK(Yystack)                   \
    do {                                                  \
      if (Yystack->yyspaceLeft < YYHEADROOM)              \
        yyMemoryExhausted (Yystack);                      \
 -  } while (YYID (0))
 +  } while (0)
  #endif
  
  
@@@ -594,7 -648,7 +577,7 @@@ typedef int yyStateNum
  typedef int yyRuleNum;
  
  /** Grammar symbol */
 -typedef short int yySymbol;
 +typedef int yySymbol;
  
  /** Item references, as in LALR(1) machine */
  typedef short int yyItemNum;
@@@ -615,7 -669,7 +598,7 @@@ struct yyGLRState 
    yyStateNum yylrState;
    /** Preceding state in this stack */
    yyGLRState* yypred;
 -  /** Source position of the first token produced by my symbol */
 +  /** Source position of the last token produced by my symbol */
    size_t yyposn;
    union {
      /** First in a chain of alternative reductions producing the
@@@ -727,16 -781,9 +710,16 @@@ yyfillin (yyGLRStackItem *yyvsp, int yy
    yyGLRState *s = yyvsp[yylow0].yystate.yypred;
    for (i = yylow0-1; i >= yylow1; i -= 1)
      {
 -      YYASSERT (s->yyresolved);
 -      yyvsp[i].yystate.yyresolved = yytrue;
 -      yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;]b4_locations_if([[
 +#if ]b4_api_PREFIX[DEBUG
 +      yyvsp[i].yystate.yylrState = s->yylrState;
 +#endif
 +      yyvsp[i].yystate.yyresolved = s->yyresolved;
 +      if (s->yyresolved)
 +        yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;
 +      else
 +        /* The effect of using yysval or yyloc (in an immediate rule) is
 +         * undefined.  */
 +        yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULL;]b4_locations_if([[
        yyvsp[i].yystate.yyloc = s->yyloc;]])[
        s = yyvsp[i].yystate.yypred = s->yypred;
      }
@@@ -763,17 -810,16 +746,17 @@@ yyfill (yyGLRStackItem *yyvsp, int *yyl
   *  value ($$), and yylocp points to place for location information
   *  (@@$).  Returns yyok for normal return, yyaccept for YYACCEPT,
   *  yyerr for YYERROR, yyabort for YYABORT.  */
 -/*ARGSUSED*/ static YYRESULTTAG
 -yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
 +static YYRESULTTAG
 +yyuserAction (yyRuleNum yyn, size_t yyrhslen, yyGLRStackItem* yyvsp,
                yyGLRStack* yystackp,
                YYSTYPE* yyvalp]b4_locuser_formals[)
  {
    yybool yynormal __attribute__ ((__unused__)) =
      (yystackp->yysplitPoint == YY_NULL);
    int yylow;
 -]b4_parse_param_use[]dnl
 -[# undef yyerrok
 +]b4_parse_param_use([yyvalp], [yylocp])dnl
 +[  YYUSE (yyrhslen);
 +# undef yyerrok
  # define yyerrok (yystackp->yyerrState = 0)
  # undef YYACCEPT
  # define YYACCEPT return yyaccept
  # undef yyclearin
  # undef YYRECOVERING
  }
 -\f
  
 -/*ARGSUSED*/ static void
 +
 +static void
  yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
  {
    YYUSE (yy0);
  
    switch (yyn)
      {
 -      ]b4_mergers[
 +]b4_mergers[
        default: break;
      }
  }
  
                                /* Bison grammar-table manipulation.  */
  
 -]b4_yydestruct_generate([b4_c_ansi_function_def])[
 +]b4_yydestruct_define[
  
  /** Number of symbols composing the right hand side of rule #RULE.  */
  static inline int
@@@ -875,7 -921,7 +858,7 @@@ yydestroyGLRState (char const *yymsg, y
      }
  }
  
 -/** Left-hand-side symbol for rule #RULE.  */
 +/** Left-hand-side symbol for rule #YYRULE.  */
  static inline yySymbol
  yylhsNonterm (yyRuleNum yyrule)
  {
  #define yypact_value_is_default(Yystate) \
    ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[
  
 -/** True iff LR state STATE has only a default reduction (regardless
 +/** True iff LR state YYSTATE has only a default reduction (regardless
   *  of token).  */
  static inline yybool
  yyisDefaultedState (yyStateNum yystate)
    return yypact_value_is_default (yypact[yystate]);
  }
  
 -/** The default reduction for STATE, assuming it has one.  */
 +/** The default reduction for YYSTATE, assuming it has one.  */
  static inline yyRuleNum
  yydefaultAction (yyStateNum yystate)
  {
   *    R < 0:  Reduce on rule -R.
   *    R = 0:  Error.
   *    R > 0:  Shift to state R.
 - *  Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of
 - *  conflicting reductions.
 + *  Set *YYCONFLICTS to a pointer into yyconfl to a 0-terminated list
 + *  of conflicting reductions.
   */
  static inline void
  yygetLRActions (yyStateNum yystate, int yytoken,
  static inline yyStateNum
  yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
  {
 -  int yyr;
 -  yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
 +  int yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
    if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
      return yytable[yyr];
    else
@@@ -958,10 -1005,9 +941,10 @@@ yyisErrorAction (int yyaction
  
                                  /* GLRStates */
  
 -/** Return a fresh GLRStackItem.  Callers should call
 - * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
 - * headroom.  */
 +/** Return a fresh GLRStackItem in YYSTACKP.  The item is an LR state
 + *  if YYISSTATE, and otherwise a semantic option.  Callers should call
 + *  YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
 + *  headroom.  */
  
  static inline yyGLRStackItem*
  yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState)
  }
  
  /** Add a new semantic action that will execute the action for rule
 - *  RULENUM on the semantic values in RHS to the list of
 - *  alternative actions for STATE.  Assumes that RHS comes from
 - *  stack #K of *STACKP. */
 + *  YYRULE on the semantic values in YYRHS to the list of
 + *  alternative actions for YYSTATE.  Assumes that YYRHS comes from
 + *  stack #YYK of *YYSTACKP. */
  static void
  yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate,
 -                     yyGLRState* rhs, yyRuleNum yyrule)
 +                     yyGLRState* yyrhs, yyRuleNum yyrule)
  {
    yySemanticOption* yynewOption =
      &yynewGLRStackItem (yystackp, yyfalse)->yyoption;
 -  yynewOption->yystate = rhs;
 +  yynewOption->yystate = yyrhs;
    yynewOption->yyrule = yyrule;
    if (yystackp->yytops.yylookaheadNeeds[yyk])
      {
  
                                  /* GLRStacks */
  
 -/** Initialize SET to a singleton set containing an empty stack.  */
 +/** Initialize YYSET to a singleton set containing an empty stack.  */
  static yybool
  yyinitStateSet (yyGLRStateSet* yyset)
  {
@@@ -1027,8 -1073,8 +1010,8 @@@ static void yyfreeStateSet (yyGLRStateS
    YYFREE (yyset->yylookaheadNeeds);
  }
  
 -/** Initialize STACK to a single empty stack, with total maximum
 - *  capacity for all stacks of SIZE.  */
 +/** Initialize *YYSTACKP to a single empty stack, with total maximum
 + *  capacity for all stacks of YYSIZE.  */
  static yybool
  yyinitGLRStack (yyGLRStack* yystackp, size_t yysize)
  {
  # define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
    &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE
  
 -/** If STACK is expandable, extend it.  WARNING: Pointers into the
 +/** If *YYSTACKP is expandable, extend it.  WARNING: Pointers into the
      stack from outside should be considered invalid after this call.
      We always expand when there are 1 or fewer items left AFTER an
      allocation, so that we can avoid having external pointers exist
@@@ -1120,9 -1166,9 +1103,9 @@@ yyfreeGLRStack (yyGLRStack* yystackp
    yyfreeStateSet (&yystackp->yytops);
  }
  
 -/** Assuming that S is a GLRState somewhere on STACK, update the
 - *  splitpoint of STACK, if needed, so that it is at least as deep as
 - *  S.  */
 +/** Assuming that YYS is a GLRState somewhere on *YYSTACKP, update the
 + *  splitpoint of *YYSTACKP, if needed, so that it is at least as deep as
 + *  YYS.  */
  static inline void
  yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys)
  {
      yystackp->yysplitPoint = yys;
  }
  
 -/** Invalidate stack #K in STACK.  */
 +/** Invalidate stack #YYK in *YYSTACKP.  */
  static inline void
  yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
  {
    yystackp->yytops.yystates[yyk] = YY_NULL;
  }
  
 -/** Undelete the last stack that was marked as deleted.  Can only be
 -    done once after a deletion, and only when all other stacks have
 +/** Undelete the last stack in *YYSTACKP that was marked as deleted.  Can
 +    only be done once after a deletion, and only when all other stacks have
      been deleted.  */
  static void
  yyundeleteLastStack (yyGLRStack* yystackp)
@@@ -1189,9 -1235,8 +1172,9 @@@ yyremoveDeletes (yyGLRStack* yystackp
      }
  }
  
 -/** Shift to a new state on stack #K of STACK, corresponding to LR state
 - * LRSTATE, at input position POSN, with (resolved) semantic value SVAL.  */
 +/** Shift to a new state on stack #YYK of *YYSTACKP, corresponding to LR
 + * state YYLRSTATE, at input position YYPOSN, with (resolved) semantic
 + * value *YYVALP and source location *YYLOCP.  */
  static inline void
  yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
              size_t yyposn,
    YY_RESERVE_GLRSTACK (yystackp);
  }
  
 -/** Shift stack #K of YYSTACK, to a new state corresponding to LR
 +/** Shift stack #YYK of *YYSTACKP, to a new state corresponding to LR
   *  state YYLRSTATE, at input position YYPOSN, with the (unresolved)
   *  semantic value of YYRHS under the action for YYRULE.  */
  static inline void
  yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
 -                 size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
 +                 size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule)
  {
    yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
  
    yystackp->yytops.yystates[yyk] = yynewState;
  
    /* Invokes YY_RESERVE_GLRSTACK.  */
 -  yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule);
 +  yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule);
  }
  
 -/** Pop the symbols consumed by reduction #RULE from the top of stack
 - *  #K of STACK, and perform the appropriate semantic action on their
 +#if !]b4_api_PREFIX[DEBUG
 +# define YY_REDUCE_PRINT(Args)
 +#else
 +# define YY_REDUCE_PRINT(Args)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print Args;               \
 +} while (0)
 +
 +/*----------------------------------------------------------------------.
 +| Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. |
 +`----------------------------------------------------------------------*/
 +
 +static inline void
 +yy_reduce_print (int yynormal, yyGLRStackItem* yyvsp, size_t yyk,
 +                 yyRuleNum yyrule]b4_user_formals[)
 +{
 +  int yynrhs = yyrhsLength (yyrule);]b4_locations_if([
 +  int yylow = 1;])[
 +  int yyi;
 +  YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
 +             (unsigned long int) yyk, yyrule - 1,
 +             (unsigned long int) yyrline[yyrule]);
 +  if (! yynormal)
 +    yyfillin (yyvsp, 1, -yynrhs);
 +  /* The symbols being reduced.  */
 +  for (yyi = 0; yyi < yynrhs; yyi++)
 +    {
 +      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 +      yy_symbol_print (stderr,
 +                       yystos[yyvsp[yyi - yynrhs + 1].yystate.yylrState],
 +                       &yyvsp[yyi - yynrhs + 1].yystate.yysemantics.yysval
 +                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 +                       b4_user_args[);
 +      if (!yyvsp[yyi - yynrhs + 1].yystate.yyresolved)
 +        YYFPRINTF (stderr, " (unresolved)");
 +      YYFPRINTF (stderr, "\n");
 +    }
 +}
 +#endif
 +
 +/** Pop the symbols consumed by reduction #YYRULE from the top of stack
 + *  #YYK of *YYSTACKP, and perform the appropriate semantic action on their
   *  semantic values.  Assumes that all ambiguities in semantic values
 - *  have been previously resolved.  Set *VALP to the resulting value,
 - *  and *LOCP to the computed location (if any).  Return value is as
 + *  have been previously resolved.  Set *YYVALP to the resulting value,
 + *  and *YYLOCP to the computed location (if any).  Return value is as
   *  for userAction.  */
  static inline YYRESULTTAG
  yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
    if (yystackp->yysplitPoint == YY_NULL)
      {
        /* Standard special case: single stack.  */
 -      yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
 +      yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
        YYASSERT (yyk == 0);
        yystackp->yynextFree -= yynrhs;
        yystackp->yyspaceLeft += yynrhs;
        yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate;
 -      return yyuserAction (yyrule, yynrhs, rhs, yystackp,
 +      YY_REDUCE_PRINT ((1, yyrhs, yyk, yyrule]b4_user_args[));
 +      return yyuserAction (yyrule, yynrhs, yyrhs, yystackp,
                             yyvalp]b4_locuser_args[);
      }
    else
      {
 -      /* At present, doAction is never called in nondeterministic
 -       * mode, so this branch is never taken.  It is here in
 -       * anticipation of a future feature that will allow immediate
 -       * evaluation of selected actions in nondeterministic mode.  */
        int yyi;
        yyGLRState* yys;
        yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
          }
        yyupdateSplit (yystackp, yys);
        yystackp->yytops.yystates[yyk] = yys;
 +      YY_REDUCE_PRINT ((0, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule]b4_user_args[));
        return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
                             yystackp, yyvalp]b4_locuser_args[);
      }
  }
  
 -#if !]b4_api_PREFIX[DEBUG
 -# define YY_REDUCE_PRINT(Args)
 -#else
 -# define YY_REDUCE_PRINT(Args)          \
 -do {                                    \
 -  if (yydebug)                          \
 -    yy_reduce_print Args;               \
 -} while (YYID (0))
 -
 -/*----------------------------------------------------------.
 -| Report that the RULE is going to be reduced on stack #K.  |
 -`----------------------------------------------------------*/
 -
 -/*ARGSUSED*/ static inline void
 -yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
 -                 YYSTYPE* yyvalp]b4_locuser_formals[)
 -{
 -  int yynrhs = yyrhsLength (yyrule);
 -  yybool yynormal __attribute__ ((__unused__)) =
 -    (yystackp->yysplitPoint == YY_NULL);
 -  yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
 -  int yylow = 1;
 -  int yyi;
 -  YYUSE (yyvalp);]b4_locations_if([
 -  YYUSE (yylocp);])[
 -]b4_parse_param_use[]dnl
 -[  YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
 -             (unsigned long int) yyk, yyrule - 1,
 -             (unsigned long int) yyrline[yyrule]);
 -  /* 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[);
 -      YYFPRINTF (stderr, "\n");
 -    }
 -}
 -#endif
 -
 -/** Pop items off stack #K of STACK according to grammar rule RULE,
 +/** Pop items off stack #YYK of *YYSTACKP according to grammar rule YYRULE,
   *  and push back on the resulting nonterminal symbol.  Perform the
 - *  semantic action associated with RULE and store its value with the
 - *  newly pushed state, if FORCEEVAL or if STACK is currently
 + *  semantic action associated with YYRULE and store its value with the
 + *  newly pushed state, if YYFORCEEVAL or if *YYSTACKP is currently
   *  unambiguous.  Otherwise, store the deferred semantic action with
   *  the new state.  If the new state would have an identical input
   *  position, LR state, and predecessor to an existing state on the stack,
 - *  it is identified with that existing state, eliminating stack #K from
 - *  the STACK.  In this case, the (necessarily deferred) semantic value is
 + *  it is identified with that existing state, eliminating stack #YYK from
 + *  *YYSTACKP.  In this case, the semantic value is
   *  added to the options for the existing state's semantic value.
   */
  static inline YYRESULTTAG
@@@ -1337,18 -1385,11 +1320,18 @@@ yyglrReduce (yyGLRStack* yystackp, size
  
    if (yyforceEval || yystackp->yysplitPoint == YY_NULL)
      {
 +      YYRESULTTAG yyflag;
        YYSTYPE yysval;]b4_locations_if([
        YYLTYPE yyloc;])[
  
 -      YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[));
 -      YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[));
 +      yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[);
 +      if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULL)
 +        {
 +          YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n",
 +                     (unsigned long int) yyk, yyrule - 1));
 +        }
 +      if (yyflag != yyok)
 +        return yyflag;
        YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc);
        yyglrShift (yystackp, yyk,
                    yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState,
        yyupdateSplit (yystackp, yys);
        yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule));
        YYDPRINTF ((stderr,
 -                  "Reduced stack %lu by rule #%d; action deferred.  Now in state %d.\n",
 +                  "Reduced stack %lu by rule #%d; action deferred.  "
 +                  "Now in state %d.\n",
                    (unsigned long int) yyk, yyrule - 1, yynewLRState));
        for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
          if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL)
@@@ -1443,7 -1483,7 +1426,7 @@@ yysplitStack (yyGLRStack* yystackp, siz
    return yystackp->yytops.yysize-1;
  }
  
 -/** True iff Y0 and Y1 represent identical options at the top level.
 +/** True iff YYY0 and YYY1 represent identical options at the top level.
   *  That is, they represent the same rule applied to RHS symbols
   *  that produce the same terminal symbols.  */
  static yybool
@@@ -1465,8 -1505,8 +1448,8 @@@ yyidenticalOptions (yySemanticOption* y
      return yyfalse;
  }
  
 -/** Assuming identicalOptions (Y0,Y1), destructively merge the
 - *  alternative semantic values for the RHS-symbols of Y1 and Y0.  */
 +/** Assuming identicalOptions (YYY0,YYY1), destructively merge the
 + *  alternative semantic values for the RHS-symbols of YYY1 and YYY0.  */
  static void
  yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1)
  {
          {
            yySemanticOption** yyz0p = &yys0->yysemantics.yyfirstVal;
            yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal;
 -          while (YYID (yytrue))
 +          while (yytrue)
              {
                if (yyz1 == *yyz0p || yyz1 == YY_NULL)
                  break;
@@@ -1545,11 -1585,11 +1528,11 @@@ static YYRESULTTAG yyresolveValue (yyGL
                                     yyGLRStack* yystackp]b4_user_formals[);
  
  
 -/** Resolve the previous N states starting at and including state S.  If result
 - *  != yyok, some states may have been left unresolved possibly with empty
 - *  semantic option chains.  Regardless of whether result = yyok, each state
 - *  has been left with consistent data so that yydestroyGLRState can be invoked
 - *  if necessary.  */
 +/** Resolve the previous YYN states starting at and including state YYS
 + *  on *YYSTACKP. If result != yyok, some states may have been left
 + *  unresolved possibly with empty semantic option chains.  Regardless
 + *  of whether result = yyok, each state has been left with consistent
 + *  data so that yydestroyGLRState can be invoked if necessary.  */
  static YYRESULTTAG
  yyresolveStates (yyGLRState* yys, int yyn,
                   yyGLRStack* yystackp]b4_user_formals[)
    return yyok;
  }
  
 -/** Resolve the states for the RHS of OPT, perform its user action, and return
 - *  the semantic value and location.  Regardless of whether result = yyok, all
 - *  RHS states have been destroyed (assuming the user action destroys all RHS
 +/** Resolve the states for the RHS of YYOPT on *YYSTACKP, perform its
 + *  user action, and return the semantic value and location in *YYVALP
 + *  and *YYLOCP.  Regardless of whether result = yyok, all RHS states
 + *  have been destroyed (assuming the user action destroys all RHS
   *  semantic values if invoked).  */
  static YYRESULTTAG
  yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp,
@@@ -1641,11 -1680,11 +1624,11 @@@ yyreportTree (yySemanticOption* yyx, in
          {
            if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
              YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
 -                       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]));
 +                       yytokenName (yystos[yystates[yyi]->yylrState]));
            else
              YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "",
 -                       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]),
 -                       (unsigned long int) (yystates[yyi - 1]->yyposn + 1),
 +                       yytokenName (yystos[yystates[yyi]->yylrState]),
 +                       (unsigned long int) (yystates[yyi-1]->yyposn + 1),
                         (unsigned long int) yystates[yyi]->yyposn);
          }
        else
  }
  #endif
  
 -/*ARGSUSED*/ static YYRESULTTAG
 +static YYRESULTTAG
  yyreportAmbiguity (yySemanticOption* yyx0,
                     yySemanticOption* yyx1]b4_pure_formals[)
  {
    return yyabort;
  }]b4_locations_if([[
  
 -/** Starting at and including state S1, resolve the location for each of the
 - *  previous N1 states that is unresolved.  The first semantic option of a state
 - *  is always chosen.  */
 +/** Resolve the locations for each of the YYN1 states in *YYSTACKP,
 + *  ending at YYS1.  Has no effect on previously resolved states.
 + *  The first semantic option of a state is always chosen.  */
  static void
  yyresolveLocations (yyGLRState* yys1, int yyn1,
                      yyGLRStack *yystackp]b4_user_formals[)
      }
  }]])[
  
 -/** Resolve the ambiguity represented in state S, perform the indicated
 - *  actions, and set the semantic value of S.  If result != yyok, the chain of
 - *  semantic options in S has been cleared instead or it has been left
 - *  unmodified except that redundant options may have been removed.  Regardless
 - *  of whether result = yyok, S has been left with consistent data so that
 +/** Resolve the ambiguity represented in state YYS in *YYSTACKP,
 + *  perform the indicated actions, and set the semantic value of YYS.
 + *  If result != yyok, the chain of semantic options in YYS has been
 + *  cleared instead or it has been left unmodified except that
 + *  redundant options may have been removed.  Regardless of whether
 + *  result = yyok, YYS has been left with consistent data so that
   *  yydestroyGLRState can be invoked if necessary.  */
  static YYRESULTTAG
  yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
@@@ -1873,6 -1911,10 +1856,6 @@@ static YYRESULTTA
  yyprocessOneStack (yyGLRStack* yystackp, size_t yyk,
                     size_t yyposn]b4_pure_formals[)
  {
 -  int yyaction;
 -  const short int* yyconflicts;
 -  yyRuleNum yyrule;
 -
    while (yystackp->yytops.yystates[yyk] != YY_NULL)
      {
        yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
  
        if (yyisDefaultedState (yystate))
          {
 -          yyrule = yydefaultAction (yystate);
 +          YYRESULTTAG yyflag;
 +          yyRuleNum yyrule = yydefaultAction (yystate);
            if (yyrule == 0)
              {
                YYDPRINTF ((stderr, "Stack %lu dies.\n",
                yymarkStackDeleted (yystackp, yyk);
                return yyok;
              }
 -          YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[));
 +          yyflag = yyglrReduce (yystackp, yyk, yyrule, yyimmediate[yyrule]]b4_user_args[);
 +          if (yyflag == yyerr)
 +            {
 +              YYDPRINTF ((stderr,
 +                          "Stack %lu dies "
 +                          "(predicate failure or explicit user error).\n",
 +                          (unsigned long int) yyk));
 +              yymarkStackDeleted (yystackp, yyk);
 +              return yyok;
 +            }
 +          if (yyflag != yyok)
 +            return yyflag;
          }
        else
          {
            yySymbol yytoken;
 +          int yyaction;
 +          const short int* yyconflicts;
 +
            yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
            if (yychar == YYEMPTY)
              {
                YYDPRINTF ((stderr, "Reading a token: "));
 -              yychar = YYLEX;
 +              yychar = ]b4_lex[;
              }
  
            if (yychar <= YYEOF)
  
            while (*yyconflicts != 0)
              {
 +              YYRESULTTAG yyflag;
                size_t yynewStack = yysplitStack (yystackp, yyk);
                YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n",
                            (unsigned long int) yynewStack,
                            (unsigned long int) yyk));
 -              YYCHK (yyglrReduce (yystackp, yynewStack,
 -                                  *yyconflicts, yyfalse]b4_user_args[));
 -              YYCHK (yyprocessOneStack (yystackp, yynewStack,
 -                                        yyposn]b4_pure_args[));
 +              yyflag = yyglrReduce (yystackp, yynewStack,
 +                                    *yyconflicts,
 +                                    yyimmediate[*yyconflicts]]b4_user_args[);
 +              if (yyflag == yyok)
 +                YYCHK (yyprocessOneStack (yystackp, yynewStack,
 +                                          yyposn]b4_pure_args[));
 +              else if (yyflag == yyerr)
 +                {
 +                  YYDPRINTF ((stderr, "Stack %lu dies.\n",
 +                              (unsigned long int) yynewStack));
 +                  yymarkStackDeleted (yystackp, yynewStack);
 +                }
 +              else
 +                return yyflag;
                yyconflicts += 1;
              }
  
                break;
              }
            else
 -            YYCHK (yyglrReduce (yystackp, yyk, -yyaction,
 -                                yyfalse]b4_user_args[));
 +            {
 +              YYRESULTTAG yyflag = yyglrReduce (yystackp, yyk, -yyaction,
 +                                                yyimmediate[-yyaction]]b4_user_args[);
 +              if (yyflag == yyerr)
 +                {
 +                  YYDPRINTF ((stderr,
 +                              "Stack %lu dies "
 +                              "(predicate failure or explicit user error).\n",
 +                              (unsigned long int) yyk));
 +                  yymarkStackDeleted (yystackp, yyk);
 +                  break;
 +                }
 +              else if (yyflag != yyok)
 +                return yyflag;
 +            }
          }
      }
    return yyok;
  }
  
 -/*ARGSUSED*/ static void
 +static void
  yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
  {
    if (yystackp->yyerrState != 0)
  /* Recover from a syntax error on *YYSTACKP, assuming that *YYSTACKP->YYTOKENP,
     yylval, and yylloc are the syntactic category, semantic value, and location
     of the lookahead.  */
 -/*ARGSUSED*/ static void
 +static void
  yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
  {
    size_t yyk;
    if (yystackp->yyerrState == 3)
      /* We just shifted the error token and (perhaps) took some
         reductions.  Skip tokens until we can proceed.  */
 -    while (YYID (yytrue))
 +    while (yytrue)
        {
          yySymbol yytoken;
          if (yychar == YYEOF)
                          yytoken, &yylval]b4_locuser_args([&yylloc])[);
            }
          YYDPRINTF ((stderr, "Reading a token: "));
 -        yychar = YYLEX;
 +        yychar = ]b4_lex[;
          if (yychar <= YYEOF)
            {
              yychar = yytoken = YYEOF;
      default:                                                                 \
        goto yybuglab;                                                         \
      }                                                                        \
 -  } while (YYID (0))
 -
 +  } while (0)
  
  /*----------.
  | yyparse.  |
  `----------*/
  
 -]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[
 +]b4_function_define([yyparse], [int], b4_parse_param)[
  {
    int yyresult;
    yyGLRStack yystack;
    yylloc = yyloc_default;])[
  ]m4_ifdef([b4_initial_action], [
  b4_dollar_pushdef([yylval], [], [yylloc])dnl
 -/* User initialization code.  */
 -b4_user_initial_action
 +  /* User initialization code.  */
 +  b4_user_initial_action
  b4_dollar_popdef])[]dnl
  [
    if (! yyinitGLRStack (yystackp, YYINITDEPTH))
    yyglrShift (&yystack, 0, 0, 0, &yylval]b4_locations_if([, &yylloc])[);
    yyposn = 0;
  
 -  while (YYID (yytrue))
 +  while (yytrue)
      {
        /* For efficiency, we have two loops, the first of which is
           specialized to deterministic operation (single stack, no
           potential ambiguity).  */
        /* Standard mode */
 -      while (YYID (yytrue))
 +      while (yytrue)
          {
            yyRuleNum yyrule;
            int yyaction;
                if (yychar == YYEMPTY)
                  {
                    YYDPRINTF ((stderr, "Reading a token: "));
 -                  yychar = YYLEX;
 +                  yychar = ]b4_lex[;
                  }
  
                if (yychar <= YYEOF)
              }
          }
  
 -      while (YYID (yytrue))
 +      while (yytrue)
          {
            yySymbol yytoken_to_shift;
            size_t yys;
        yyfreeGLRStack (&yystack);
      }
  
 -  /* Make sure YYID is used.  */
 -  return YYID (yyresult);
 +  return yyresult;
  }
  
  /* DEBUGGING ONLY */
  #if ]b4_api_PREFIX[DEBUG
 -static void yypstack (yyGLRStack* yystackp, size_t yyk)
 -  __attribute__ ((__unused__));
 -static void yypdumpstack (yyGLRStack* yystackp) __attribute__ ((__unused__));
 -
  static void
  yy_yypstack (yyGLRState* yys)
  {
@@@ -2546,23 -2555,6 +2529,23 @@@ yypdumpstack (yyGLRStack* yystackp
    YYFPRINTF (stderr, "\n");
  }
  #endif
 +
 +#undef yylval
 +#undef yychar
 +#undef yynerrs]b4_locations_if([
 +#undef yylloc])
 +
 +m4_if(b4_prefix, [yy], [],
 +[[/* Substitute the variable and function names.  */
 +#define yyparse ]b4_prefix[parse
 +#define yylex   ]b4_prefix[lex
 +#define yyerror ]b4_prefix[error
 +#define yylval  ]b4_prefix[lval
 +#define yychar  ]b4_prefix[char
 +#define yydebug ]b4_prefix[debug
 +#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
 +#define yylloc  ]b4_prefix[lloc]])])[
 +
  ]b4_epilogue[]dnl
  b4_output_end()
  
diff --combined data/glr.cc
index 0164eda6b439c5ddde10e82bac75b6342f4c32c9,bb0234a7c51eb8270ac0a80bbc47e743824e6c68..e57308bd82514cbebe68a6457acf4fd7b0d6bb5b
@@@ -1,3 -1,5 +1,3 @@@
 -                                                                    -*- C -*-
 -
  # C++ GLR skeleton for Bison
  
  # Copyright (C) 2002-2013 Free Software Foundation, Inc.
@@@ -27,7 -29,7 +27,7 @@@
  #
  #   The additional arguments are stored as members of the parser
  #   object, yyparser.  The C routines need to carry yyparser
 -#   throughout the C parser; that easy: just let yyparser become an
 +#   throughout the C parser; that's easy: make yyparser an
  #   additional parse-param.  But because the C++ skeleton needs to
  #   know the "real" original parse-param, we save them
  #   (b4_parse_param_orig).  Note that b4_parse_param is overquoted
  # The locations
  #
  #   We use location.cc just like lalr1.cc, but because glr.c stores
 -#   the locations in a (C++) union, the position and location classes
 +#   the locations in a union, the position and location classes
  #   must not have a constructor.  Therefore, contrary to lalr1.cc, we
  #   must not define "b4_location_constructors".  As a consequence the
  #   user must initialize the first positions (in particular the
  #   filename member).
  
 -# We require a pure interface using locations.
 -m4_define([b4_locations_flag], [1])
 +# We require a pure interface.
  m4_define([b4_pure_flag],      [1])
  
 -# The header is mandatory.
 -b4_defines_if([],
 -              [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
 -
  m4_include(b4_pkgdatadir/[c++.m4])
 -b4_percent_define_ifdef([[api.location.type]], [],
 -                        [m4_include(b4_pkgdatadir/[location.cc])])
 +b4_bison_locations_if([m4_include(b4_pkgdatadir/[location.cc])])
  
  m4_define([b4_parser_class_name],
            [b4_percent_define_get([[parser_class_name]])])
  # Save the parse parameters.
  m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
  
 +# b4_parse_param_wrap
 +# -------------------
 +# New ones.
 +m4_ifset([b4_parse_param],
 +[m4_define([b4_parse_param_wrap],
 +           [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],]
 +m4_defn([b4_parse_param]))],
 +[m4_define([b4_parse_param_wrap],
 +           [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]])
 +])
 +
  
 -# b4_yy_symbol_print_generate
 -# ---------------------------
 +# b4_yy_symbol_print_define
 +# -------------------------
  # Bypass the default implementation to generate the "yy_symbol_print"
  # and "yy_symbol_value_print" functions.
 -m4_define([b4_yy_symbol_print_generate],
 +m4_define([b4_yy_symbol_print_define],
  [[
  /*--------------------.
  | Print this symbol.  |
  `--------------------*/
  
 -]b4_c_ansi_function_def([yy_symbol_print],
 +]b4_function_define([yy_symbol_print],
      [static void],
 -    [[FILE *],               []],
 -    [[int yytype],           [yytype]],
 +    [[FILE *],      []],
 +    [[int yytype],  [yytype]],
      [[const ]b4_namespace_ref::b4_parser_class_name[::semantic_type *yyvaluep],
 -                             [yyvaluep]],
 +                    [yyvaluep]][]dnl
 +b4_locations_if([,
      [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
 -                             [yylocationp]],
 +                    [yylocationp]]]),
      b4_parse_param)[
  {
  ]b4_parse_param_use[]dnl
  ]])[
  
  # Hijack the initial action to initialize the locations.
 -]b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [],
 -[m4_define([b4_initial_action],
 +]b4_bison_locations_if([m4_define([b4_initial_action],
  [yylloc.initialize ();]m4_ifdef([b4_initial_action], [
 -m4_defn([b4_initial_action])]))])])[
 +m4_defn([b4_initial_action])]))])[
  
  # Hijack the post prologue to insert early definition of YYLLOC_DEFAULT
  # and declaration of yyerror.
  [b4_syncline([@oline@], [@ofile@])[
  ]b4_yylloc_default_define[
  #define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
 -]b4_c_ansi_function_decl([yyerror],
 -    [static void],
 +]b4_function_declare([yyerror],
 +    [static void],b4_locations_if([
      [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
 -                        [yylocationp]],
 +                        [yylocationp]],])
      b4_parse_param,
      [[const char* msg], [msg]])])
  
  
 +#undef yynerrs
 +#undef yychar
 +#undef yylval]b4_locations_if([
 +#undef yylloc])
 +
 +m4_if(b4_prefix, [yy], [],
 +[[/* Substitute the variable and function names.  */
 +#define yyparse ]b4_prefix[parse
 +#define yylex   ]b4_prefix[lex
 +#define yyerror ]b4_prefix[error
 +#define yydebug ]b4_prefix[debug
 +]]b4_pure_if([], [[
 +#define yylval  ]b4_prefix[lval
 +#define yychar  ]b4_prefix[char
 +#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
 +#define yylloc  ]b4_prefix[lloc]])]))
 +
  # Hijack the epilogue to define implementations (yyerror, parser member
  # functions etc.).
  m4_append([b4_epilogue],
  [b4_syncline([@oline@], [@ofile@])[
 +
  /*------------------.
  | Report an error.  |
  `------------------*/
  
 -]b4_c_ansi_function_def([yyerror],
 -    [static void],
 +]b4_function_define([yyerror],
 +    [static void],b4_locations_if([
      [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp],
 -                        [yylocationp]],
 +                        [yylocationp]],])
      b4_parse_param,
      [[const char* msg], [msg]])[
  {
  ]b4_parse_param_use[]dnl
 -[  yyparser.error (*yylocationp, msg);
 +[  yyparser.error (]b4_locations_if([[*yylocationp, ]])[msg);
  }
  
  
  ]b4_namespace_open[
 -]dnl In this section, the parse param are the original parse_params.
 +]dnl In this section, the parse params are the original parse_params.
  m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
  [  /// Build a parser object.
    ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
      :])[
  #if ]b4_api_PREFIX[DEBUG
 -    ]m4_ifset([b4_parse_param], [  ], [ :])[
 -      yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
 +    ]m4_ifset([b4_parse_param], [  ], [ :])[yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
  #endif]b4_parse_param_cons[
    {
    }
  
    inline void
    ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
 -                           const semantic_type* yyvaluep,
 -                           const location_type* yylocationp)
 -  {
 -    YYUSE (yylocationp);
 +                           const semantic_type* yyvaluep]b4_locations_if([[,
 +                           const location_type* yylocationp]])[)
 +  {]b4_locations_if([[
 +    YYUSE (yylocationp);]])[
      YYUSE (yyvaluep);
      std::ostream& yyoutput = debug_stream ();
      std::ostream& yyo = yyoutput;
      YYUSE (yyo);
-     switch (yytype)
-       {
- ]b4_symbol_foreach([b4_symbol_printer])dnl
- [        default:
-           break;
-       }
 -    ]b4_symbol_actions([printers])[
++    ]b4_symbol_actions([printer])[
    }
  
  
    void
    ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
 -                           const semantic_type* yyvaluep,
 -                           const location_type* yylocationp)
 +                           const semantic_type* yyvaluep]b4_locations_if([[,
 +                           const location_type* yylocationp]])[)
    {
      *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
 -               << ' ' << yytname[yytype] << " ("
 -               << *yylocationp << ": ";
 -    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
 +               << ' ' << yytname[yytype] << " ("]b4_locations_if([[
 +               << *yylocationp << ": "]])[;
 +    yy_symbol_value_print_ (yytype, yyvaluep]b4_locations_if([[, yylocationp]])[);
      *yycdebug_ << ')';
    }
  
  b4_namespace_close
  ])
  
 +# b4_shared_declarations
 +# ----------------------
 +# Declaration that might either go into the header (if --defines)
 +# or open coded in the parser body.
 +m4_define([b4_shared_declarations],
 +[m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
 +b4_percent_code_get([[requires]])[
  
 -# Let glr.c believe that the user arguments include the parser itself.
 -m4_ifset([b4_parse_param],
 -[m4_pushdef([b4_parse_param],
 -            [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],]
 -m4_defn([b4_parse_param]))],
 -[m4_pushdef([b4_parse_param],
 -            [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]])
 -])
 -m4_include(b4_pkgdatadir/[glr.c])
 -m4_popdef([b4_parse_param])
 -
 -b4_output_begin([b4_spec_defines_file])
 -b4_copyright([Skeleton interface for Bison GLR parsers in C++],
 -             [2002-2006, 2009-2013])[
 -
 -/* C++ GLR parser skeleton written by Akim Demaille.  */
 -
 -]b4_cpp_guard_open([b4_spec_defines_file])[
 -
 -]b4_percent_code_get([[requires]])[
 -
 -# include <string>
 -# include <iostream>
 -]b4_percent_define_ifdef([[api.location.type]], [],
 -                         [[# include "location.hh"]])[
 +#include <stdexcept>
 +#include <string>
 +#include <iostream>]b4_defines_if([
 +b4_bison_locations_if([[#include "location.hh"]])])[
  
  ]b4_YYDEBUG_define[
  
  ]b4_namespace_open[
 +]b4_defines_if([],
 +[b4_bison_locations_if([b4_position_define
 +b4_location_define])])[
 +
    /// A Bison parser.
    class ]b4_parser_class_name[
    {
    public:
 -    /// Symbol semantic values.
 -# ifndef ]b4_api_PREFIX[STYPE
 -]m4_ifdef([b4_stype],
 -[    union semantic_type
 -    {
 -b4_user_stype
 -    };],
 -[m4_if(b4_tag_seen_flag, 0,
 -[[    typedef int semantic_type;]],
 -[[    typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[
 -# else
 -    typedef ]b4_api_PREFIX[STYPE semantic_type;
 -# endif
 -    /// Symbol locations.
 -    typedef ]b4_percent_define_get([[api.location.type]],
 -                                   [[location]])[ location_type;
 -    /// Tokens.
 -    struct token
 -    {
 -      ]b4_token_enums(b4_tokens)[
 -    };
 -    /// Token type.
 -    typedef token::yytokentype token_type;
 +]b4_public_types_declare[
  
      /// Build a parser object.
      ]b4_parser_class_name[ (]b4_parse_param_decl[);
      /// Set the current debugging level.
      void set_debug_level (debug_level_type l);
  
 -  private:
 -
    public:
 -    /// Report a syntax error.
 -    /// \param loc    where the syntax error is found.
 +    /// Report a syntax error.]b4_locations_if([[
 +    /// \param loc    where the syntax error is found.]])[
      /// \param msg    a description of the syntax error.
 -    virtual void error (const location_type& loc, const std::string& msg);
 -  private:
 +    virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
  
  # if ]b4_api_PREFIX[DEBUG
    public:
      /// \brief Report a symbol value on the debug stream.
      /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 +    /// \param yyvaluep     Its semantic value.]b4_locations_if([[
 +    /// \param yylocationp  Its location.]])[
      virtual void yy_symbol_value_print_ (int yytype,
 -                                         const semantic_type* yyvaluep,
 -                                         const location_type* yylocationp);
 +                                         const semantic_type* yyvaluep]b4_locations_if([[,
 +                                         const location_type* yylocationp]])[);
      /// \brief Report a symbol on the debug stream.
      /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 +    /// \param yyvaluep     Its semantic value.]b4_locations_if([[
 +    /// \param yylocationp  Its location.]])[
      virtual void yy_symbol_print_ (int yytype,
 -                                   const semantic_type* yyvaluep,
 -                                   const location_type* yylocationp);
 +                                   const semantic_type* yyvaluep]b4_locations_if([[,
 +                                   const location_type* yylocationp]])[);
    private:
 -    /* Debugging.  */
 +    // Debugging.
      std::ostream* yycdebug_;
 -# endif
 +#endif
  
  ]b4_parse_param_vars[
    };
  
  ]dnl Redirections for glr.c.
  b4_percent_define_flag_if([[global_tokens_and_yystype]],
 -[b4_token_defines(b4_tokens)])
 +[b4_token_defines])
  [
  #ifndef ]b4_api_PREFIX[STYPE
  # define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class_name[::semantic_type
  
  ]b4_namespace_close[
  ]b4_percent_code_get([[provides]])[
 +]m4_popdef([b4_parse_param])dnl
 +])
 +
 +b4_defines_if(
 +[b4_output_begin([b4_spec_defines_file])
 +b4_copyright([Skeleton interface for Bison GLR parsers in C++],
 +             [2002-2013])[
 +
 +// C++ GLR parser skeleton written by Akim Demaille.
 +
 +]b4_cpp_guard_open([b4_spec_defines_file])[
 +]b4_shared_declarations[
  ]b4_cpp_guard_close([b4_spec_defines_file])[
 -]b4_output_end()
 +]b4_output_end()])
 +
 +# Let glr.c (and b4_shared_declarations) believe that the user
 +# arguments include the parser itself.
 +m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_wrap]))
 +m4_include(b4_pkgdatadir/[glr.c])
 +m4_popdef([b4_parse_param])
diff --combined data/lalr1.cc
index 4eec878abdf9295ec477cf39b6430800803637fb,f6568695bc95473c219b1bf92b361f70a8acadf1..3294f591106d6cbe53c80c32241e1632990861b9
  
  m4_include(b4_pkgdatadir/[c++.m4])
  
 -m4_define([b4_parser_class_name],
 -          [b4_percent_define_get([[parser_class_name]])])
 +# api.value.type=variant is valid.
 +m4_define([b4_value_type_setup_variant])
 +
 +# b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
 +# --------------------------------------------------------------
 +# Declare "parser::yy<TABLE-NAME>_" whose contents is CONTENT.
 +m4_define([b4_integral_parser_table_declare],
 +[m4_ifval([$3], [b4_comment([$3], [  ])
 +])dnl
 +  static const b4_int_type_for([$2]) yy$1_[[]];dnl
 +])
  
 -# The header is mandatory.
 -b4_defines_if([],
 -              [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
 +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
 +# -------------------------------------------------------------
 +# Define "parser::yy<TABLE-NAME>_" whose contents is CONTENT.
 +m4_define([b4_integral_parser_table_define],
 +[  const b4_int_type_for([$2])
 +  b4_parser_class_name::yy$1_[[]] =
 +  {
 +  $2
 +  };dnl
 +])
  
 -b4_percent_define_ifdef([[api.location.type]], [],
 -  [# Backward compatibility.
 -  m4_define([b4_location_constructors])
 -  m4_include(b4_pkgdatadir/[location.cc])])
 -m4_include(b4_pkgdatadir/[stack.hh])
 +# b4_symbol_value_template(VAL, [TYPE])
 +# -------------------------------------
 +# Same as b4_symbol_value, but used in a template method.  It makes
 +# a difference when using variants.  Note that b4_value_type_setup_union
 +# overrides b4_symbol_value, so we must override it again.
 +m4_copy([b4_symbol_value], [b4_symbol_value_template])
 +m4_append([b4_value_type_setup_union],
 +          [m4_copy_force([b4_symbol_value_union], [b4_symbol_value_template])])
 +
 +# b4_lhs_value([TYPE])
 +# --------------------
 +# Expansion of $<TYPE>$.
 +m4_define([b4_lhs_value],
 +          [b4_symbol_value([yylhs.value], [$1])])
 +
 +
 +# b4_lhs_location()
 +# -----------------
 +# Expansion of @$.
 +m4_define([b4_lhs_location],
 +          [yylhs.location])
 +
 +
 +# b4_rhs_data(RULE-LENGTH, NUM)
 +# -----------------------------
 +# Return the data corresponding to the symbol #NUM, where the current
 +# rule has RULE-LENGTH symbols on RHS.
 +m4_define([b4_rhs_data],
 +          [yystack_@{b4_subtract($@)@}])
 +
 +
 +# b4_rhs_state(RULE-LENGTH, NUM)
 +# ------------------------------
 +# The state corresponding to the symbol #NUM, where the current
 +# rule has RULE-LENGTH symbols on RHS.
 +m4_define([b4_rhs_state],
 +          [b4_rhs_data([$1], [$2]).state])
 +
 +
 +# 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],
 +          [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])])
 +
 +
 +# b4_rhs_location(RULE-LENGTH, NUM)
 +# ---------------------------------
 +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
 +# on RHS.
 +m4_define([b4_rhs_location],
 +          [b4_rhs_data([$1], [$2]).location])
 +
 +
 +# b4_symbol_action(SYMBOL-NUM, KIND)
 +# ----------------------------------
 +# Run the action KIND (destructor or printer) for SYMBOL-NUM.
 +# Same as in C, but using references instead of pointers.
 +m4_define([b4_symbol_action],
 +[b4_symbol_if([$1], [has_$2],
 +[m4_pushdef([b4_symbol_value], m4_defn([b4_symbol_value_template]))[]dnl
 +b4_dollar_pushdef([yysym.value],
 +                   b4_symbol_if([$1], [has_type],
 +                                [m4_dquote(b4_symbol([$1], [type]))]),
 +                   [yysym.location])dnl
 +      b4_symbol_case_([$1])
 +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
 +        b4_symbol([$1], [$2])
 +b4_syncline([@oline@], [@ofile@])
 +        break;
  
 -b4_defines_if(
 -[b4_output_begin([b4_spec_defines_file])
 -b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
 -             [2002-2013])
 -[
 -/**
 - ** \file ]b4_spec_defines_file[
 - ** Define the ]b4_namespace_ref[::parser class.
 - */
 +m4_popdef([b4_symbol_value])[]dnl
 +b4_dollar_popdef[]dnl
 +])])
  
 -/* C++ LALR(1) parser skeleton written by Akim Demaille.  */
  
 -]b4_cpp_guard_open([b4_spec_defines_file])[
 +# b4_lex
 +# ------
 +# Call yylex.
 +m4_define([b4_lex],
 +[b4_token_ctor_if(
 +[b4_function_call([yylex],
 +                  [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))],
 +[b4_function_call([yylex], [int],
 +                  [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
 +b4_locations_if([, [[location*], [&yyla.location]]])dnl
 +m4_ifdef([b4_lex_param], [, ]b4_lex_param))])])
  
 -]b4_percent_code_get([[requires]])[
  
 -#include <string>
 -#include <iostream>
 -#include "stack.hh"
 -]b4_percent_define_ifdef([[api.location.type]], [],
 -                         [[#include "location.hh"]])[
 +m4_pushdef([b4_copyright_years],
 +           [2002-2013])
 +
 +m4_define([b4_parser_class_name],
 +          [b4_percent_define_get([[parser_class_name]])])
 +
 +b4_bison_locations_if([# Backward compatibility.
 +   m4_define([b4_location_constructors])
 +   m4_include(b4_pkgdatadir/[location.cc])])
 +m4_include(b4_pkgdatadir/[stack.hh])
 +b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
 +
 +# b4_shared_declarations
 +# ----------------------
 +# Declaration that might either go into the header (if --defines)
 +# or open coded in the parser body.
 +m4_define([b4_shared_declarations],
 +[b4_percent_code_get([[requires]])[
 +]b4_parse_assert_if([# include <cassert>])[
 +# include <vector>
 +# include <iostream>
 +# include <stdexcept>
 +# include <string>]b4_defines_if([[
 +# include "stack.hh"
 +]b4_bison_locations_if([[# include "location.hh"]])])[
 +]b4_variant_if([b4_variant_includes])[
  
  ]b4_YYDEBUG_define[
  
  ]b4_namespace_open[
  
 +]b4_defines_if([],
 +[b4_stack_define
 +b4_bison_locations_if([b4_position_define
 +b4_location_define])])[
 +
 +]b4_variant_if([b4_variant_define])[
 +
    /// A Bison parser.
    class ]b4_parser_class_name[
    {
    public:
 -    /// Symbol semantic values.
 -#ifndef ]b4_api_PREFIX[STYPE
 -]m4_ifdef([b4_stype],
 -[    union semantic_type
 -    {
 -b4_user_stype
 -    };],
 -[m4_if(b4_tag_seen_flag, 0,
 -[[    typedef int semantic_type;]],
 -[[    typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[
 -#else
 -    typedef ]b4_api_PREFIX[STYPE semantic_type;
 -#endif
 -    /// Symbol locations.
 -    typedef ]b4_percent_define_get([[api.location.type]],
 -                                   [[location]])[ location_type;
 -    /// Tokens.
 -    struct token
 -    {
 -      ]b4_token_enums(b4_tokens)[
 -    };
 -    /// Token type.
 -    typedef token::yytokentype token_type;
 -
 +]b4_public_types_declare[
      /// Build a parser object.
      ]b4_parser_class_name[ (]b4_parse_param_decl[);
      virtual ~]b4_parser_class_name[ ();
      void set_debug_level (debug_level_type l);
  #endif
  
 +    /// Report a syntax error.]b4_locations_if([[
 +    /// \param loc    where the syntax error is found.]])[
 +    /// \param msg    a description of the syntax error.
 +    virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
 +
 +    /// Report a syntax error.
 +    void error (const syntax_error& err);
 +
    private:
 -    /// Report a syntax error.
 -    /// \param loc    where the syntax error is found.
 -    /// \param msg    a description of the syntax error.
 -    virtual void error (const location_type& loc, const std::string& msg);
+     /// This class is not copyable.
+     ]b4_parser_class_name[ (const ]b4_parser_class_name[&);
+     ]b4_parser_class_name[& operator= (const ]b4_parser_class_name[&);
 +    /// State numbers.
 +    typedef int state_type;
  
      /// Generate an error message.
 -    /// \param state   the state where the error occurred.
 -    /// \param tok     the lookahead token.
 -    virtual std::string yysyntax_error_ (int yystate, int tok);
 +    /// \param yystate   the state where the error occurred.
 +    /// \param yytoken   the lookahead token type, or yyempty_.
 +    virtual std::string yysyntax_error_ (state_type yystate,
 +                                         symbol_number_type yytoken) const;
  
 -#if ]b4_api_PREFIX[DEBUG
 -    /// \brief Report a symbol value on the debug stream.
 -    /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    virtual void yy_symbol_value_print_ (int yytype,
 -                                       const semantic_type* yyvaluep,
 -                                       const location_type* yylocationp);
 -    /// \brief Report a symbol on the debug stream.
 -    /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    virtual void yy_symbol_print_ (int yytype,
 -                                 const semantic_type* yyvaluep,
 -                                 const location_type* yylocationp);
 -#endif
 -
 -
 -    /// State numbers.
 -    typedef int state_type;
 -    /// State stack type.
 -    typedef stack<state_type>    state_stack_type;
 -    /// Semantic value stack type.
 -    typedef stack<semantic_type> semantic_stack_type;
 -    /// location stack type.
 -    typedef stack<location_type> location_stack_type;
 -
 -    /// The state stack.
 -    state_stack_type yystate_stack_;
 -    /// The semantic value stack.
 -    semantic_stack_type yysemantic_stack_;
 -    /// The location stack.
 -    location_stack_type yylocation_stack_;
 +    /// Compute post-reduction state.
 +    /// \param yystate   the current state
 +    /// \param yylhs     the nonterminal to push on the stack
 +    state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
  
      /// Whether the given \c yypact_ value indicates a defaulted state.
      /// \param yyvalue   the value to check
      /// \param yyvalue   the value to check
      static bool yy_table_value_is_error_ (int yyvalue);
  
 -    /// Internal symbol numbers.
 -    typedef ]b4_int_type_for([b4_translate])[ token_number_type;
 -    /* Tables.  */
 -    /// For a state, the index in \a yytable_ of its portion.
 -    static const ]b4_int_type_for([b4_pact])[ yypact_[];
      static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
 -
 -    /// For a state, default reduction number.
 -    /// Unless\a  yytable_ specifies something else to do.
 -    /// Zero means the default is an error.
 -    static const ]b4_int_type_for([b4_defact])[ yydefact_[];
 -
 -    static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
 -    static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
 -
 -    /// What to do in a state.
 -    /// \a yytable_[yypact_[s]]: what to do in state \a s.
 -    /// - if positive, shift that token.
 -    /// - if negative, reduce the rule which number is the opposite.
 -    /// - if zero, do what YYDEFACT says.
 -    static const ]b4_int_type_for([b4_table])[ yytable_[];
      static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
  
 -    static const ]b4_int_type_for([b4_check])[ yycheck_[];
 -
 -    /// For a state, its accessing symbol.
 -    static const ]b4_int_type_for([b4_stos])[ yystos_[];
 +    /// Convert a scanner token number \a t to a symbol number.
 +    static token_number_type yytranslate_ (]b4_token_ctor_if([token_type], [int])[ t);
  
 -    /// For a rule, its LHS.
 -    static const ]b4_int_type_for([b4_r1])[ yyr1_[];
 -    /// For a rule, its RHS length.
 -    static const ]b4_int_type_for([b4_r2])[ yyr2_[]; ]b4_error_verbose_if([
 +    // Tables.
 +]b4_parser_tables_declare[]b4_error_verbose_if([
  
      /// Convert the symbol name \a n to a form suitable for a diagnostic.
      static std::string yytnamerr_ (const char *n);])[
      /// For a symbol, its name in clear.
      static const char* const yytname_[];
  ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
 -    /// A type to store symbol numbers and -1.
 -    typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
 -    /// A `-1'-separated list of the rules' RHS.
 -    static const rhs_number_type yyrhs_[];
 -    /// For each rule, the index of the first RHS symbol in \a yyrhs_.
 -    static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];
 -    /// For each rule, its source line number.
 -    static const ]b4_int_type_for([b4_rline])[ yyrline_[];
 -    /// For each scanner token number, its symbol number.
 -    static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
 +]b4_integral_parser_table_declare([rline], [b4_rline],
 +     [[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
      /// Report on the debug stream that the rule \a r is going to be reduced.
      virtual void yy_reduce_print_ (int r);
      /// Print the state stack on the debug stream.
      virtual void yystack_print_ ();
  
 -    /* Debugging.  */
 +    // Debugging.
      int yydebug_;
      std::ostream* yycdebug_;
 -#endif
  
 -    /// Convert a scanner token number \a t to a symbol number.
 -    token_number_type yytranslate_ (int t);
 +    /// \brief Display a symbol type, value and location.
 +    /// \param yyo    The output stream.
 +    /// \param yysym  The symbol.
 +    template <typename Base>
 +    void yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const;
 +#endif
  
      /// \brief Reclaim the memory associated to a symbol.
 -    /// \param yymsg        Why this token is reclaimed.
 -    ///                     If null, do not display the symbol, just free it.
 -    /// \param yytype       The symbol type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    inline void yydestruct_ (const char* yymsg,
 -                           int yytype,
 -                           semantic_type* yyvaluep,
 -                           location_type* yylocationp);
 +    /// \param yymsg     Why this token is reclaimed.
 +    ///                  If null, print nothing.
 +    /// \param s         The symbol.
 +    template <typename Base>
 +    void yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const;
 +
 +  private:
 +    /// Type access provider for state based symbols.
 +    struct by_state
 +    {
 +      /// Default constructor.
 +      by_state ();
 +
 +      /// The symbol type as needed by the constructor.
 +      typedef state_type kind_type;
 +
 +      /// Constructor.
 +      by_state (kind_type s);
 +
 +      /// Copy constructor.
 +      by_state (const by_state& other);
 +
 +      /// Steal the symbol type from \a that.
 +      void move (by_state& that);
 +
 +      /// The (internal) type number (corresponding to \a state).
 +      /// "empty" when empty.
 +      symbol_number_type type_get () const;
 +
 +      enum { empty = 0 };
 +
 +      /// The state.
 +      state_type state;
 +    };
 +
 +    /// "Internal" symbol: element of the stack.
 +    struct stack_symbol_type : basic_symbol<by_state>
 +    {
 +      /// Superclass.
 +      typedef basic_symbol<by_state> super_type;
 +      /// Construct an empty symbol.
 +      stack_symbol_type ();
 +      /// Steal the contents from \a sym to build this.
 +      stack_symbol_type (state_type s, symbol_type& sym);
 +      /// Assignment, needed by push_back.
 +      stack_symbol_type& operator= (const stack_symbol_type& that);
 +    };
 +
 +    /// Stack type.
 +    typedef stack<stack_symbol_type> stack_type;
 +
 +    /// The stack.
 +    stack_type yystack_;
 +
 +    /// Push a new state on the stack.
 +    /// \param m    a debug message to display
 +    ///             if null, no trace is output.
 +    /// \param s    the symbol
 +    /// \warning the contents of \a s.value is stolen.
 +    void yypush_ (const char* m, stack_symbol_type& s);
 +
 +    /// Push a new look ahead token on the state on the stack.
 +    /// \param m    a debug message to display
 +    ///             if null, no trace is output.
 +    /// \param s    the state
 +    /// \param sym  the symbol (for its value and location).
 +    /// \warning the contents of \a s.value is stolen.
 +    void yypush_ (const char* m, state_type s, symbol_type& sym);
  
      /// Pop \a n symbols the three stacks.
 -    inline void yypop_ (unsigned int n = 1);
 -
 -    /* Constants.  */
 -    static const int yyeof_;
 -    /* LAST_ -- Last index in TABLE_.  */
 -    static const int yylast_;
 -    static const int yynnts_;
 -    static const int yyempty_;
 -    static const int yyfinal_;
 -    static const int yyterror_;
 -    static const int yyerrcode_;
 -    static const int yyntokens_;
 -    static const unsigned int yyuser_token_number_max_;
 -    static const token_number_type yyundef_token_;
 +    void yypop_ (unsigned int n = 1);
 +
 +    // Constants.
 +    enum
 +    {
 +      yyeof_ = 0,
 +      yylast_ = ]b4_last[,           //< Last index in yytable_.
 +      yynnts_ = ]b4_nterms_number[,  //< Number of nonterminal symbols.
 +      yyempty_ = -2,
 +      yyfinal_ = ]b4_final_state_number[, //< Termination state number.
 +      yyterror_ = 1,
 +      yyerrcode_ = 256,
 +      yyntokens_ = ]b4_tokens_number[    //< Number of tokens.
 +    };
 +
  ]b4_parse_param_vars[
    };
 +
 +]b4_token_ctor_if([b4_yytranslate_define
 +b4_public_types_define])[
  ]b4_namespace_close[
  
  ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
 -[b4_token_defines(b4_tokens)
 +[b4_token_defines
  
  #ifndef ]b4_api_PREFIX[STYPE
 - /* Redirection for backward compatibility.  */
 + // Redirection for backward compatibility.
  # define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type
  #endif
  ])[
  ]b4_percent_code_get([[provides]])[
 +]])
 +
 +b4_defines_if(
 +[b4_output_begin([b4_spec_defines_file])
 +b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
 +[
 +/**
 + ** \file ]b4_spec_defines_file[
 + ** Define the ]b4_namespace_ref[::parser class.
 + */
 +
 +// C++ LALR(1) parser skeleton written by Akim Demaille.
 +
 +]b4_cpp_guard_open([b4_spec_defines_file])[
 +]b4_shared_declarations[
  ]b4_cpp_guard_close([b4_spec_defines_file])
  b4_output_end()
  ])
  
  
  b4_output_begin([b4_parser_file_name])
 -b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
 -             [2002-2013])
 +b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
  b4_percent_code_get([[top]])[]dnl
  m4_if(b4_prefix, [yy], [],
  [
  // Take the name prefix into account.
  #define yylex   b4_prefix[]lex])[
  
 -/* First part of user declarations.  */
 +// First part of user declarations.
  ]b4_user_pre_prologue[
  
 -]b4_defines_if([[
 -#include "@basename(]b4_spec_defines_file[@)"]])[
 +]b4_null_define[
 +
 +]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
 +               [b4_shared_declarations])[
  
 -/* User implementation prologue.  */
 +// User implementation prologue.
  ]b4_user_post_prologue[
  ]b4_percent_code_get[
  
 -]b4_null_define[
 -
  #ifndef YY_
  # if defined YYENABLE_NLS && YYENABLE_NLS
  #  if ENABLE_NLS
 -#   include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
 +#   include <libintl.h> // FIXME: INFRINGES ON USER NAME SPACE.
  #   define YY_(msgid) dgettext ("bison-runtime", msgid)
  #  endif
  # endif
  # endif
  #endif
  
 -#define YYRHSLOC(Rhs, K) ((Rhs)[K])
 -]b4_yylloc_default_define[
 +]b4_locations_if([dnl
 +[#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
 +]b4_yylloc_default_define])[
  
 -/* Suppress unused-variable warnings by "using" E.  */
 -#define YYUSE(e) ((void) (e))
 +// Suppress unused-variable warnings by "using" E.
 +#define YYUSE(E) ((void) (E))
  
 -/* Enable debugging if requested.  */
 +// Enable debugging if requested.
  #if ]b4_api_PREFIX[DEBUG
  
 -/* A pseudo ostream that takes yydebug_ into account.  */
 +// A pseudo ostream that takes yydebug_ into account.
  # define YYCDEBUG if (yydebug_) (*yycdebug_)
  
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)        \
 -do {                                                  \
 -  if (yydebug_)                                               \
 -    {                                                 \
 -      *yycdebug_ << Title << ' ';                     \
 -      yy_symbol_print_ ((Type), (Value), (Location)); \
 -      *yycdebug_ << std::endl;                                \
 -    }                                                 \
 -} while (false)
 -
 -# define YY_REDUCE_PRINT(Rule)                \
 -do {                                  \
 -  if (yydebug_)                               \
 -    yy_reduce_print_ (Rule);          \
 -} while (false)
 -
 -# define YY_STACK_PRINT()             \
 -do {                                  \
 -  if (yydebug_)                               \
 -    yystack_print_ ();                        \
 -} while (false)
 -
 -#else /* !]b4_api_PREFIX[DEBUG */
 +# define YY_SYMBOL_PRINT(Title, Symbol)         \
 +  do {                                          \
 +    if (yydebug_)                               \
 +    {                                           \
 +      *yycdebug_ << Title << ' ';               \
 +      yy_print_ (*yycdebug_, Symbol);           \
 +      *yycdebug_ << std::endl;                  \
 +    }                                           \
 +  } while (false)
 +
 +# define YY_REDUCE_PRINT(Rule)          \
 +  do {                                  \
 +    if (yydebug_)                       \
 +      yy_reduce_print_ (Rule);          \
 +  } while (false)
 +
 +# define YY_STACK_PRINT()               \
 +  do {                                  \
 +    if (yydebug_)                       \
 +      yystack_print_ ();                \
 +  } while (false)
 +
 +#else // !]b4_api_PREFIX[DEBUG
  
  # define YYCDEBUG if (false) std::cerr
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type)
 -# define YY_REDUCE_PRINT(Rule)        static_cast<void>(0)
 -# define YY_STACK_PRINT()             static_cast<void>(0)
 +# define YY_SYMBOL_PRINT(Title, Symbol)  YYUSE(Symbol)
 +# define YY_REDUCE_PRINT(Rule)           static_cast<void>(0)
 +# define YY_STACK_PRINT()                static_cast<void>(0)
  
 -#endif /* !]b4_api_PREFIX[DEBUG */
 +#endif // !]b4_api_PREFIX[DEBUG
  
 -#define yyerrok               (yyerrstatus_ = 0)
 -#define yyclearin     (yychar = yyempty_)
 +#define yyerrok         (yyerrstatus_ = 0)
 +#define yyclearin       (yyempty = true)
  
 -#define YYACCEPT      goto yyacceptlab
 -#define YYABORT               goto yyabortlab
 -#define YYERROR               goto yyerrorlab
 +#define YYACCEPT        goto yyacceptlab
 +#define YYABORT         goto yyabortlab
 +#define YYERROR         goto yyerrorlab
  #define YYRECOVERING()  (!!yyerrstatus_)
  
  ]b4_namespace_open[]b4_error_verbose_if([[
              case '\\':
                if (*++yyp != '\\')
                  goto do_not_strip_quotes;
 -              /* Fall through.  */
 +              // Fall through.
              default:
                yyr += *yyp;
                break;
      ]m4_ifset([b4_parse_param], [  ], [ :])[yydebug_ (false),
        yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
  #endif]b4_parse_param_cons[
 +  {}
 +
 +  ]b4_parser_class_name::~b4_parser_class_name[ ()
 +  {}
 +
 +
 +  /*---------------.
 +  | Symbol types.  |
 +  `---------------*/
 +
 +]b4_token_ctor_if([], [b4_public_types_define])[
 +
 +  // by_state.
 +  inline
 +  ]b4_parser_class_name[::by_state::by_state ()
 +    : state (empty)
 +  {}
 +
 +  inline
 +  ]b4_parser_class_name[::by_state::by_state (const by_state& other)
 +    : state (other.state)
 +  {}
 +
 +  inline
 +  void
 +  ]b4_parser_class_name[::by_state::move (by_state& that)
    {
 +    state = that.state;
 +    that.state = empty;
    }
  
 -  ]b4_parser_class_name::~b4_parser_class_name[ ()
 +  inline
 +  ]b4_parser_class_name[::by_state::by_state (state_type s)
 +    : state (s)
 +  {}
 +
 +  inline
 +  ]b4_parser_class_name[::symbol_number_type
 +  ]b4_parser_class_name[::by_state::type_get () const
    {
 +    return state == empty ? 0 : yystos_[state];
    }
  
 -#if ]b4_api_PREFIX[DEBUG
 -  /*--------------------------------.
 -  | Print this symbol on YYOUTPUT.  |
 -  `--------------------------------*/
 +  inline
 +  ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
 +  {}
 +
  
 -  inline void
 -  ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
 -                         const semantic_type* yyvaluep, const location_type* yylocationp)
 +  inline
 +  ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s, symbol_type& that)
 +    : super_type (s]b4_locations_if([, that.location])[)
    {
 -    YYUSE (yylocationp);
 -    YYUSE (yyvaluep);
 -    std::ostream& yyo = debug_stream ();
 -    std::ostream& yyoutput = yyo;
 -    YYUSE (yyoutput);
 -    ]b4_symbol_actions([printers])[
 +    ]b4_variant_if([b4_symbol_variant([that.type_get ()],
 +                                      [value], [move], [that.value])],
 +                   [[value = that.value;]])[
 +    // that is emptied.
 +    that.type = empty;
 +  }
 +
 +  inline
 +  ]b4_parser_class_name[::stack_symbol_type&
 +  ]b4_parser_class_name[::stack_symbol_type::operator= (const stack_symbol_type& that)
 +  {
 +    state = that.state;
 +    ]b4_variant_if([b4_symbol_variant([that.type_get ()],
 +                                      [value], [copy], [that.value])],
 +                   [[value = that.value;]])[]b4_locations_if([
 +    location = that.location;])[
 +    return *this;
    }
  
  
 +  template <typename Base>
 +  inline
    void
 -  ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
 -                         const semantic_type* yyvaluep, const location_type* yylocationp)
 +  ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
    {
 -    *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
 -             << ' ' << yytname_[yytype] << " ("
 -             << *yylocationp << ": ";
 -    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
 -    *yycdebug_ << ')';
 +    if (yymsg)
 +      YY_SYMBOL_PRINT (yymsg, yysym);]b4_variant_if([], [
 +
 +    // User destructor.
-     symbol_number_type yytype = yysym.type_get ();
-     switch (yytype)
-       {
- ]b4_symbol_foreach([b4_symbol_destructor])dnl
- [       default:
-           break;
-       }])[
++    b4_symbol_actions([destructor], [yysym.type_get ()])])[
    }
 -#endif
  
 +#if ]b4_api_PREFIX[DEBUG
 +  template <typename Base>
    void
 -  ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
 -                         int yytype, semantic_type* yyvaluep, location_type* yylocationp)
 +  ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
 +                                     const basic_symbol<Base>& yysym) const
    {
 -    YYUSE (yylocationp);
 -    YYUSE (yymsg);
 -    YYUSE (yyvaluep);
 +    std::ostream& yyoutput = yyo;
 +    YYUSE (yyoutput);
 +    symbol_number_type yytype = yysym.type_get ();
 +    yyo << (yytype < yyntokens_ ? "token" : "nterm")
 +        << ' ' << yytname_[yytype] << " ("]b4_locations_if([
 +        << yysym.location << ": "])[;
-     switch (yytype)
-       {
- ]b4_symbol_foreach([b4_symbol_printer])dnl
- [       default:
-           break;
-       }
++    ]b4_symbol_actions([printer])[
 +    yyo << ')';
 +  }
 +#endif
  
 -    if (yymsg)
 -      YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 +  inline
 +  void
 +  ]b4_parser_class_name[::yypush_ (const char* m, state_type s, symbol_type& sym)
 +  {
 +    stack_symbol_type t (s, sym);
 +    yypush_ (m, t);
 +  }
  
 -    ]b4_symbol_actions([destructors])[
 +  inline
 +  void
 +  ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
 +  {
 +    if (m)
 +      YY_SYMBOL_PRINT (m, s);
 +    yystack_.push (s);
    }
  
 +  inline
    void
    ]b4_parser_class_name[::yypop_ (unsigned int n)
    {
 -    yystate_stack_.pop (n);
 -    yysemantic_stack_.pop (n);
 -    yylocation_stack_.pop (n);
 +    yystack_.pop (n);
    }
  
  #if ]b4_api_PREFIX[DEBUG
    {
      yydebug_ = l;
    }
 -#endif
 +#endif // ]b4_api_PREFIX[DEBUG
 +
 +  inline ]b4_parser_class_name[::state_type
 +  ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs)
 +  {
 +    int yyr = yypgoto_[yylhs - yyntokens_] + yystate;
 +    if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
 +      return yytable_[yyr];
 +    else
 +      return yydefgoto_[yylhs - yyntokens_];
 +  }
  
    inline bool
    ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
    int
    ]b4_parser_class_name[::parse ()
    {
 -    /// Lookahead and lookahead in internal form.
 -    int yychar = yyempty_;
 -    int yytoken = 0;
 +    /// Whether yyla contains a lookahead.
 +    bool yyempty = true;
  
      // State.
      int yyn;
      int yylen = 0;
 -    int yystate = 0;
  
      // Error handling.
      int yynerrs_ = 0;
      int yyerrstatus_ = 0;
  
 -    /// Semantic value of the lookahead.
 -    static semantic_type yyval_default;
 -    semantic_type yylval = yyval_default;
 -    /// Location of the lookahead.
 -    location_type yylloc;
 +    /// The lookahead symbol.
 +    symbol_type yyla;]b4_locations_if([[
 +
      /// The locations where the error started and ended.
 -    location_type yyerror_range[3];
 +    stack_symbol_type yyerror_range[3];]])[
  
 -    /// $$.
 -    semantic_type yyval;
 -    /// @@$.
 -    location_type yyloc;
 +    /// $$ and @@$.
 +    stack_symbol_type yylhs;
  
 +    /// The return value of parse ().
      int yyresult;
  
      // FIXME: This shoud be completely indented.  It is not yet to
      YYCDEBUG << "Starting parse" << std::endl;
  
  ]m4_ifdef([b4_initial_action], [
 -b4_dollar_pushdef([yylval], [], [yylloc])dnl
 -/* User initialization code.  */
 -b4_user_initial_action
 +b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl
 +    // User initialization code.
 +    b4_user_initial_action
  b4_dollar_popdef])[]dnl
  
 -  [  /* Initialize the stacks.  The initial state will be pushed in
 +  [  /* Initialize the stack.  The initial state will be set in
         yynewstate, since the latter expects the semantical and the
         location values to have been already stored, initialize these
         stacks with a primary value.  */
-     yystack_ = stack_type (0);
 -    yystate_stack_.clear ();
 -    yysemantic_stack_.clear ();
 -    yylocation_stack_.clear ();
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yylloc);
++    yystack_.clear ();
 +    yypush_ (YY_NULL, 0, yyla);
  
 -    /* New state.  */
 +    // A new symbol was pushed on the stack.
    yynewstate:
 -    yystate_stack_.push (yystate);
 -    YYCDEBUG << "Entering state " << yystate << std::endl;
 +    YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
  
 -    /* Accept?  */
 -    if (yystate == yyfinal_)
 +    // Accept?
 +    if (yystack_[0].state == yyfinal_)
        goto yyacceptlab;
  
      goto yybackup;
  
 -    /* Backup.  */
 +    // Backup.
    yybackup:
  
 -    /* Try to take a decision without lookahead.  */
 -    yyn = yypact_[yystate];
 +    // Try to take a decision without lookahead.
 +    yyn = yypact_[yystack_[0].state];
      if (yy_pact_value_is_default_ (yyn))
        goto yydefault;
  
 -    /* Read a lookahead token.  */
 -    if (yychar == yyempty_)
 +    // Read a lookahead token.
 +    if (yyempty)
        {
          YYCDEBUG << "Reading a token: ";
 -        yychar = ]b4_c_function_call([yylex], [int],
 -                                     [b4_api_PREFIX[STYPE*], [&yylval]][]dnl
 -b4_locations_if([, [[location*], [&yylloc]]])dnl
 -m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
 -      }
 -
 -    /* Convert token to internal form.  */
 -    if (yychar <= yyeof_)
 -      {
 -      yychar = yytoken = yyeof_;
 -      YYCDEBUG << "Now at end of input." << std::endl;
 -      }
 -    else
 -      {
 -      yytoken = yytranslate_ (yychar);
 -      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 +        try
 +          {]b4_token_ctor_if([[
 +            symbol_type yylookahead (]b4_lex[);
 +            yyla.move (yylookahead);]], [[
 +            yyla.type = yytranslate_ (]b4_lex[);]])[
 +          }
 +        catch (const syntax_error& yyexc)
 +          {
 +            error (yyexc);
 +            goto yyerrlab1;
 +          }
 +        yyempty = false;
        }
 +    YY_SYMBOL_PRINT ("Next token is", yyla);
  
 -    /* If the proper action on seeing token YYTOKEN is to reduce or to
 -       detect an error, take that action.  */
 -    yyn += yytoken;
 -    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken)
 +    /* If the proper action on seeing token YYLA.TYPE is to reduce or
 +       to detect an error, take that action.  */
 +    yyn += yyla.type_get ();
 +    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type_get ())
        goto yydefault;
  
 -    /* Reduce or error.  */
 +    // Reduce or error.
      yyn = yytable_[yyn];
      if (yyn <= 0)
        {
 -      if (yy_table_value_is_error_ (yyn))
 -        goto yyerrlab;
 -      yyn = -yyn;
 -      goto yyreduce;
 +        if (yy_table_value_is_error_ (yyn))
 +          goto yyerrlab;
 +        yyn = -yyn;
 +        goto yyreduce;
        }
  
 -    /* Shift the lookahead token.  */
 -    YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 -
 -    /* Discard the token being shifted.  */
 -    yychar = yyempty_;
 -
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yylloc);
 +    // Discard the token being shifted.
 +    yyempty = true;
  
 -    /* Count tokens shifted since error; after three, turn off error
 -       status.  */
 +    // Count tokens shifted since error; after three, turn off error status.
      if (yyerrstatus_)
        --yyerrstatus_;
  
 -    yystate = yyn;
 +    // Shift the lookahead token.
 +    yypush_ ("Shifting", yyn, yyla);
      goto yynewstate;
  
    /*-----------------------------------------------------------.
    | yydefault -- do the default action for the current state.  |
    `-----------------------------------------------------------*/
    yydefault:
 -    yyn = yydefact_[yystate];
 +    yyn = yydefact_[yystack_[0].state];
      if (yyn == 0)
        goto yyerrlab;
      goto yyreduce;
    `-----------------------------*/
    yyreduce:
      yylen = yyr2_[yyn];
 +    yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
 +    /* Variants are always initialized to an empty instance of the
 +       correct type. The default $$=$1 action is NOT applied when using
 +       variants.  */
 +    b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[
      /* If YYLEN is nonzero, implement the default value of the action:
 -       `$$ = $1'.  Otherwise, use the top of the stack.
 +       '$$ = $1'.  Otherwise, use the top of the stack.
  
 -       Otherwise, the following line sets YYVAL to garbage.
 +       Otherwise, the following line sets YYLHS.VALUE to garbage.
         This behavior is undocumented and Bison
         users should not rely upon it.  */
      if (yylen)
 -      yyval = yysemantic_stack_[yylen - 1];
 +      yylhs.value = yystack_@{yylen - 1@}.value;
      else
 -      yyval = yysemantic_stack_[0];
 -
 +      yylhs.value = yystack_@{0@}.value;])[
 +]b4_locations_if([dnl
 +[
      // Compute the default @@$.
      {
 -      slice<location_type, location_stack_type> slice (yylocation_stack_, yylen);
 -      YYLLOC_DEFAULT (yyloc, slice, yylen);
 -    }
 +      slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
 +      YYLLOC_DEFAULT (yylhs.location, slice, yylen);
 +    }]])[
  
      // Perform the reduction.
      YY_REDUCE_PRINT (yyn);
 -    switch (yyn)
 +    try
        {
 -        ]b4_user_actions[
 -      default:
 -        break;
 +        switch (yyn)
 +          {
 +]b4_user_actions[
 +          default:
 +            break;
 +          }
        }
 -
 -    /* 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.  */
 -    YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
 -
 +    catch (const syntax_error& yyexc)
 +      {
 +        error (yyexc);
 +        YYERROR;
 +      }
 +    YY_SYMBOL_PRINT ("-> $$ =", yylhs);
      yypop_ (yylen);
      yylen = 0;
      YY_STACK_PRINT ();
  
 -    yysemantic_stack_.push (yyval);
 -    yylocation_stack_.push (yyloc);
 -
 -    /* Shift the result of the reduction.  */
 -    yyn = yyr1_[yyn];
 -    yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];
 -    if (0 <= yystate && yystate <= yylast_
 -      && yycheck_[yystate] == yystate_stack_[0])
 -      yystate = yytable_[yystate];
 -    else
 -      yystate = yydefgoto_[yyn - yyntokens_];
 +    // Shift the result of the reduction.
 +    yypush_ (YY_NULL, yylhs);
      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.  */
 -    yytoken = yytranslate_ (yychar);
 -
 -    /* If not already recovering from an error, report this error.  */
 +    // If not already recovering from an error, report this error.
      if (!yyerrstatus_)
        {
 -      ++yynerrs_;
 -      if (yychar == yyempty_)
 -        yytoken = yyempty_;
 -      error (yylloc, yysyntax_error_ (yystate, yytoken));
 +        ++yynerrs_;
 +        error (]b4_join(b4_locations_if([yyla.location]),
 +                        [[yysyntax_error_ (yystack_[0].state,
 +                                           yyempty ? yyempty_ : yyla.type_get ())]])[);
        }
  
 -    yyerror_range[1] = yylloc;
 +]b4_locations_if([[
 +    yyerror_range[1].location = yyla.location;]])[
      if (yyerrstatus_ == 3)
        {
          /* If just tried and failed to reuse lookahead token after an
             error, discard it.  */
 -        if (yychar <= yyeof_)
 -          {
 -            /* Return failure if at end of input.  */
 -            if (yychar == yyeof_)
 -              YYABORT;
 -          }
 -        else
 +
 +        // Return failure if at end of input.
 +        if (yyla.type_get () == yyeof_)
 +          YYABORT;
 +        else if (!yyempty)
            {
 -            yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
 -            yychar = yyempty_;
 +            yy_destroy_ ("Error: discarding", yyla);
 +            yyempty = true;
            }
        }
  
 -    /* Else will try to reuse lookahead token after shifting the error
 -       token.  */
 +    // Else will try to reuse lookahead token after shifting the error token.
      goto yyerrlab1;
  
  
         YYERROR and the label yyerrorlab therefore never appears in user
         code.  */
      if (false)
 -      goto yyerrorlab;
 -
 -    yyerror_range[1] = yylocation_stack_[yylen - 1];
 -    /* Do not reclaim the symbols of the rule which action triggered
 +      goto yyerrorlab;]b4_locations_if([[
 +    yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
 +    /* $$ was initialized before running the user action.  */
 +    YY_SYMBOL_PRINT ("Error: discarding", yylhs);
 +    yylhs.~stack_symbol_type();]])[
 +    /* Do not reclaim the symbols of the rule whose action triggered
         this YYERROR.  */
      yypop_ (yylen);
      yylen = 0;
 -    yystate = yystate_stack_[0];
      goto yyerrlab1;
  
    /*-------------------------------------------------------------.
    | yyerrlab1 -- common code for both syntax error and YYERROR.  |
    `-------------------------------------------------------------*/
    yyerrlab1:
 -    yyerrstatus_ = 3; /* Each real token shifted decrements this.  */
 -
 -    for (;;)
 -      {
 -      yyn = yypact_[yystate];
 -      if (!yy_pact_value_is_default_ (yyn))
 -      {
 -        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 (yystate_stack_.height () == 1)
 -        YYABORT;
 -
 -      yyerror_range[1] = yylocation_stack_[0];
 -      yydestruct_ ("Error: popping",
 -                   yystos_[yystate],
 -                   &yysemantic_stack_[0], &yylocation_stack_[0]);
 -      yypop_ ();
 -      yystate = yystate_stack_[0];
 -      YY_STACK_PRINT ();
 -      }
 -
 -    yyerror_range[2] = yylloc;
 -    // Using YYLLOC is tempting, but would change the location of
 -    // the lookahead.  YYLOC is available though.
 -    YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yyloc);
 +    yyerrstatus_ = 3;   // Each real token shifted decrements this.
 +    {
 +      stack_symbol_type error_token;
 +      for (;;)
 +        {
 +          yyn = yypact_[yystack_[0].state];
 +          if (!yy_pact_value_is_default_ (yyn))
 +            {
 +              yyn += yyterror_;
 +              if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
 +                {
 +                  yyn = yytable_[yyn];
 +                  if (0 < yyn)
 +                    break;
 +                }
 +            }
  
 -    /* Shift the error token.  */
 -    YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
 -                   &yysemantic_stack_[0], &yylocation_stack_[0]);
 +          // Pop the current state because it cannot handle the error token.
 +          if (yystack_.size () == 1)
 +            YYABORT;
 +]b4_locations_if([[
 +          yyerror_range[1].location = yystack_[0].location;]])[
 +          yy_destroy_ ("Error: popping", yystack_[0]);
 +          yypop_ ();
 +          YY_STACK_PRINT ();
 +        }
 +]b4_locations_if([[
 +      yyerror_range[2].location = yyla.location;
 +      YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[
  
 -    yystate = yyn;
 +      // Shift the error token.
 +      error_token.state = yyn;
 +      yypush_ ("Shifting", error_token);
 +    }
      goto yynewstate;
  
 -    /* Accept.  */
 +    // Accept.
    yyacceptlab:
      yyresult = 0;
      goto yyreturn;
  
 -    /* Abort.  */
 +    // Abort.
    yyabortlab:
      yyresult = 1;
      goto yyreturn;
  
    yyreturn:
 -    if (yychar != yyempty_)
 -      {
 -        /* Make sure we have latest lookahead translation.  See comments
 -           at user semantic actions for why this is necessary.  */
 -        yytoken = yytranslate_ (yychar);
 -        yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval,
 -                     &yylloc);
 -      }
 +    if (!yyempty)
 +      yy_destroy_ ("Cleanup: discarding lookahead", yyla);
  
 -    /* Do not reclaim the symbols of the rule which action triggered
 +    /* Do not reclaim the symbols of the rule whose action triggered
         this YYABORT or YYACCEPT.  */
      yypop_ (yylen);
 -    while (1 < yystate_stack_.height ())
 +    while (1 < yystack_.size ())
        {
 -        yydestruct_ ("Cleanup: popping",
 -                     yystos_[yystate_stack_[0]],
 -                     &yysemantic_stack_[0],
 -                     &yylocation_stack_[0]);
 +        yy_destroy_ ("Cleanup: popping", yystack_[0]);
          yypop_ ();
        }
  
      return yyresult;
 -    }
 +  }
      catch (...)
        {
          YYCDEBUG << "Exception caught: cleaning lookahead and stack"
                   << std::endl;
          // Do not try to display the values of the reclaimed symbols,
          // as their printer might throw an exception.
 -        if (yychar != yyempty_)
 -          {
 -            /* Make sure we have latest lookahead translation.  See
 -               comments at user semantic actions for why this is
 -               necessary.  */
 -            yytoken = yytranslate_ (yychar);
 -            yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc);
 -          }
 +        if (!yyempty)
 +          yy_destroy_ (YY_NULL, yyla);
  
 -        while (1 < yystate_stack_.height ())
 +        while (1 < yystack_.size ())
            {
 -            yydestruct_ (YY_NULL,
 -                         yystos_[yystate_stack_[0]],
 -                         &yysemantic_stack_[0],
 -                         &yylocation_stack_[0]);
 +            yy_destroy_ (YY_NULL, yystack_[0]);
              yypop_ ();
            }
          throw;
        }
    }
  
 +  void
 +  ]b4_parser_class_name[::error (const syntax_error& yyexc)
 +  {
 +    error (]b4_join(b4_locations_if([yyexc.location]),
 +                    [[yyexc.what()]])[);
 +  }
 +
    // Generate an error message.
    std::string
    ]b4_parser_class_name[::yysyntax_error_ (]dnl
 -b4_error_verbose_if([int yystate, int yytoken],
 -                    [int, int])[)
 +b4_error_verbose_if([state_type yystate, symbol_number_type yytoken],
 +                    [state_type, symbol_number_type])[) const
    {]b4_error_verbose_if([[
      std::string yyres;
      // Number of reported tokens (one for the "unexpected", one per
           a consistent state with a default action.  There might have
           been a previous inconsistent state, consistent state with a
           non-default action, or user semantic action that manipulated
 -         yychar.
 +         yyla.  (However, yyla is currently not documented for users.)
         - Of course, the expected token list depends on states to have
           correct lookahead information, and it depends on the parser not
           to perform extra reductions after fetching a lookahead from the
                 YYCHECK.  In other words, skip the first -YYN actions for
                 this state because they are default actions.  */
              int yyxbegin = yyn < 0 ? -yyn : 0;
 -            /* Stay within bounds of both yycheck and yytname.  */
 +            // Stay within bounds of both yycheck and yytname.
              int yychecklim = yylast_ - yyn + 1;
              int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
              for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
    }
  
  
 -  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -     STATE-NUM.  */
    const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
 -  const ]b4_int_type_for([b4_pact])[
 -  ]b4_parser_class_name[::yypact_[] =
 -  {
 -    ]b4_pact[
 -  };
 -
 -  /* YYDEFACT[S] -- default reduction number in state S.  Performed when
 -     YYTABLE doesn't specify something else to do.  Zero means the
 -     default is an error.  */
 -  const ]b4_int_type_for([b4_defact])[
 -  ]b4_parser_class_name[::yydefact_[] =
 -  {
 -    ]b4_defact[
 -  };
  
 -  /* YYPGOTO[NTERM-NUM].  */
 -  const ]b4_int_type_for([b4_pgoto])[
 -  ]b4_parser_class_name[::yypgoto_[] =
 -  {
 -    ]b4_pgoto[
 -  };
 -
 -  /* YYDEFGOTO[NTERM-NUM].  */
 -  const ]b4_int_type_for([b4_defgoto])[
 -  ]b4_parser_class_name[::yydefgoto_[] =
 -  {
 -    ]b4_defgoto[
 -  };
 -
 -  /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
 -     positive, shift that token.  If negative, reduce the rule which
 -     number is the opposite.  If YYTABLE_NINF_, syntax error.  */
    const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
 -  const ]b4_int_type_for([b4_table])[
 -  ]b4_parser_class_name[::yytable_[] =
 -  {
 -    ]b4_table[
 -  };
 -
 -  /* YYCHECK.  */
 -  const ]b4_int_type_for([b4_check])[
 -  ]b4_parser_class_name[::yycheck_[] =
 -  {
 -    ]b4_check[
 -  };
 -
 -  /* STOS_[STATE-NUM] -- The (internal number of the) accessing
 -     symbol of state STATE-NUM.  */
 -  const ]b4_int_type_for([b4_stos])[
 -  ]b4_parser_class_name[::yystos_[] =
 -  {
 -    ]b4_stos[
 -  };
  
 -#if ]b4_api_PREFIX[DEBUG
 -  /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
 -     to YYLEX-NUM.  */
 -  const ]b4_int_type_for([b4_toknum])[
 -  ]b4_parser_class_name[::yytoken_number_[] =
 -  {
 -    ]b4_toknum[
 -  };
 -#endif
 -
 -  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -  const ]b4_int_type_for([b4_r1])[
 -  ]b4_parser_class_name[::yyr1_[] =
 -  {
 -    ]b4_r1[
 -  };
 -
 -  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -  const ]b4_int_type_for([b4_r2])[
 -  ]b4_parser_class_name[::yyr2_[] =
 -  {
 -    ]b4_r2[
 -  };
 +]b4_parser_tables_define[
  
  ]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[
 -  /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
 -     First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
 +  // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
 +  // First, the terminals, then, starting at \a yyntokens_, nonterminals.
    const char*
    const ]b4_parser_class_name[::yytname_[] =
    {
 -    ]b4_tname[
 +  ]b4_tname[
    };
  
  ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[
 -  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -  const ]b4_parser_class_name[::rhs_number_type
 -  ]b4_parser_class_name[::yyrhs_[] =
 -  {
 -    ]b4_rhs[
 -  };
 -
 -  /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -     YYRHS.  */
 -  const ]b4_int_type_for([b4_prhs])[
 -  ]b4_parser_class_name[::yyprhs_[] =
 -  {
 -    ]b4_prhs[
 -  };
 -
 -  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 -  const ]b4_int_type_for([b4_rline])[
 -  ]b4_parser_class_name[::yyrline_[] =
 -  {
 -    ]b4_rline[
 -  };
 +]b4_integral_parser_table_define([rline], [b4_rline])[
  
    // Print the state stack on the debug stream.
    void
    ]b4_parser_class_name[::yystack_print_ ()
    {
      *yycdebug_ << "Stack now";
 -    for (state_stack_type::const_iterator i = yystate_stack_.begin ();
 -       i != yystate_stack_.end (); ++i)
 -      *yycdebug_ << ' ' << *i;
 +    for (stack_type::const_iterator
 +           i = yystack_.begin (),
 +           i_end = yystack_.end ();
 +         i != i_end; ++i)
 +      *yycdebug_ << ' ' << i->state;
      *yycdebug_ << std::endl;
    }
  
    {
      unsigned int yylno = yyrline_[yyrule];
      int yynrhs = yyr2_[yyrule];
 -    /* Print the symbols being reduced, and their result.  */
 +    // Print the symbols being reduced, and their result.
      *yycdebug_ << "Reducing stack by rule " << yyrule - 1
 -             << " (line " << yylno << "):" << std::endl;
 -    /* The symbols being reduced.  */
 +               << " (line " << yylno << "):" << std::endl;
 +    // The symbols being reduced.
      for (int yyi = 0; yyi < yynrhs; yyi++)
        YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
 -                     yyrhs_[yyprhs_[yyrule] + yyi],
 -                     &]b4_rhs_value(yynrhs, yyi + 1)[,
 -                     &]b4_rhs_location(yynrhs, yyi + 1)[);
 +                       ]b4_rhs_data(yynrhs, yyi + 1)[);
    }
  #endif // ]b4_api_PREFIX[DEBUG
  
 -  /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 -  ]b4_parser_class_name[::token_number_type
 -  ]b4_parser_class_name[::yytranslate_ (int t)
 -  {
 -    static
 -    const token_number_type
 -    translate_table[] =
 -    {
 -      ]b4_translate[
 -    };
 -    if ((unsigned int) t <= yyuser_token_number_max_)
 -      return translate_table[t];
 -    else
 -      return yyundef_token_;
 -  }
 -
 -  const int ]b4_parser_class_name[::yyeof_ = 0;
 -  const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
 -  const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
 -  const int ]b4_parser_class_name[::yyempty_ = -2;
 -  const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
 -  const int ]b4_parser_class_name[::yyterror_ = 1;
 -  const int ]b4_parser_class_name[::yyerrcode_ = 256;
 -  const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
 -
 -  const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
 -  const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
 -
 +]b4_token_ctor_if([], [b4_yytranslate_define])[
  ]b4_namespace_close[
  ]b4_epilogue[]dnl
  b4_output_end()
 +
 +
 +m4_popdef([b4_copyright_years])dnl
diff --combined data/stack.hh
index 037c212fc6a549462f8a480d5982495ce1eed8bd,317a0612c2ac1708151822994e26123ae5a58a8c..aa64d63d842cce563540a8254251dc1135ba9e5c
  m4_pushdef([b4_copyright_years],
             [2002-2013])
  
 -b4_output_begin([b4_dir_prefix[]stack.hh])
 -b4_copyright([Stack handling for Bison parsers in C++],
 -             [2002-2013])[
 -
 -/**
 - ** \file ]b4_dir_prefix[stack.hh
 - ** Define the ]b4_namespace_ref[::stack class.
 - */
 -
 -]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
 -
 -# include <deque>
 -
 -]b4_namespace_open[
 -  template <class T, class S = std::deque<T> >
 +# b4_stack_define
 +# ---------------
 +m4_define([b4_stack_define],
 +[[  template <class T, class S = std::vector<T> >
    class stack
    {
    public:
      typedef typename S::reverse_iterator iterator;
      typedef typename S::const_reverse_iterator const_iterator;
  
 -    stack () : seq_ ()
 +    stack ()
 +      : seq_ ()
      {
      }
  
 -    stack (unsigned int n) : seq_ (n)
 +    stack (unsigned int n)
 +      : seq_ (n)
      {
      }
  
      inline
      T&
 -    operator [] (unsigned int i)
 +    operator[] (unsigned int i)
      {
 -      return seq_[i];
 +      return seq_[seq_.size () - 1 - i];
      }
  
      inline
      const T&
 -    operator [] (unsigned int i) const
 +    operator[] (unsigned int i) const
      {
 -      return seq_[i];
 +      return seq_[seq_.size () - 1 - i];
      }
  
 +    /// Steal the contents of \a t.
 +    ///
 +    /// Close to move-semantics.
      inline
      void
 -    push (const T& t)
 +    push (T& t)
      {
 -      seq_.push_front (t);
 +      seq_.push_back (T());
 +      operator[](0).move (t);
      }
  
      inline
      pop (unsigned int n = 1)
      {
        for (; n; --n)
 -        seq_.pop_front ();
 +        seq_.pop_back ();
      }
  
+     void
+     clear ()
+     {
+       seq_.clear ();
+     }
      inline
 -    unsigned int
 -    height () const
 +    typename S::size_type
 +    size () const
      {
        return seq_.size ();
      }
  
 -    inline const_iterator begin () const { return seq_.rbegin (); }
 -    inline const_iterator end () const { return seq_.rend (); }
 +    inline
 +    const_iterator
 +    begin () const
 +    {
 +      return seq_.rbegin ();
 +    }
 +
 +    inline
 +    const_iterator
 +    end () const
 +    {
 +      return seq_.rend ();
 +    }
  
    private:
+     stack (const stack&);
+     stack& operator= (const stack&);
 +    /// The wrapped container.
      S seq_;
    };
  
      const S& stack_;
      unsigned int range_;
    };
 +]])
 +
 +b4_defines_if(
 +[b4_output_begin([b4_dir_prefix[]stack.hh])
 +b4_copyright([Stack handling for Bison parsers in C++])[
 +
 +/**
 + ** \file ]b4_dir_prefix[stack.hh
 + ** Define the ]b4_namespace_ref[::stack class.
 + */
 +
 +]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[
 +
 +# include <vector>
 +
 +]b4_namespace_open[
 +]b4_stack_define[
  ]b4_namespace_close[
  
  ]b4_cpp_guard_close([b4_dir_prefix[]stack.hh])
  b4_output_end()
 +])
  
  m4_popdef([b4_copyright_years])
diff --combined data/yacc.c
index c47114ab4b7ea9c621b3017d46c4a4d28caf9e44,360892315284edee098385630c7d5dcd986a9803..74fadd1d725b02596e7d9c4a2b6e7fd73f7722a4
@@@ -1,12 -1,10 +1,12 @@@
                                                               -*- C -*-
 -
  # Yacc compatible skeleton for Bison
  
  # Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation,
  # Inc.
  
 +m4_pushdef([b4_copyright_years],
 +           [1984, 1989-1990, 2000-2013])
 +
  # 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
@@@ -97,8 -95,17 +97,8 @@@ m4_define([b4_yyerror_arg_loc_if]
  # Arguments passed to yyerror: user args plus yylloc.
  m4_define([b4_yyerror_args],
  [b4_yyerror_arg_loc_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
 -# ------------
 -# Accumulate in b4_lex_param all the yylex arguments.
 -# b4_lex_param arrives quoted twice, but we want to keep only one level.
 -m4_define([b4_lex_param],
 -m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[&yylval]]][]dnl
 -b4_locations_if([, [[YYLTYPE *], [&yylloc]]])m4_ifdef([b4_lex_param], [, ])])dnl
 -m4_ifdef([b4_lex_param], b4_lex_param)))
  
  
  ## ------------ ##
@@@ -120,7 -127,7 +120,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])])
  
  
  ## ----------- ##
@@@ -159,7 -167,7 +159,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])@})])
  
  
  ## -------------- ##
@@@ -222,9 -230,9 +222,9 @@@ m4_define([b4_declare_parser_state_vari
      int yyerrstatus;
  
      /* The stacks and their tools:
 -       `yyss': related to states.
 -       `yyvs': related to semantic values.]b4_locations_if([[
 -       `yyls': related to locations.]])[
 +       'yyss': related to states.
 +       'yyvs': related to semantic values.]b4_locations_if([[
 +       'yyls': related to locations.]])[
  
         Refer to the stacks through separate pointers, to allow yyoverflow
         to reallocate them elsewhere.  */
@@@ -266,19 -274,19 +266,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 *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
@@@ -305,19 -319,21 +305,19 @@@ 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]])[
  ]b4_cpp_guard_close([b4_spec_defines_file])[]dnl
  ])
  
 -
  ## -------------- ##
  ## Output files.  ##
  ## -------------- ##
  
  b4_output_begin([b4_parser_file_name])
 -b4_copyright([Bison implementation for Yacc-like parsers in C],
 -             [1984, 1989-1990, 2000-2013])[
 +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.  */
@@@ -345,12 -361,11 +345,12 @@@ m4_if(b4_api_prefix, [yy], []
  #define yypstate        ]b4_prefix[pstate]])[
  #define yylex           ]b4_prefix[lex
  #define yyerror         ]b4_prefix[error
 -#define yylval          ]b4_prefix[lval
 -#define yychar          ]b4_prefix[char
  #define yydebug         ]b4_prefix[debug
 -#define yynerrs         ]b4_prefix[nerrs]b4_locations_if([[
 -#define yylloc          ]b4_prefix[lloc]])])[
 +#define yynerrs         ]b4_prefix[nerrs
 +]]b4_pure_if([], [[
 +#define yylval          ]b4_prefix[lval
 +#define yychar          ]b4_prefix[char]b4_locations_if([[
 +#define yylloc          ]b4_prefix[lloc]])]))[
  
  /* Copy the first part of user declarations.  */
  ]b4_user_pre_prologue[
  # 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),
@@@ -387,8 -402,10 +387,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
@@@ -408,7 -425,7 +408,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
  #endif
  
- /* Suppress unused-variable warnings by "using" E.  */
- #ifdef __GNUC__
- # define YYUSE(E) ((void) (E))
- #else
- # define YYUSE(E) /* empty */
- #endif
+ ]b4_attribute_define[
  
 -/* 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
@@@ -455,7 -477,7 +450,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
  # endif]])])[
  
  # ifdef YYSTACK_ALLOC
 -   /* Pacify GCC's `empty if-body' warning.  */
 -#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 +   /* Pacify GCC's 'empty if-body' warning.  */
 +#  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[
@@@ -617,35 -653,105 +612,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)
  
  /* Error token number */
 -#define YYTERROR      1
 -#define YYERRCODE     256
 +#define YYTERROR        1
 +#define YYERRCODE       256
  
  ]b4_locations_if([[
  ]b4_yylloc_default_define[
  #define YYRHSLOC(Rhs, K) ((Rhs)[K])
  ]])[
 -]b4_yy_location_print_define[
 -
 -/* 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)[
 -#endif
  
  /* Enable debugging if requested.  */
  #if ]b4_api_PREFIX[DEBUG
  #  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)
 +
 +]b4_yy_location_print_define[
 +
 +# 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.  */
@@@ -777,7 -887,7 +772,7 @@@ int yydebug
  
  
  /* YYINITDEPTH -- initial size of the parser's stacks.  */
 -#ifndef       YYINITDEPTH
 +#ifndef YYINITDEPTH
  # define YYINITDEPTH ]b4_stack_depth_init[
  #endif
  
@@@ -897,7 -1007,7 +892,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
@@@ -920,7 -1030,7 +915,7 @@@ do 
                     Event "\n");                                          \
        yy_lac_established = 0;                                            \
      }                                                                    \
 -} while (YYID (0))
 +} while (0)
  #else
  # define YY_LAC_DISCARD(Event) yy_lac_established = 0
  #endif
@@@ -1036,7 -1146,7 +1031,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;
@@@ -1084,27 -1194,27 +1079,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: ;
      }
  
@@@ -1142,6 -1252,10 +1137,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([], [
  
@@@ -1291,13 -1405,13 +1286,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;
 +    yychar = ]b4_lex[;
      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;
@@@ -1478,26 -1597,26 +1473,26 @@@ b4_locations_if([[  yylsp[0] = ]b4_push
  
  #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));
@@@ -1582,7 -1701,7 +1577,7 @@@ yyread_pushed_token:]])
          yylval = *yypushed_val;]b4_locations_if([[
        if (yypushed_loc)
          yylloc = *yypushed_loc;]])])], [[
 -      yychar = YYLEX;]])[
 +      yychar = ]b4_lex[;]])[
      }
  
    if (yychar <= YYEOF)
@@@ -1653,7 -1772,7 +1648,7 @@@ yyreduce
    yylen = yyr2[yyn];
  
    /* If YYLEN is nonzero, implement the default value of the action:
 -     `$$ = $1'.
 +     '$$ = $1'.
  
       Otherwise, the following line sets YYVAL to garbage.
       This behavior is undocumented and Bison
    *++yyvsp = yyval;]b4_locations_if([
    *++yylsp = yyloc;])[
  
 -  /* Now `shift' the result of the reduction.  Determine what state
 +  /* Now 'shift' the result of the reduction.  Determine what state
       that goes to, based on the state we popped back to and the rule
       number reduced by.  */
  
    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
@@@ -1805,7 -1924,7 +1800,7 @@@ yyerrorlab
       goto yyerrorlab;
  
  ]b4_locations_if([[  yyerror_range[1] = yylsp[1-yylen];
 -]])[  /* Do not reclaim the symbols of the rule which action triggered
 +]])[  /* Do not reclaim the symbols of the rule whose action triggered
       this YYERROR.  */
    YYPOPSTACK (yylen);
    yylen = 0;
  | 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);
@@@ -1900,14 -2019,14 +1895,14 @@@ yyreturn
        yydestruct ("Cleanup: discarding lookahead",
                    yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
      }
 -  /* Do not reclaim the symbols of the rule which action triggered
 +  /* Do not reclaim the symbols of the rule whose action triggered
       this YYABORT or YYACCEPT.  */
    YYPOPSTACK (yylen);
    YY_STACK_PRINT (yyss, yyssp);
    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
@@@ -1923,15 -2042,19 +1918,15 @@@ yypushreturn:]])
    if (yymsg != yymsgbuf)
      YYSTACK_FREE (yymsg);
  #endif
 -  /* Make sure YYID is used.  */
 -  return YYID (yyresult);
 +  return yyresult;
  }
 -
 -
  ]b4_epilogue[]dnl
  b4_output_end()
  
  b4_defines_if(
  [b4_output_begin([b4_spec_defines_file])[
 -]b4_copyright([Bison interface for Yacc-like parsers in C],
 -              [1984, 1989-1990, 2000-2013])[
 +]b4_copyright([Bison interface for Yacc-like parsers in C])[
  
  ]b4_shared_declarations[
  ]b4_output_end()
 -])
 +])# b4_defines_if
diff --combined tests/glr-regression.at
index 9eb429c77908db9363404a4f840bb300c68074f0,868c84109e62c73c2274feb7b2a04aa35fbb6615..711ab7ec597fc6d588ba0527f4ab85330a30c5c0
@@@ -88,8 -88,8 +88,8 @@@ yylex (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr1.c glr-regr1.y]], 0, [],
 -[glr-regr1.y: conflicts: 1 shift/reduce
 -])
 +[[glr-regr1.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +]])
  AT_COMPILE([glr-regr1])
  AT_PARSER_CHECK([[./glr-regr1 BPBPB]], 0,
  [[E -> 'B'
@@@ -208,8 -208,8 +208,8 @@@ main (int argc, char **argv
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr2a.c glr-regr2a.y]], 0, [],
 -[glr-regr2a.y: conflicts: 2 shift/reduce
 -])
 +[[glr-regr2a.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
 +]])
  AT_COMPILE([glr-regr2a])
  
  AT_DATA([input1.txt],
@@@ -326,7 -326,7 +326,7 @@@ int yylex (void
  }
  
  int
 -main(int argc, char* argv[])
 +main (int argc, char* argv[])
  {
    int res;
    input = stdin;
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr3.c glr-regr3.y]], 0, [],
 -[glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce
 -])
 +[[glr-regr3.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +glr-regr3.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr3])
  
  AT_DATA([input.txt],
@@@ -437,8 -436,8 +437,8 @@@ merge (YYSTYPE s1, YYSTYPE s2
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr4.c glr-regr4.y]], 0, [],
 -[glr-regr4.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr4.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr4])
  
  AT_PARSER_CHECK([[./glr-regr4]], 0,
@@@ -486,18 -485,22 +486,18 @@@ start
     ;
  
  %%
- ]AT_YYLEX_DEFINE(["a"])[
  ]AT_YYERROR_DEFINE[
 -int
 -main (void)
 -{
 -  return yyparse () != 1;
 -}
+ ]AT_YYLEX_DEFINE(["a"])[
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr5.c glr-regr5.y]], 0, [],
 -[glr-regr5.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr5.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr5])
  
 -AT_PARSER_CHECK([[./glr-regr5]], 0, [],
 +AT_PARSER_CHECK([[./glr-regr5]], 1, [],
  [syntax is ambiguous
  ])
  
@@@ -536,16 -539,20 +536,16 @@@ start: 'a' | 'a' 
  %%
  ]AT_YYERROR_DEFINE[
  ]AT_YYLEX_DEFINE(["a"])[
 -int
 -main (void)
 -{
 -  return yyparse () != 1;
 -}
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr6.c glr-regr6.y]], 0, [],
 -[glr-regr6.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr6.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr6])
  
 -AT_PARSER_CHECK([[./glr-regr6]], 0,
 +AT_PARSER_CHECK([[./glr-regr6]], 1,
  [Destructor called.
  ],
  [syntax is ambiguous
@@@ -630,8 -637,8 +630,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr7.c glr-regr7.y]], 0, [],
 -[glr-regr7.y: conflicts: 2 reduce/reduce
 -])
 +[[glr-regr7.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr7])
  
  AT_PARSER_CHECK([[./glr-regr7]], 2, [],
@@@ -643,7 -650,7 +643,7 @@@ AT_CLEANU
  
  ## ------------------------------------------------------------------------- ##
  ## Incorrect default location for empty right-hand sides.  Adapted from bug  ##
 -## report by Claudia Hermann.                                              ##
 +## report by Claudia Hermann.                                                ##
  ## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ##
  ## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html         ##
  ## ------------------------------------------------------------------------- ##
@@@ -669,25 -676,25 +669,25 @@@ AT_DATA_GRAMMAR([glr-regr8.y]
  %%
  
  
 -PortClause    : T_PORT InterfaceDeclaration T_PORT
 -              { printf("%d/%d - %d/%d - %d/%d\n",
 -                       @1.first_column, @1.last_column,
 -                       @2.first_column, @2.last_column,
 -                       @3.first_column, @3.last_column); }
 -      ;
 +PortClause      : T_PORT InterfaceDeclaration T_PORT
 +                { printf("%d/%d - %d/%d - %d/%d\n",
 +                         @1.first_column, @1.last_column,
 +                         @2.first_column, @2.last_column,
 +                         @3.first_column, @3.last_column); }
 +        ;
  
 -InterfaceDeclaration  : OptConstantWord       %dprec 1
 -      | OptSignalWord %dprec 2
 -      ;
 +InterfaceDeclaration    : OptConstantWord       %dprec 1
 +        | OptSignalWord %dprec 2
 +        ;
  
 -OptConstantWord       : /* empty */
 -      | T_CONSTANT
 -      ;
 +OptConstantWord : /* empty */
 +        | T_CONSTANT
 +        ;
  
 -OptSignalWord : /* empty */
 -              { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
 -      | T_SIGNAL
 -      ;
 +OptSignalWord   : /* empty */
 +                { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
 +        | T_SIGNAL
 +        ;
  
  %%
  
@@@ -714,13 -721,18 +714,13 @@@ int yylex (void
      }
  }
  
 -int
 -main (void)
 -{
 -  yyparse();
 -  return 0;
 -}
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr8.c glr-regr8.y]], 0, [],
 -[glr-regr8.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr8.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr8])
  
  AT_PARSER_CHECK([[./glr-regr8]], 0,
@@@ -799,8 -811,8 +799,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr9.c glr-regr9.y]], 0, [],
 -[glr-regr9.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr9.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr9])
  
  AT_PARSER_CHECK([[./glr-regr9]], 0, [],
@@@ -855,8 -867,8 +855,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr10.c glr-regr10.y]], 0, [],
 -[glr-regr10.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr10.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr10])
  
  AT_PARSER_CHECK([[./glr-regr10]], 0, [], [])
@@@ -913,8 -925,8 +913,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr11.c glr-regr11.y]], 0, [],
 -[glr-regr11.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr11.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr11])
  
  AT_PARSER_CHECK([[./glr-regr11]], 0, [], [])
@@@ -1015,17 -1027,17 +1015,17 @@@ main (void
    int exit_status = yyparse ();
    if (parent_rhs_before_value)
      {
 -      fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
 +      fprintf (stderr, "'parent_rhs_before' destructor not called.\n");
        exit_status = 1;
      }
    if (merged_value)
      {
 -      fprintf (stderr, "`merged' destructor not called.\n");
 +      fprintf (stderr, "'merged' destructor not called.\n");
        exit_status = 1;
      }
    if (parent_rhs_after_value)
      {
 -      fprintf (stderr, "`PARENT_RHS_AFTER' destructor not called.\n");
 +      fprintf (stderr, "'PARENT_RHS_AFTER' destructor not called.\n");
        exit_status = 1;
      }
    return exit_status;
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr12.c glr-regr12.y]], 0, [],
 -[glr-regr12.y: conflicts: 1 shift/reduce, 1 reduce/reduce
 -])
 +[[glr-regr12.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +glr-regr12.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr12])
  
  AT_PARSER_CHECK([[./glr-regr12]], 0, [], [])
@@@ -1045,7 -1056,7 +1045,7 @@@ AT_CLEANU
  
  
  ## ------------------------------------------------------------------------- ##
 -## Incorrect lookahead during deterministic GLR.  See                      ##
 +## Incorrect lookahead during deterministic GLR.  See                        ##
  ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00017.html> and  ##
  ## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>.  ##
  ## ------------------------------------------------------------------------- ##
@@@ -1133,10 -1144,10 +1133,10 @@@ print_lookahead (char const *reduction
      {
        printf ("'%c', yylval='", yychar);
        if (yylval.value > ' ')
 -      printf ("%c", yylval.value);
 +        printf ("%c", yylval.value);
        printf ("', yylloc=(%d,%d),(%d,%d)",
 -            yylloc.first_line, yylloc.first_column,
 -            yylloc.last_line, yylloc.last_column);
 +              yylloc.first_line, yylloc.first_column,
 +              yylloc.last_line, yylloc.last_column);
      }
    printf ("\n");
  }
@@@ -1233,7 -1244,7 +1233,7 @@@ merge
    | conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
      USE ($3); USE ($5);
      print_lookahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
 -                    " defstate_shift");
 +                      " defstate_shift");
    }
    ;
  
@@@ -1280,7 -1291,7 +1280,7 @@@ alt1
      USE ($1);
      if (yychar != 'd' && yychar != YYEOF)
        {
 -      fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
 +        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
        }
    }
    ;
@@@ -1289,7 -1300,7 +1289,7 @@@ alt2
      USE ($1);
      if (yychar != 'd' && yychar != YYEOF)
        {
 -      fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
 +        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
        }
    }
    ;
@@@ -1298,7 -1309,7 +1298,7 @@@ alt3
      USE ($1);
      if (yychar != 'd' && yychar != YYEOF)
        {
 -      fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
 +        fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
        }
    }
    ;
@@@ -1306,8 -1317,8 +1306,8 @@@ no_look
    {
      if (yychar != YYEMPTY)
        {
 -      fprintf (stderr,
 -               "Found lookahead where shouldn't during stack explosion.\n");
 +        fprintf (stderr,
 +                 "Found lookahead where shouldn't during stack explosion.\n");
        }
    }
    ;
@@@ -1339,10 -1350,10 +1339,10 @@@ print_lookahead (char const *reduction
      {
        printf ("'%c', yylval='", yychar);
        if (yylval.value > ' ')
 -      printf ("%c", yylval.value);
 +        printf ("%c", yylval.value);
        printf ("', yylloc=(%d,%d),(%d,%d)",
 -            yylloc.first_line, yylloc.first_column,
 -            yylloc.last_line, yylloc.last_column);
 +              yylloc.first_line, yylloc.first_column,
 +              yylloc.last_line, yylloc.last_column);
      }
    printf ("\n");
  }
@@@ -1365,8 -1376,8 +1365,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr14.c glr-regr14.y]], 0, [],
 -[glr-regr14.y: conflicts: 3 reduce/reduce
 -])
 +[[glr-regr14.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr14])
  
  AT_PARSER_CHECK([[./glr-regr14]], 0,
@@@ -1449,7 -1460,7 +1449,7 @@@ main (void
    int exit_status = yyparse () != 1;
    if (parent_rhs_before_value)
      {
 -      fprintf (stderr, "`parent_rhs_before' destructor not called.\n");
 +      fprintf (stderr, "'parent_rhs_before' destructor not called.\n");
        exit_status = 1;
      }
    return exit_status;
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr15.c glr-regr15.y]], 0, [],
 -[glr-regr15.y: conflicts: 2 reduce/reduce
 -])
 +[[glr-regr15.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr15])
  
  AT_PARSER_CHECK([[./glr-regr15]], 0, [],
@@@ -1518,8 -1529,8 +1518,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr16.c glr-regr16.y]], 0, [],
 -[glr-regr16.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr16.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr16])
  
  AT_PARSER_CHECK([[./glr-regr16]], 0, [],
@@@ -1587,16 -1598,20 +1587,16 @@@ yylex (YYSTYPE *lvalp, YYLTYPE *llocp
    return input[toknum++];
  }
  
 -int
 -main (void)
 -{
 -  return yyparse () != 1;
 -}
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr17.c glr-regr17.y]], 0, [],
 -[glr-regr17.y: conflicts: 3 reduce/reduce
 -])
 +[[glr-regr17.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr17])
  
 -AT_PARSER_CHECK([[./glr-regr17]], 0, [],
 +AT_PARSER_CHECK([[./glr-regr17]], 1, [],
  [1.1-2.2: syntax is ambiguous
  ])
  
@@@ -1638,16 -1653,20 +1638,16 @@@ sym3: %merge<merge> { $$ = 0; } 
  %%
  ]AT_YYERROR_DEFINE[
  ]AT_YYLEX_DEFINE[
 -int
 -main (void)
 -{
 -  return yyparse ();
 -}
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
 -[glr-regr18.y:26.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
 -glr-regr18.y:25.18-24:     previous declaration
 -glr-regr18.y:27.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
 -glr-regr18.y:26.18-24:     previous declaration
 -])
 +[[glr-regr18.y:28.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
 +glr-regr18.y:27.18-24:     previous declaration
 +glr-regr18.y:29.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
 +glr-regr18.y:28.18-24:     previous declaration
 +]])
  
  AT_CLEANUP
  
  
  AT_SETUP([Ambiguity reports])
  
 -AT_BISON_OPTION_PUSHDEFS
 +AT_BISON_OPTION_PUSHDEFS([%debug])
  AT_DATA_GRAMMAR([input.y],
  [[
  %{
@@@ -1679,18 -1698,23 +1679,18 @@@ start
  b: 'b';
  d: /* nada.  */;
  %%
- ]AT_YYLEX_DEFINE(["abc"])[
  ]AT_YYERROR_DEFINE[
 -int
 -main (void)
 -{
 -  yydebug = 1;
 -  return !!yyparse ();
 -}
+ ]AT_YYLEX_DEFINE(["abc"])[
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o input.c input.y]], 0, [],
 -[input.y: conflicts: 1 reduce/reduce
 -])
 +[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([input])
  
 -AT_PARSER_CHECK([[./input]], 1, [],
 +AT_PARSER_CHECK([[./input --debug]], 1, [],
  [Starting parse
  Entering state 0
  Reading a token: Next token is token 'a' ()
@@@ -1699,14 -1723,14 +1699,14 @@@ Entering state 
  Reading a token: Next token is token 'b' ()
  Shifting token 'b' ()
  Entering state 3
 -Reducing stack 0 by rule 3 (line 25):
 +Reducing stack 0 by rule 3 (line 27):
     $1 = token 'b' ()
  -> $$ = nterm b ()
  Entering state 4
  Reading a token: Next token is token 'c' ()
  Shifting token 'c' ()
  Entering state 6
 -Reducing stack 0 by rule 4 (line 26):
 +Reducing stack 0 by rule 4 (line 28):
  -> $$ = nterm d ()
  Entering state 7
  Reading a token: Now at end of input.