]> git.saurik.com Git - bison.git/commitdiff
Merge remote-tracking branch 'origin/maint'
authorAkim Demaille <akim@lrde.epita.fr>
Sun, 1 Apr 2012 10:56:55 +0000 (12:56 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Sun, 1 Apr 2012 11:14:34 +0000 (13:14 +0200)
* origin/maint:
  bump to 2012 in skeletons.
  build: remove ancient Autoconf tests.
  doc: c++: complete the location documentation.
  c++: locations: provide convenience constructors.
  c++: locations: remove useless "inline".
  glr: do not use locations when they are not requested
  c++: use nullptr for C++11.
  build: simplify and improve the compiler warnings for tests.
  gnulib: update.
  maint: formatting changes.
  NEWS: update.
  Java: Fix syntax error handling without error token.
  tests: beware of -pedantic on large #line numbers.
  tests: when using the C++ compiler, use its flags too.

Conflicts:
data/glr.c
data/glr.cc
data/lalr1.cc
data/location.cc
data/yacc.c
tests/Makefile.am

16 files changed:
1  2 
NEWS
configure.ac
data/c++.m4
data/c.m4
data/glr.c
data/lalr1.cc
data/lalr1.java
data/location.cc
data/yacc.c
doc/bison.texinfo
src/system.h
tests/actions.at
tests/atlocal.in
tests/calc.at
tests/java.at
tests/regression.at

diff --combined NEWS
index 293e2dfda6a20e13191d58702d220fa313f77bcb,f552c3230b13419935281bf6ea626967eaa660f8..bb96c36e238ba91e2d10b7243db4652c4cb20e1a
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
  Bison News
  ----------
  
 +* Changes in version ?.? (????-??-??):
 +
 +** Additional yylex/yyparse arguments
 +
 +  The new directive %param declare additional argument to both yylex
 +  and yyparse.  The %lex-param, %parse-param, and %param directives
 +  support one or more arguments.  Instead of
 +
 +      %lex-param   {arg1_type *arg1}
 +      %lex-param   {arg2_type *arg2}
 +      %parse-param {arg1_type *arg1}
 +      %parse-param {arg2_type *arg2}
 +
 +  one may now declare
 +
 +      %param {arg1_type *arg1} {arg2_type *arg2}
 +
 +** Java skeleton improvements
 +
 +  The constants for token names were moved to the Lexer interface.
 +  Also, it is possible to add code to the parser's constructors using
 +  "%code init" and "%define init_throws".
 +
 +** C++ skeleton improvements
 +
 +  The C++ parser features a syntax_error exception, which can be
 +  thrown from the scanner or from user rules to raise syntax errors.
 +  This facilitates reporting errors caught in sub-functions (e.g.,
 +  rejecting too large integral literals from a conversion function
 +  used by the scanner, or rejecting invalid combinations from a
 +  factory invoked by the user actions).
 +
 +** Variable api.tokens.prefix
 +
 +  The variable api.tokens.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.tokens.prefix "TOK_"
 +      %%
 +      start: FILE for ERROR;
 +
 +  will generate the definition of the symbols TOK_FILE, TOK_for, and
 +  TOK_ERROR in the generated sources.  In particular, the scanner must
 +  use these prefixed token names, although the grammar itself still
 +  uses the short names (as in the sample rule given above).
 +
 +** Variable api.namespace
 +
 +  The "namespace" variable is renamed "api.namespace".  Backward
 +  compatibility is ensured, but upgrading is recommended.
 +
 +** Variable parse.error
 +
 +  The variable error controls the verbosity of error messages.  The
 +  use of the %error-verbose directive is deprecated in favor of
 +  %define parse.error "verbose".
 +
 +** Semantic predicates
 +
 +  The new, experimental, semantic-predicate feature allows actions of
 +  the form %?{ BOOLEAN-EXPRESSION }, which cause syntax errors (as for
 +  YYERROR) if the expression evaluates to 0, and are evaluated immediately
 +  in GLR parsers, rather than being deferred.  The result is that they
 +  allow the programmer to prune possible parses based on the values of
 +  runtime expressions.
 +
  * Changes in version 2.5.1 (????-??-??):
  
- ** Some portability problems in the test suite have been fixed.
+ ** Several portability problems in the test suite have been fixed:
  
- ** Minor improvements have been made to the manual.
+   This includes warnings with some compilers, unexpected behavior of
+   tools such as diff, warning messages from the test suite itself,
+   etc.
+   __attribute__ is not longer disabled when __STRICT_ANSI__ is defined
+   (i.e., when -std is passed to GCC).
+ ** Warnings during the build procedure have been eliminated.
+ ** Many minor improvements have been made to the manual:
+   The layout for grammar has changed to a more compact scheme.  Named
+   references are motivated.  The description of the automaton
+   description file is updated.
  
  ** YYBACKUP works as expected.
  
+ ** liby is no longer asking for "rpl_fprintf" on some platforms.
+ ** Several Java fixes:
+   The Java parser no longer throws ArrayIndexOutOfBoundsException if
+   the first token leads to a syntax error.  Some minor clean ups.
+ ** C++11 compatibility:
+   C and C++ parsers use nullptr instead of 0 when __cplusplus is
+   201103L or higher.
+ ** C++ locations:
+   The position and location constructors (and their initialize
+   methods) accept new arguments for line and column.  Several issues
+   in the documentation were fixed.
  * Changes in version 2.5 (2011-05-14):
  
  ** Grammar symbol names can now contain non-initial dashes:
    if the symbols have destructors.  For instance:
  
       exp: exp "?" exp ":" exp { $1 ? $1 : $3; }
 -      | exp "+" exp
 -      ;
 +        | exp "+" exp
 +        ;
  
    will trigger a warning about $$ and $5 in the first rule, and $3 in
    the second ($1 is copied to $$ by the default rule).  This example
    most likely contains three errors, and could be rewritten as:
  
       exp: exp "?" exp ":" exp
 -          { $$ = $1 ? $3 : $5; free ($1 ? $5 : $3); free ($1); }
 -      | exp "+" exp
 -          { $$ = $1 ? $1 : $3; if ($1) free ($3); }
 -      ;
 +            { $$ = $1 ? $3 : $5; free ($1 ? $5 : $3); free ($1); }
 +        | exp "+" exp
 +            { $$ = $1 ? $1 : $3; if ($1) free ($3); }
 +        ;
  
    However, if the original actions were really intended, memory leaks
    and all, the warnings can be suppressed by letting Bison believe the
    values are used, e.g.:
  
       exp: exp "?" exp ":" exp { $1 ? $1 : $3; (void) ($$, $5); }
 -      | exp "+" exp         { $$ = $1; (void) $3; }
 -      ;
 +        | exp "+" exp         { $$ = $1; (void) $3; }
 +        ;
  
    If there are mid-rule actions, the warning is issued if no action
    uses it.  The following triggers no warning: $1 and $3 are used.
    In agreement with POSIX and with other Yaccs, leaving a default
    action is valid when $$ is untyped, and $1 typed:
  
 -      untyped: ... typed;
 +        untyped: ... typed;
  
    but the converse remains an error:
  
 -      typed: ... untyped;
 +        typed: ... untyped;
  
  ** Values of mid-rule actions
    The following code:
  
 -      foo: { ... } { $$ = $1; } ...
 +        foo: { ... } { $$ = $1; } ...
  
    was incorrectly rejected: $1 is defined in the second mid-rule
    action, and is equal to the $$ of the first mid-rule action.
diff --combined configure.ac
index 622da5da4a8efb4e01a3b50893ce474738b2a1c8,688e18efe74bb137d714af6fc24ea59f616e57ae..abe2a530dcdceb38c8a8e08eb02e288a119737ac
@@@ -45,9 -45,7 +45,9 @@@ AC_CONFIG_MACRO_DIR([m4]
  # releases, we want to be able run make dist without being required to
  # add a bogus NEWS entry.  In that case, the version string
  # automatically contains a dash, which we also let disable gnits.
 -AM_INIT_AUTOMAKE([1.11.1 dist-xz silent-rules]
 +AM_INIT_AUTOMAKE([1.11.1 dist-xz nostdinc
 +                 color-tests parallel-tests
 +                 silent-rules]
                   m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]],
                             [gnu], [gnits]))
  AM_SILENT_RULES([yes])
@@@ -55,6 -53,7 +55,7 @@@ AC_CONFIG_HEADERS([lib/config.h:lib/con
  
  # Checks for the compiler.
  AC_PROG_CC_STDC
+ AC_PROG_CXX
  
  # Gnulib (early checks).
  gl_EARLY
@@@ -67,31 -66,36 +68,36 @@@ AC_ARG_ENABLE([gcc-warnings]
   esac],
                [enable_gcc_warnings=no])
  if test "$enable_gcc_warnings" = yes; then
+   warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align
+     -Wcast-qual -Wformat -Wpointer-arith -Wwrite-strings'
+   warn_c='-Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes
+     -Wshadow -Wstrict-prototypes'
+   warn_cxx='-Wnoexcept -Wzero-as-null-pointer-constant'
+   AC_LANG_PUSH([C])
+   for i in $warn_common $warn_c;
+   do
+     gl_WARN_ADD([$i], [WARN_CFLAGS])
+   done
    gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
-   AC_SUBST([WERROR_CFLAGS])
-   gl_WARN_ADD([-Wall])
-   gl_WARN_ADD([-Wextra -Wno-sign-compare])
-   gl_WARN_ADD([-Wcast-align])
-   gl_WARN_ADD([-Wcast-qual])
-   gl_WARN_ADD([-Wformat])
-   gl_WARN_ADD([-Wpointer-arith])
-   gl_WARN_ADD([-Wwrite-strings])
-   AC_SUBST([WARN_CXXFLAGS], [$WARN_CFLAGS])
-   # The following warnings are not suitable for C++.
-   gl_WARN_ADD([-Wbad-function-cast])
-   gl_WARN_ADD([-Wmissing-declarations])
-   gl_WARN_ADD([-Wmissing-prototypes])
-   gl_WARN_ADD([-Wshadow])
-   gl_WARN_ADD([-Wstrict-prototypes])
-   AC_SUBST([WARN_CFLAGS])
    # Warnings for the test suite only.
    gl_WARN_ADD([-Wundef], [WARN_CFLAGS_TEST])
    gl_WARN_ADD([-pedantic], [WARN_CFLAGS_TEST])
-   AC_SUBST([WARN_CXXFLAGS_TEST], ["$WARN_CXXFLAGS $WARN_CFLAGS_TEST"])
-   AC_SUBST([WARN_CFLAGS_TEST], ["$WARN_CFLAGS $WARN_CFLAGS_TEST"])
+   AC_LANG_POP([C])
+   AC_LANG_PUSH([C++])
+   for i in $warn_common $warn_cxx;
+   do
+     gl_WARN_ADD([$i], [WARN_CXXFLAGS])
+   done
+   gl_WARN_ADD([-Werror], [WERROR_CXXFLAGS])
+   # Warnings for the test suite only.
+   gl_WARN_ADD([-Wundef], [WARN_CXXFLAGS_TEST])
+   gl_WARN_ADD([-pedantic], [WARN_CXXFLAGS_TEST])
+   AC_LANG_POP([C++])
  fi
  
  BISON_TEST_FOR_WORKING_C_COMPILER
+ BISON_TEST_FOR_WORKING_CXX_COMPILER
  
  AC_ARG_ENABLE([yacc],
    [AC_HELP_STRING([--disable-yacc],
    , [enable_yacc=yes])
  case $enable_yacc in
  yes)
 -  YACC_SCRIPT=yacc
 -  YACC_LIBRARY=liby.a;;
 +  YACC_SCRIPT=src/yacc
 +  YACC_LIBRARY=lib/liby.a;;
  *)
    YACC_SCRIPT=
    YACC_LIBRARY=;;
@@@ -133,7 -137,6 +139,6 @@@ gl_INI
  # Checks for library functions.
  AC_CHECK_FUNCS_ONCE([setlocale])
  AM_WITH_DMALLOC
- BISON_PREREQ_SUBPIPE
  BISON_PREREQ_TIMEVAR
  
  # Gettext.
@@@ -154,34 -157,24 +159,30 @@@ AC_CONFIG_FILES([etc/bench.pl], [chmod 
  
  # Initialize the test suite.
  AC_CONFIG_TESTDIR(tests)
 -AC_CONFIG_FILES([tests/Makefile tests/atlocal])
 +AC_CONFIG_FILES([tests/atlocal])
  AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison])
  AC_CHECK_PROGS([VALGRIND], [valgrind])
- AC_PROG_CXX
- BISON_TEST_FOR_WORKING_CXX_COMPILER
  AM_MISSING_PROG([AUTOM4TE], [autom4te])
  # Needed by tests/atlocal.in.
  AC_SUBST([GCC])
- AC_SUBST([O0CFLAGS],   [`echo $CFLAGS   | sed 's/-O[[0-9]] *//'`])
- AC_SUBST([O0CXXFLAGS], [`echo $CXXFLAGS | sed 's/-O[[0-9]] *//'`])
  
 -gt_JAVACOMP([1.3])
 +gt_JAVACOMP([1.3], [1.4])
  gt_JAVAEXEC
  
 +# We use gnulib, but from lib/local.mk instead of lib/Makefile.am.
 +# So prefix paths with lib/.  See also etc/prefix-gnulib-mk.
 +gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, , lib/,g'`
 +# Listing the names of the variables to prefix is error-prone.
 +# Rather, adjust all the AC_SUBST variables whose name ends in '_H',
 +# and whose content ends in '.h'.
 +for ac_var in $ac_subst_vars
 +do
 +  eval "ac_val=\$$ac_var"
 +  case $ac_var=$ac_val in
 +    (*_H=*.h) eval "$ac_var=lib/\$$ac_var";;
 +  esac
 +done
  AC_CONFIG_FILES([Makefile
 -               build-aux/Makefile
 -               po/Makefile.in
 -               data/Makefile
 -               etc/Makefile
 -               examples/Makefile
 -                  examples/calc++/Makefile
 -               lib/Makefile src/Makefile
 -               doc/Makefile
 -                 doc/yacc.1])
 +                 po/Makefile.in
 +                 doc/yacc.1])
  AC_OUTPUT
diff --combined data/c++.m4
index 00db21d3baf629f4ab6cf2832625bd4903fe06d1,9913a1720dcd626ae04363901d3711f92616be90..f1468c708086ebe6bdad5cab3c4728acbeb1ea95
@@@ -23,6 -23,7 +23,6 @@@ m4_include(b4_pkgdatadir/[c.m4]
  ## Default values.  ##
  ## ---------------- ##
  
 -# Default parser class name.
  b4_percent_define_default([[parser_class_name]], [[parser]])
  
  # Don't do that so that we remember whether we're using a user
  # b4_percent_define_default([[location_type]], [[location]])
  
  b4_percent_define_default([[filename_type]], [[std::string]])
 -b4_percent_define_default([[namespace]], m4_defn([b4_prefix]))
 +b4_percent_define_default([[api.namespace]], m4_defn([b4_prefix]))
 +
  b4_percent_define_default([[global_tokens_and_yystype]], [[false]])
  b4_percent_define_default([[define_location_comparison]],
                            [m4_if(b4_percent_define_get([[filename_type]]),
                                   [std::string], [[true]], [[false]])])
  
  
 +
  ## ----------- ##
  ## Namespace.  ##
  ## ----------- ##
  
 -m4_define([b4_namespace_ref], [b4_percent_define_get([[namespace]])])
 +m4_define([b4_namespace_ref], [b4_percent_define_get([[api.namespace]])])
 +
  
  # Don't permit an empty b4_namespace_ref.  Any `::parser::foo' appended to it
  # would compile as an absolute reference with `parser' in the global namespace.
@@@ -55,7 -53,7 +55,7 @@@
  # include the header, which is always generated.  If we ever need to permit
  # internal linkage somehow, surely we can find a cleaner approach.
  m4_if(m4_bregexp(b4_namespace_ref, [^[         ]*$]), [-1], [],
 -[b4_complain_at(b4_percent_define_get_loc([[namespace]]),
 +[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]),
                  [[namespace reference is empty]])])
  
  # Instead of assuming the C++ compiler will do it, Bison should reject any
  # Specifically, don't allow empty names as b4_namespace_open would just convert
  # those into anonymous namespaces, and that might tempt some users.
  m4_if(m4_bregexp(b4_namespace_ref, [::[        ]*::]), [-1], [],
 -[b4_complain_at(b4_percent_define_get_loc([[namespace]]),
 +[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]),
                  [[namespace reference has consecutive "::"]])])
  m4_if(m4_bregexp(b4_namespace_ref, [::[        ]*$]), [-1], [],
 -[b4_complain_at(b4_percent_define_get_loc([[namespace]]),
 +[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]),
                  [[namespace reference has a trailing "::"]])])
  
  m4_define([b4_namespace_open],
 -[b4_user_code([b4_percent_define_get_syncline([[namespace]])
 +[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])
  [namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref),
                                                  [^\(.\)[       ]*::], [\1])),
                           [::], [ { namespace ])[ {]])])
  
  m4_define([b4_namespace_close],
 -[b4_user_code([b4_percent_define_get_syncline([[namespace]])
 +[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])
  m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
                                      [^\(.\)[   ]*\(::\)?\([^][:]\|:[^:]\)*],
                                      [\1])),
@@@ -99,267 -97,18 +99,269 @@@ m4_map_sep([     b4_token_enum], [
  ])
  
  
  ## ----------------- ##
  ## Semantic Values.  ##
  ## ----------------- ##
  
 +# b4_semantic_type_declare
 +# ------------------------
 +# Declare semantic_type.
 +m4_define([b4_semantic_type_declare],
 +[    /// Symbol semantic values.
 +m4_ifdef([b4_stype],
 +[    union semantic_type
 +    {b4_user_stype
 +    };],
 +[m4_if(b4_tag_seen_flag, 0,
 +[[    typedef int semantic_type;]],
 +[[    typedef YYSTYPE semantic_type;]])])])
 +
 +
 +# b4_public_types_declare
 +# -----------------------
 +# Define the public types: token, semantic value, location, and so forth.
 +# Depending on %define token_lex, may be output in the header or source file.
 +m4_define([b4_public_types_declare],
 +[[#ifndef YYSTYPE
 +]b4_semantic_type_declare[
 +#else
 +    typedef YYSTYPE semantic_type;
 +#endif]b4_locations_if([
 +    /// Symbol locations.
 +    typedef b4_percent_define_get([[location_type]],
 +                                  [[location]]) location_type;])[
 +
 +    /// Syntax errors thrown from user actions.
 +    struct syntax_error : std::runtime_error
 +    {
 +      syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m);]b4_locations_if([
 +      location_type location;])[
 +    };
 +
 +    /// Tokens.
 +    struct token
 +    {
 +      ]b4_token_enums(b4_tokens)[
 +    };
 +
 +    /// Token type.
 +    typedef token::yytokentype token_type;
 +
 +    /// A complete symbol, with its type.
 +    template <typename Exact>
 +    struct symbol_base_type
 +    {
 +      /// Default constructor.
 +      inline symbol_base_type ();
 +
 +      /// Constructor.]b4_locations_if([
 +      inline symbol_base_type (const location_type& l)])[;
 +      inline symbol_base_type (]b4_args(
 +        [const semantic_type& v],
 +        b4_locations_if([const location_type& l]))[);
 +
 +      /// Return this with its exact type.
 +      const Exact& self () const;
 +      Exact& self ();
 +
 +      /// Return the type of this symbol.
 +      int type_get () const;
 +
 +      /// The semantic value.
 +      semantic_type value;]b4_locations_if([
 +
 +      /// The location.
 +      location_type location;])[
 +    };
 +
 +    /// External form of a symbol: its type and attributes.
 +    struct symbol_type : symbol_base_type<symbol_type>
 +    {
 +      /// The parent class.
 +      typedef symbol_base_type<symbol_type> super_type;
 +
 +      /// Default constructor.
 +      inline symbol_type ();
 +
 +      /// Constructor for tokens with semantic value.
 +      inline symbol_type (]b4_args([token_type t],
 +                                   [const semantic_type& v],
 +                                   b4_locations_if([const location_type& l]))[);
 +
 +      /// Constructor for valueless tokens.
 +      inline symbol_type (]b4_args([token_type t],
 +                                   b4_locations_if([const location_type& l]))[);
 +
 +      /// The symbol type.
 +      int type;
 +
 +      /// The symbol type.
 +      inline int type_get_ () const;
 +
 +      /// The token.
 +      inline token_type token () const;
 +    };
 +]b4_symbol_constructor_declare])
 +
 +
 +# b4_public_types_define
 +# ----------------------
 +# Provide the implementation needed by the public types.
 +m4_define([b4_public_types_define],
 +[[  inline
 +  ]b4_parser_class_name[::syntax_error::syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m)
 +    : std::runtime_error (m)]b4_locations_if([
 +    , location (l)])[
 +  {}
 +
 +  // symbol_base_type.
 +  template <typename Exact>
 +  inline
 +  ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type ()
 +    : value()]b4_locations_if([
 +    , location()])[
 +  {
 +  }]b4_locations_if([[
 +
 +  template <typename Exact>
 +  inline
 +  ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type (const location_type& l)
 +    : value()
 +    , location(l)
 +  {
 +  }]])[
 +
 +  template <typename Exact>
 +  inline
 +  ]b4_parser_class_name[::symbol_base_type<Exact>::symbol_base_type (]b4_args(
 +          [const semantic_type& v],
 +          b4_locations_if([const location_type& l]))[)
 +    : value(v)]b4_locations_if([
 +    , location(l)])[
 +  {
 +  }
 +
 +  template <typename Exact>
 +  inline
 +  const Exact&
 +  ]b4_parser_class_name[::symbol_base_type<Exact>::self () const
 +  {
 +    return static_cast<const Exact&>(*this);
 +  }
 +
 +  template <typename Exact>
 +  inline
 +  Exact&
 +  ]b4_parser_class_name[::symbol_base_type<Exact>::self ()
 +  {
 +    return static_cast<Exact&>(*this);
 +  }
 +
 +  template <typename Exact>
 +  inline
 +  int
 +  ]b4_parser_class_name[::symbol_base_type<Exact>::type_get () const
 +  {
 +    return self ().type_get_ ();
 +  }
 +
 +  // symbol_type.
 +  inline
 +  ]b4_parser_class_name[::symbol_type::symbol_type ()
 +    : super_type ()
 +    , type ()
 +  {
 +  }
 +
 +  inline
 +  ]b4_parser_class_name[::symbol_type::symbol_type (]b4_args(
 +                [token_type t],
 +                b4_locations_if([const location_type& l]))[)
 +    : super_type (]b4_locations_if([l])[)
 +    , type (yytranslate_ (t))
 +  {
 +  }
 +
 +  inline
 +  ]b4_parser_class_name[::symbol_type::symbol_type (]b4_args(
 +                 [token_type t],
 +                 [const semantic_type& v],
 +                 b4_locations_if([const location_type& l]))[)
 +    : super_type (v]b4_locations_if([, l])[)
 +    , type (yytranslate_ (t))
 +  {
 +  }
 +
 +  inline
 +  int
 +  ]b4_parser_class_name[::symbol_type::type_get_ () const
 +  {
 +    return type;
 +  }
 +]b4_lex_symbol_if([[
 +  inline
 +  ]b4_parser_class_name[::token_type
 +  ]b4_parser_class_name[::symbol_type::token () const
 +  {
 +    // YYTOKNUM[NUM] -- (External) token number corresponding to the
 +    // (internal) symbol number NUM (which must be that of a token).  */
 +    static
 +    const ]b4_int_type_for([b4_toknum])[
 +    yytoken_number_[] =
 +    {
 +  ]b4_toknum[
 +    };
 +    return static_cast<token_type> (yytoken_number_[type]);
 +  }
 +]])[]dnl
 +b4_symbol_constructor_define])
 +
 +
 +# b4_symbol_constructor_declare
 +# b4_symbol_constructor_define
 +# -----------------------------
 +# Declare/define symbol constructors for all the value types.
 +# Use at class-level.  Redefined in variant.hh.
 +m4_define([b4_symbol_constructor_declare], [])
 +m4_define([b4_symbol_constructor_define], [])
 +
 +
 +# b4_yytranslate_define
 +# ---------------------
 +# Define yytranslate_.  Sometimes used in the header file,
 +# sometimes in the cc file.
 +m4_define([b4_yytranslate_define],
 +[[  // Symbol number corresponding to token number t.
 +  ]b4_parser_class_name[::token_number_type
 +  ]b4_parser_class_name[::yytranslate_ (]b4_lex_symbol_if([token_type],
 +                                                          [int])[ t)
 +  {
 +    static
 +    const token_number_type
 +    translate_table[] =
 +    {
 +]b4_translate[
 +    };
 +    const unsigned int user_token_number_max_ = ]b4_user_token_number_max[;
 +    const token_number_type undef_token_ = ]b4_undef_token_number[;
 +
 +    if (static_cast<int>(t) <= yyeof_)
 +      return yyeof_;
 +    else if (static_cast<unsigned int> (t) <= user_token_number_max_)
 +      return translate_table[t];
 +    else
 +      return undef_token_;
 +  }
 +]])
 +
  
  # b4_lhs_value([TYPE])
  # --------------------
  # 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],
 -[(yysemantic_stack_@{($1) - ($2)@}m4_ifval([$3], [.$3]))])
 +[b4_symbol_value([yysemantic_stack_@{($1) - ($2)@}], [$3])])
 +
  
  # b4_lhs_location()
  # -----------------
@@@ -405,24 -153,24 +407,24 @@@ m4_define([b4_parse_param_decl_1]
  # Extra initialisations of the constructor.
  m4_define([b4_parse_param_cons],
            [m4_ifset([b4_parse_param],
 -                  [
 +                    [
        b4_cc_constructor_calls(b4_parse_param)])])
  m4_define([b4_cc_constructor_calls],
 -        [m4_map_sep([b4_cc_constructor_call], [,
 +          [m4_map_sep([b4_cc_constructor_call], [,
        ], [$@])])
  m4_define([b4_cc_constructor_call],
 -        [$2 ($2_yyarg)])
 +          [$2 ($2_yyarg)])
  
  # b4_parse_param_vars
  # -------------------
  # Extra instance variables.
  m4_define([b4_parse_param_vars],
            [m4_ifset([b4_parse_param],
 -                  [
 +                    [
      /* User arguments.  */
  b4_cc_var_decls(b4_parse_param)])])
  m4_define([b4_cc_var_decls],
 -        [m4_map_sep([b4_cc_var_decl], [
 +          [m4_map_sep([b4_cc_var_decl], [
  ], [$@])])
  m4_define([b4_cc_var_decl],
 -        [    $1;])
 +          [    $1;])
diff --combined data/c.m4
index 41f56956458812dcea8f66574cec10e02709c910,195c441d4219db19951919aa009a0b246c9e5392..14db807b2b72e84463d742e5610f9ea9f757fdf1
+++ b/data/c.m4
  ## Identification.  ##
  ## ---------------- ##
  
 -# b4_comment(TEXT)
 -# ----------------
 -m4_define([b4_comment], [/* m4_bpatsubst([$1], [
 -], [
 -   ])  */])
 +# b4_comment_(TEXT, OPEN, CONTINUE, END)
 +# -------------------------------------
 +# Put TEXT in comment.  Avoid trailing spaces: don't indent empty lines.
 +# Avoid adding indentation to the first line, as the indentation comes
 +# from OPEN.  That's why we don't patsubst([$1], [^\(.\)], [   \1]).
 +#
 +# Prefix all the output lines with PREFIX.
 +m4_define([b4_comment_], [$2[]m4_bpatsubst([$1], [
 +\(.\)], [
 +$3\1])$4])
 +
 +
 +# b4_c_comment(TEXT, [PREFIX])
 +# ----------------------------
 +# Put TEXT in comment.  Avoid trailing spaces: don't indent empty lines.
 +# Avoid adding indentation to the first line, as the indentation comes
 +# from "/*".  That's why we don't patsubst([$1], [^\(.\)], [   \1]).
 +#
 +# Prefix all the output lines with PREFIX.
 +m4_define([b4_c_comment],
 +[b4_comment_([$1], [$2/* ], [$2   ], [$2  */])])
 +
 +
 +# b4_comment(TEXT, [PREFIX])
 +# --------------------------
 +# By default, C comments.
 +m4_define([b4_comment], [b4_c_comment($@)])
 +
  
  # b4_identification
  # -----------------
@@@ -75,7 -52,7 +75,7 @@@ m4_define([b4_identification]
  #define YYPULL ]b4_pull_flag])[
  
  /* Using locations.  */
 -#define YYLSP_NEEDED ]b4_locations_flag[
 +#define YYLSP_NEEDED ]b4_locations_if([1], [0])[
  ]])
  
  
@@@ -120,13 -97,11 +120,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
  ])
  
@@@ -148,7 -123,7 +148,7 @@@ m4_define([b4_int_type]
  
         m4_eval([0 <= $1]),                [1], [unsigned int],
  
 -                                             [int])])
 +                                               [int])])
  
  
  # b4_int_type_for(NAME)
@@@ -171,27 -146,32 +171,42 @@@ m4_define([b4_table_value_equals]
         [[YYID (0)]],
         [[((]$2[) == (]$3[))]])])
  
  ## ---------##
  ## Values.  ##
  ## ---------##
  
- # b4_null
- ---------
- # Return a null pointer constant.  NULL infringes on the user name
- # space in C, so use 0 rather than NULL.
- m4_define([b4_null], [0])
  
+ # b4_null_define
+ # --------------
+ # Portability issues: define a YY_NULL appropriate for the current
+ # language (C, C++98, or C++11).
+ m4_define([b4_null_define],
+ [# ifndef YY_NULL
+ #  if defined __cplusplus && 201103L <= __cplusplus
+ #   define YY_NULL nullptr
+ #  else
+ #   define YY_NULL 0
+ #  endif
+ # endif[]dnl
+ ])
+ # b4_null
+ # -------
+ # Return a null pointer constant.
+ m4_define([b4_null], [YY_NULL])
  
 +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
 +# -------------------------------------------------------------
 +# Define "yy<TABLE-NAME>" which contents is CONTENT.
 +m4_define([b4_integral_parser_table_define],
 +[m4_ifvaln([$3], [b4_c_comment([$3], [  ])])dnl
 +static const b4_int_type_for([$2]) yy$1[[]] =
 +{
 +  $2
 +};dnl
 +])
  
  
  ## ------------------------- ##
  # -----------------------------------------
  # Output the definition of this token as #define.
  m4_define([b4_token_define],
 -[#define $1 $2
 +[#define b4_percent_define_get([api.tokens.prefix])$1 $2
  ])
  
  
@@@ -220,7 -200,7 +235,7 @@@ m4_map([b4_token_define], [$@])]
  # ---------------------------------------
  # Output the definition of this token as an enum.
  m4_define([b4_token_enum],
 -[$1 = $2])
 +[b4_percent_define_get([api.tokens.prefix])$1 = $2])
  
  
  # b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
@@@ -236,7 -216,7 +251,7 @@@ m4_define([b4_token_enums]
     enum yytokentype {
  m4_map_sep([     b4_token_enum], [,
  ],
 -         [$@])
 +           [$@])
     };
  #endif
  ])])
@@@ -251,21 -231,6 +266,21 @@@ m4_define([b4_token_enums_defines]
  ])
  
  
 +## ----------------- ##
 +## Semantic Values.  ##
 +## ----------------- ##
 +
 +
 +# b4_symbol_value(VAL, [TYPE])
 +# ----------------------------
 +# Given a semantic value VAL ($$, $1 etc.), extract its value of type
 +# TYPE if TYPE is given, otherwise just return VAL.  The result can be
 +# used safetly, it is put in parens to avoid nasty precedence issues.
 +# TYPE is *not* put in braces, provide some if needed.
 +m4_define([b4_symbol_value],
 +[($1[]m4_ifval([$2], [.$2]))])
 +
 +
  
  ## --------------------------------------------- ##
  ## Defining C functions in both K&R and ANSI-C.  ##
@@@ -315,7 -280,7 +330,7 @@@ $1 (b4_c_ansi_formals(m4_shift2($@)))[]
  m4_define([b4_c_ansi_formals],
  [m4_if([$#], [0], [void],
         [$#$1], [1], [void],
 -             [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
 +               [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
  
  m4_define([b4_c_ansi_formal],
  [$1])
@@@ -336,9 -301,9 +351,9 @@@ m4_define([b4_c_knr_formal_name]
  # 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;])
  # -----------------------------------------------------------
  # Declare the function NAME.
  m4_define([b4_c_function_decl],
 -[#if defined __STDC__ || defined __cplusplus
 +[#if b4_c_modern
  b4_c_ansi_function_decl($@)
  #else
  $2 $1 ();
@@@ -413,17 -378,24 +428,17 @@@ 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)
 -# -------------------------------------------------
 -m4_define([b4_symbol_actions],
 -[m4_pushdef([b4_dollar_dollar],
 -   [m4_ifval([$6], [(yyvaluep->$6)], [(*yyvaluep)])])dnl
 -m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
 -      case $4: /* $3 */
 -b4_syncline([$2], [$1])
 -      $5;
 +
 +# b4_predicate_case(LABEL, CONDITIONS)
 +# ------------------------------------
 +m4_define([b4_predicate_case],
 +[  case $1:
 +    if (! ($2)) YYERROR;
  b4_syncline([@oline@], [@ofile@])
 -      break;
 -m4_popdef([b4_at_dollar])dnl
 -m4_popdef([b4_dollar_dollar])dnl
 -])
 +    break;])
  
  
  # b4_yydestruct_generate(FUNCTION-DECLARATOR)
@@@ -445,16 -417,20 +460,16 @@@ m4_define_default([b4_yydestruct_genera
  b4_locations_if(            [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
 -  YYUSE (yyvaluep);
 -]b4_locations_if([  YYUSE (yylocationp);
 -])dnl
 -b4_parse_param_use[]dnl
 -[
 -  if (!yymsg)
 +]b4_parse_param_use([yyvaluep], [yylocationp])dnl
 +[  if (!yymsg)
      yymsg = "Deleting";
    YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
  
    switch (yytype)
      {
 -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
 -      default:
 -      break;
 +]b4_symbol_foreach([b4_symbol_destructor])dnl
 +[      default:
 +        break;
      }
  }]dnl
  ])
@@@ -474,27 -450,28 +489,27 @@@ m4_define_default([b4_yy_symbol_print_g
  /*ARGSUSED*/
  ]$1([yy_symbol_value_print],
      [static void],
 -             [[FILE *yyoutput],                       [yyoutput]],
 -             [[int yytype],                           [yytype]],
 -             [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
 +               [[FILE *yyoutput],                       [yyoutput]],
 +               [[int yytype],                           [yytype]],
 +               [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
  b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
 -  if (!yyvaluep)
 -    return;
 -]b4_locations_if([  YYUSE (yylocationp);
 -])dnl
 -b4_parse_param_use[]dnl
 -[# ifdef YYPRINT
 +]b4_parse_param_use([yyoutput], [yylocationp])dnl
 +[  if (!yyvaluep)
 +    return;]
 +dnl glr.c does not feature yytoknum.
 +m4_if(b4_skeleton, ["yacc.c"],
 +[[# ifdef YYPRINT
    if (yytype < YYNTOKENS)
      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 -# else
 -  YYUSE (yyoutput);
  # endif
 -  switch (yytype)
 +]])dnl
 +[  switch (yytype)
      {
 -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 +]b4_symbol_foreach([b4_symbol_printer])dnl
  [      default:
 -      break;
 +        break;
      }
  }
  
  
  ]$1([yy_symbol_print],
      [static void],
 -             [[FILE *yyoutput],                       [yyoutput]],
 -             [[int yytype],                           [yytype]],
 -             [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
 +               [[FILE *yyoutput],                       [yyoutput]],
 +               [[int yytype],                           [yytype]],
 +               [[YYSTYPE const * const yyvaluep],       [yyvaluep]][]dnl
  b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
diff --combined data/glr.c
index b92586882203c1f620848cc8ee692c55a8e864ab,d0b269263dadb32ba1bedd7bef6c858550d02964..37f40aee4ff240bc27a87d847567a01ad43fb6a5
@@@ -93,13 -93,27 +93,27 @@@ m4_define([b4_lpure_args]
  [b4_pure_if([b4_locations_if([, &yylloc])])[]b4_user_args])
  
  
  # b4_pure_formals
  # ---------------
- # Arguments passed to yyerror: user formals plus yylocp.
+ # Arguments passed to yyerror: user formals plus yylocp with leading comma.
  m4_define([b4_pure_formals],
  [b4_pure_if([b4_locations_if([, YYLTYPE *yylocp])])[]b4_user_formals])
  
  
+ # b4_locuser_formals(LOC = yylocp)
+ # --------------------------------
+ m4_define([b4_locuser_formals],
+ [b4_locations_if([, YYLTYPE *m4_default([$1], [yylocp])])[]b4_user_formals])
+ # b4_locuser_args(LOC = yylocp)
+ # -----------------------------
+ m4_define([b4_locuser_args],
+ [b4_locations_if([, m4_default([$1], [yylocp])])[]b4_user_args])
  ## ----------------- ##
  ## Semantic Values.  ##
  ## ----------------- ##
  # --------------------
  # 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])])
  
  
  
@@@ -145,7 -151,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],
 -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)])
 +[(b4_rhs_data([$1], [$2]).yyloc)])
  
  
  
@@@ -179,6 -185,8 +193,8 @@@ m4_if(b4_prefix, [yy], []
  /* Copy the first part of user declarations.  */
  ]b4_user_pre_prologue
  
+ b4_null_define
  dnl # b4_shared_declarations
  dnl # ----------------------
  dnl # Declaration that might either go into the header (if --defines)
@@@ -220,11 -228,11 +236,11 @@@ typedef struct YYLTYP
  ])
  
  b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
 -            [b4_shared_declarations])[
 +              [b4_shared_declarations])[
  
  /* Enabling traces.  */
  #ifndef YYDEBUG
 -# define YYDEBUG ]b4_debug_flag[
 +# define YYDEBUG ]b4_parse_trace_if([1], [0])[
  #endif
  
  /* Enabling verbose error messages.  */
  # 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
  
  /* Enabling the token table.  */
@@@ -318,8 -326,7 +334,7 @@@ b4_percent_code_get[]dn
  #ifndef __attribute__
  /* This feature is available in gcc versions 2.5 and later.  */
  # if (! defined __GNUC__ || __GNUC__ < 2 \
-       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) \
-       || (defined __STRICT_ANSI__ && __STRICT_ANSI__))
+       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
  #  define __attribute__(Spec) /* empty */
  # endif
  #endif
  #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.  */
@@@ -368,6 -375,19 +383,6 @@@ static const ]b4_int_type_for([b4_trans
  };
  
  #if YYDEBUG
 -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -   YYRHS.  */
 -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
 -{
 -  ]b4_prhs[
 -};
 -
 -/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
 -{
 -  ]b4_rhs[
 -};
 -
  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
  static const ]b4_int_type_for([b4_rline])[ yyrline[] =
  {
@@@ -384,10 -404,17 +399,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[] =
@@@ -401,11 -428,41 +416,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[] =
 -{
 -  ]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[] =
 +/* YYIMMEDIATE[RULE-NUM] -- True iff rule #RULE-NUM is not to be deferred, as
 +   in the case of predicates.  */
 +static const yybool yyimmediate[] =
  {
 -  ]b4_table[
 +  ]b4_immediate[
  };
  
  /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of
@@@ -426,6 -483,19 +441,6 @@@ dnl We probably ought to introduce a ty
  {
    ]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[
 -};
 -
  \f
  /* Prevent warning if -Wmissing-prototypes.  */
  ]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[
  ]b4_locations_if([[
  #define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
  #ifndef YYLLOC_DEFAULT
 -# define YYLLOC_DEFAULT(Current, Rhs, N)                              \
 -    do                                                                        \
 -      if (YYID (N))                                                   \
 -      {                                                               \
 -        (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
 -        (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
 -        (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
 -        (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
 -      }                                                               \
 -      else                                                            \
 -      {                                                               \
 -        (Current).first_line   = (Current).last_line   =              \
 -          YYRHSLOC (Rhs, 0).last_line;                                \
 -        (Current).first_column = (Current).last_column =              \
 -          YYRHSLOC (Rhs, 0).last_column;                              \
 -      }                                                               \
 +# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
 +    do                                                                  \
 +      if (YYID (N))                                                     \
 +        {                                                               \
 +          (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
 +          (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
 +          (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
 +          (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
 +        }                                                               \
 +      else                                                              \
 +        {                                                               \
 +          (Current).first_line   = (Current).last_line   =              \
 +            YYRHSLOC (Rhs, 0).last_line;                                \
 +          (Current).first_column = (Current).last_column =              \
 +            YYRHSLOC (Rhs, 0).last_column;                              \
 +        }                                                               \
      while (YYID (0))
  
  /* YY_LOCATION_PRINT -- Print the location on the stream.
     This macro was not mandated originally: define only if we know
     we won't break user code: when these are the locations we know.  */
  
 -# define YY_LOCATION_PRINT(File, Loc)                 \
 -    fprintf (File, "%d.%d-%d.%d",                     \
 -           (Loc).first_line, (Loc).first_column,      \
 -           (Loc).last_line,  (Loc).last_column)
 +# define YY_LOCATION_PRINT(File, Loc)                   \
 +    fprintf (File, "%d.%d-%d.%d",                       \
 +             (Loc).first_line, (Loc).first_column,      \
 +             (Loc).last_line,  (Loc).last_column)
  #endif
  ]],[
  #ifndef YYLLOC_DEFAULT
@@@ -508,12 -578,9 +523,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 (YYID (0))
  
  #if YYDEBUG
  
  #  define YYFPRINTF fprintf
  # endif
  
 -# define YYDPRINTF(Args)                      \
 -do {                                          \
 -  if (yydebug)                                        \
 -    YYFPRINTF Args;                           \
 -} while (YYID (0))
 +# 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);                         \
 +# 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[); \
+       yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
 -      YYFPRINTF (stderr, "\n");                                 \
 -    }                                                           \
 -} while (YYID (0))
 +        YYFPRINTF (stderr, "\n");                                       \
 +      }                                                                 \
 +  } while (YYID (0))
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
     multiple parsers can coexist.  */
@@@ -552,7 -618,7 +566,7 @@@ int yydebug
  #endif /* !YYDEBUG */
  
  /* YYINITDEPTH -- initial size of the parser's stacks.  */
 -#ifndef       YYINITDEPTH
 +#ifndef YYINITDEPTH
  # define YYINITDEPTH ]b4_stack_depth_init[
  #endif
  
  #define YYHEADROOM 2
  
  #ifndef YYSTACKEXPANDABLE
 -# if (! defined __cplusplus \
 -      || (]b4_locations_if([[defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
 -        && ]])[defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))
  #  define YYSTACKEXPANDABLE 1
 -# else
 -#  define YYSTACKEXPANDABLE 0
 -# endif
  #endif
  
  #if YYSTACKEXPANDABLE
 -# define YY_RESERVE_GLRSTACK(Yystack)                 \
 -  do {                                                        \
 -    if (Yystack->yyspaceLeft < YYHEADROOM)            \
 -      yyexpandGLRStack (Yystack);                     \
 +# define YY_RESERVE_GLRSTACK(Yystack)                   \
 +  do {                                                  \
 +    if (Yystack->yyspaceLeft < YYHEADROOM)              \
 +      yyexpandGLRStack (Yystack);                       \
    } while (YYID (0))
  #else
 -# define YY_RESERVE_GLRSTACK(Yystack)                 \
 -  do {                                                        \
 -    if (Yystack->yyspaceLeft < YYHEADROOM)            \
 -      yyMemoryExhausted (Yystack);                    \
 +# define YY_RESERVE_GLRSTACK(Yystack)                   \
 +  do {                                                  \
 +    if (Yystack->yyspaceLeft < YYHEADROOM)              \
 +      yyMemoryExhausted (Yystack);                      \
    } while (YYID (0))
  #endif
  
@@@ -632,27 -704,27 +646,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: ;
      }
  
@@@ -672,7 -744,7 +686,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;
@@@ -693,7 -765,7 +707,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
@@@ -769,7 -841,7 +783,7 @@@ static void yyFail (yyGLRStack* yystack
  static void
  yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg)
  {
-   if (yymsg != NULL)
+   if (yymsg != YY_NULL)
      yyerror (]b4_yyerror_args[yymsg);
    YYLONGJMP (yystackp->yyexception_buffer, 1);
  }
@@@ -806,16 -878,9 +820,16 @@@ yyfillin (yyGLRStackItem *yyvsp, int yy
    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;
 +#if YYDEBUG
 +      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 = NULL;
        yyvsp[i].yystate.yyloc = s->yyloc;
        s = yyvsp[i].yystate.yypred = s->yypred;
      }
@@@ -844,15 -909,13 +858,13 @@@ yyfill (yyGLRStackItem *yyvsp, int *yyl
   *  yyerr for YYERROR, yyabort for YYABORT.  */
  /*ARGSUSED*/ static YYRESULTTAG
  yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
-               YYSTYPE* yyvalp,
-               YYLTYPE* YYOPTIONAL_LOC (yylocp),
-               yyGLRStack* yystackp
-               ]b4_user_formals[)
 -            yyGLRStack* yystackp,
 -            YYSTYPE* yyvalp]b4_locuser_formals[)
++              yyGLRStack* yystackp,
++              YYSTYPE* yyvalp]b4_locuser_formals[)
  {
    yybool yynormal __attribute__ ((__unused__)) =
-     (yystackp->yysplitPoint == NULL);
+     (yystackp->yysplitPoint == YY_NULL);
    int yylow;
 -]b4_parse_param_use[]dnl
 +]b4_parse_param_use([yyvalp], [yylocp])dnl
  [# undef yyerrok
  # define yyerrok (yystackp->yyerrState = 0)
  # undef YYACCEPT
  # undef YYFILL
  # define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal)
  # undef YYBACKUP
 -# define YYBACKUP(Token, Value)                                                    \
 +# define YYBACKUP(Token, Value)                                              \
    return yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")),     \
 -       yyerrok, yyerr
 +         yyerrok, yyerr
  
    yylow = 1;
    if (yyrhslen == 0)
      *yyvalp = yyval_default;
    else
-     *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
+     *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;]b4_locations_if([[
    YYLLOC_DEFAULT ((*yylocp), (yyvsp - yyrhslen), yyrhslen);
]b4_locations_if([[  yystackp->yyerror_range[1].yystate.yyloc = *yylocp;
+   yystackp->yyerror_range[1].yystate.yyloc = *yylocp;
  ]])[
    switch (yyn)
      {
@@@ -910,7 -973,7 +922,7 @@@ yyuserMerge (int yyn, YYSTYPE* yy0, YYS
      }
  }
  
 -                            /* Bison grammar-table manipulation.  */
 +                              /* Bison grammar-table manipulation.  */
  
  ]b4_yydestruct_generate([b4_c_ansi_function_def])[
  
@@@ -926,36 -989,36 +938,36 @@@ yydestroyGLRState (char const *yymsg, y
  {
    if (yys->yyresolved)
      yydestruct (yymsg, yystos[yys->yylrState],
-                 &yys->yysemantics.yysval]b4_locations_if([, &yys->yyloc])[]b4_user_args[);
 -              &yys->yysemantics.yysval]b4_locuser_args([&yys->yyloc])[);
++                &yys->yysemantics.yysval]b4_locuser_args([&yys->yyloc])[);
    else
      {
  #if YYDEBUG
        if (yydebug)
 -      {
 -        if (yys->yysemantics.yyfirstVal)
 -          YYFPRINTF (stderr, "%s unresolved ", yymsg);
 -        else
 -          YYFPRINTF (stderr, "%s incomplete ", yymsg);
 -        yy_symbol_print (stderr, yystos[yys->yylrState],
 -                         YY_NULL]b4_locuser_args([&yys->yyloc])[);
 -        YYFPRINTF (stderr, "\n");
 -      }
 +        {
 +          if (yys->yysemantics.yyfirstVal)
 +            YYFPRINTF (stderr, "%s unresolved ", yymsg);
 +          else
 +            YYFPRINTF (stderr, "%s incomplete ", yymsg);
 +          yy_symbol_print (stderr, yystos[yys->yylrState],
-                            NULL]b4_locations_if([, &yys->yyloc])[]b4_user_args[);
++                           YY_NULL]b4_locuser_args([&yys->yyloc])[);
 +          YYFPRINTF (stderr, "\n");
 +        }
  #endif
  
        if (yys->yysemantics.yyfirstVal)
 -      {
 -        yySemanticOption *yyoption = yys->yysemantics.yyfirstVal;
 -        yyGLRState *yyrh;
 -        int yyn;
 -        for (yyrh = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
 -             yyn > 0;
 -             yyrh = yyrh->yypred, yyn -= 1)
 -          yydestroyGLRState (yymsg, yyrh]b4_user_args[);
 -      }
 +        {
 +          yySemanticOption *yyoption = yys->yysemantics.yyfirstVal;
 +          yyGLRState *yyrh;
 +          int yyn;
 +          for (yyrh = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
 +               yyn > 0;
 +               yyrh = yyrh->yypred, yyn -= 1)
 +            yydestroyGLRState (yymsg, yyrh]b4_user_args[);
 +        }
      }
  }
  
 -/** 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,
 -              int* yyaction, const short int** yyconflicts)
 +                int* yyaction, const short int** yyconflicts)
  {
    int yyindex = yypact[yystate] + yytoken;
    if (yypact_value_is_default (yypact[yystate])
  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
@@@ -1036,12 -1100,11 +1048,12 @@@ yyisErrorAction (int yyaction
    return yyaction == 0;
  }
  
 -                              /* GLRStates */
 +                                /* 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])
      {
        yynewOption->yyrawchar = yychar;
-       yynewOption->yyval = yylval;
-       yynewOption->yyloc = yylloc;
+       yynewOption->yyval = yylval;]b4_locations_if([
+       yynewOption->yyloc = yylloc;])[
      }
    else
      yynewOption->yyrawchar = YYEMPTY;
    YY_RESERVE_GLRSTACK (yystackp);
  }
  
 -                              /* GLRStacks */
 +                                /* 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)
  {
    yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]);
    if (! yyset->yystates)
      return yyfalse;
-   yyset->yystates[0] = NULL;
+   yyset->yystates[0] = YY_NULL;
    yyset->yylookaheadNeeds =
      (yybool*) YYMALLOC (16 * sizeof yyset->yylookaheadNeeds[0]);
    if (! yyset->yylookaheadNeeds)
@@@ -1107,8 -1170,8 +1119,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)
  {
    if (!yystackp->yyitems)
      return yyfalse;
    yystackp->yynextFree = yystackp->yyitems;
-   yystackp->yysplitPoint = NULL;
-   yystackp->yylastDeleted = NULL;
+   yystackp->yysplitPoint = YY_NULL;
+   yystackp->yylastDeleted = YY_NULL;
    return yyinitStateSet (&yystackp->yytops);
  }
  
  # 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
@@@ -1157,35 -1220,35 +1169,35 @@@ yyexpandGLRStack (yyGLRStack* yystackp
      {
        *yyp1 = *yyp0;
        if (*(yybool *) yyp0)
 -      {
 -        yyGLRState* yys0 = &yyp0->yystate;
 -        yyGLRState* yys1 = &yyp1->yystate;
 -        if (yys0->yypred != YY_NULL)
 -          yys1->yypred =
 -            YYRELOC (yyp0, yyp1, yys0->yypred, yystate);
 -        if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != YY_NULL)
 -          yys1->yysemantics.yyfirstVal =
 -            YYRELOC(yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption);
 -      }
 +        {
 +          yyGLRState* yys0 = &yyp0->yystate;
 +          yyGLRState* yys1 = &yyp1->yystate;
-           if (yys0->yypred != NULL)
++          if (yys0->yypred != YY_NULL)
 +            yys1->yypred =
 +              YYRELOC (yyp0, yyp1, yys0->yypred, yystate);
-           if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != NULL)
++          if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != YY_NULL)
 +            yys1->yysemantics.yyfirstVal =
 +              YYRELOC(yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption);
 +        }
        else
 -      {
 -        yySemanticOption* yyv0 = &yyp0->yyoption;
 -        yySemanticOption* yyv1 = &yyp1->yyoption;
 -        if (yyv0->yystate != YY_NULL)
 -          yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate);
 -        if (yyv0->yynext != YY_NULL)
 -          yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption);
 -      }
 +        {
 +          yySemanticOption* yyv0 = &yyp0->yyoption;
 +          yySemanticOption* yyv1 = &yyp1->yyoption;
-           if (yyv0->yystate != NULL)
++          if (yyv0->yystate != YY_NULL)
 +            yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate);
-           if (yyv0->yynext != NULL)
++          if (yyv0->yynext != YY_NULL)
 +            yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption);
 +        }
      }
-   if (yystackp->yysplitPoint != NULL)
+   if (yystackp->yysplitPoint != YY_NULL)
      yystackp->yysplitPoint = YYRELOC (yystackp->yyitems, yynewItems,
 -                               yystackp->yysplitPoint, yystate);
 +                                 yystackp->yysplitPoint, yystate);
  
    for (yyn = 0; yyn < yystackp->yytops.yysize; yyn += 1)
-     if (yystackp->yytops.yystates[yyn] != NULL)
+     if (yystackp->yytops.yystates[yyn] != YY_NULL)
        yystackp->yytops.yystates[yyn] =
 -      YYRELOC (yystackp->yyitems, yynewItems,
 -               yystackp->yytops.yystates[yyn], yystate);
 +        YYRELOC (yystackp->yyitems, yynewItems,
 +                 yystackp->yytops.yystates[yyn], yystate);
    YYFREE (yystackp->yyitems);
    yystackp->yyitems = yynewItems;
    yystackp->yynextFree = yynewItems + yysize;
@@@ -1200,37 -1263,37 +1212,37 @@@ 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)
  {
-   if (yystackp->yysplitPoint != NULL && yystackp->yysplitPoint > yys)
+   if (yystackp->yysplitPoint != YY_NULL && yystackp->yysplitPoint > yys)
      yystackp->yysplitPoint = yys;
  }
  
 -/** Invalidate stack #K in STACK.  */
 +/** Invalidate stack #YYK in *YYSTACKP.  */
  static inline void
  yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
  {
-   if (yystackp->yytops.yystates[yyk] != NULL)
+   if (yystackp->yytops.yystates[yyk] != YY_NULL)
      yystackp->yylastDeleted = yystackp->yytops.yystates[yyk];
-   yystackp->yytops.yystates[yyk] = NULL;
+   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)
  {
-   if (yystackp->yylastDeleted == NULL || yystackp->yytops.yysize != 0)
+   if (yystackp->yylastDeleted == YY_NULL || yystackp->yytops.yysize != 0)
      return;
    yystackp->yytops.yystates[0] = yystackp->yylastDeleted;
    yystackp->yytops.yysize = 1;
    YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n"));
-   yystackp->yylastDeleted = NULL;
+   yystackp->yylastDeleted = YY_NULL;
  }
  
  static inline void
@@@ -1240,42 -1303,41 +1252,42 @@@ yyremoveDeletes (yyGLRStack* yystackp
    yyi = yyj = 0;
    while (yyj < yystackp->yytops.yysize)
      {
-       if (yystackp->yytops.yystates[yyi] == NULL)
+       if (yystackp->yytops.yystates[yyi] == YY_NULL)
 -      {
 -        if (yyi == yyj)
 -          {
 -            YYDPRINTF ((stderr, "Removing dead stacks.\n"));
 -          }
 -        yystackp->yytops.yysize -= 1;
 -      }
 +        {
 +          if (yyi == yyj)
 +            {
 +              YYDPRINTF ((stderr, "Removing dead stacks.\n"));
 +            }
 +          yystackp->yytops.yysize -= 1;
 +        }
        else
 -      {
 -        yystackp->yytops.yystates[yyj] = yystackp->yytops.yystates[yyi];
 -        /* In the current implementation, it's unnecessary to copy
 -           yystackp->yytops.yylookaheadNeeds[yyi] since, after
 -           yyremoveDeletes returns, the parser immediately either enters
 -           deterministic operation or shifts a token.  However, it doesn't
 -           hurt, and the code might evolve to need it.  */
 -        yystackp->yytops.yylookaheadNeeds[yyj] =
 -          yystackp->yytops.yylookaheadNeeds[yyi];
 -        if (yyj != yyi)
 -          {
 -            YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n",
 -                        (unsigned long int) yyi, (unsigned long int) yyj));
 -          }
 -        yyj += 1;
 -      }
 +        {
 +          yystackp->yytops.yystates[yyj] = yystackp->yytops.yystates[yyi];
 +          /* In the current implementation, it's unnecessary to copy
 +             yystackp->yytops.yylookaheadNeeds[yyi] since, after
 +             yyremoveDeletes returns, the parser immediately either enters
 +             deterministic operation or shifts a token.  However, it doesn't
 +             hurt, and the code might evolve to need it.  */
 +          yystackp->yytops.yylookaheadNeeds[yyj] =
 +            yystackp->yytops.yylookaheadNeeds[yyi];
 +          if (yyj != yyi)
 +            {
 +              YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n",
 +                          (unsigned long int) yyi, (unsigned long int) yyj));
 +            }
 +          yyj += 1;
 +        }
        yyi += 1;
      }
  }
  
 -/** 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,
 -          YYSTYPE* yyvalp]b4_locations_if([, YYLTYPE* yylocp])[)
 +            size_t yyposn,
-             YYSTYPE* yyvalp, YYLTYPE* yylocp)
++            YYSTYPE* yyvalp]b4_locations_if([, YYLTYPE* yylocp])[)
  {
    yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
  
    yynewState->yyposn = yyposn;
    yynewState->yyresolved = yytrue;
    yynewState->yypred = yystackp->yytops.yystates[yyk];
-   yynewState->yysemantics.yysval = *yyvalp;
-   yynewState->yyloc = *yylocp;
+   yynewState->yysemantics.yysval = *yyvalp;]b4_locations_if([
+   yynewState->yyloc = *yylocp;])[
    yystackp->yytops.yystates[yyk] = yynewState;
  
    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;
  
    yynewState->yyposn = yyposn;
    yynewState->yyresolved = yyfalse;
    yynewState->yypred = yystackp->yytops.yystates[yyk];
-   yynewState->yysemantics.yyfirstVal = NULL;
+   yynewState->yysemantics.yyfirstVal = YY_NULL;
    yystackp->yytops.yystates[yyk] = yynewState;
  
    /* Invokes YY_RESERVE_GLRSTACK.  */
 -  yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule);
 +  yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule);
 +}
 +
 +#if !YYDEBUG
 +# define YY_REDUCE_PRINT(Args)
 +#else
 +# define YY_REDUCE_PRINT(Args)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print Args;               \
 +} while (YYID (0))
 +
 +/*----------------------------------------------------------------------.
 +| Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. |
 +`----------------------------------------------------------------------*/
 +
 +/*ARGSUSED*/ 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 #RULE from the top of stack
 - *  #K of STACK, and perform the appropriate semantic action on their
 +/** 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,
-             YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
 -          YYSTYPE* yyvalp]b4_locuser_formals[)
++            YYSTYPE* yyvalp]b4_locuser_formals[)
  {
    int yynrhs = yyrhsLength (yyrule);
  
-   if (yystackp->yysplitPoint == NULL)
+   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,
 -                         yyvalp]b4_locuser_args[);
 +      YY_REDUCE_PRINT ((1, yyrhs, yyk, yyrule]b4_user_args[));
-       return yyuserAction (yyrule, yynrhs, yyrhs,
-                            yyvalp, yylocp, yystackp]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];
        yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred
 -      = yystackp->yytops.yystates[yyk];]b4_locations_if([[
 +        = yystackp->yytops.yystates[yyk];]b4_locations_if([[
        if (yynrhs == 0)
 -      /* Set default location.  */
 -      yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yys->yyloc;]])[
 +        /* Set default location.  */
 +        yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yys->yyloc;]])[
        for (yyi = 0; yyi < yynrhs; yyi += 1)
 -      {
 -        yys = yys->yypred;
 -        YYASSERT (yys);
 -      }
 +        {
 +          yys = yys->yypred;
 +          YYASSERT (yys);
 +        }
        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,
-                            yyvalp, yylocp, yystackp]b4_user_args[);
 -                         yystackp, yyvalp]b4_locuser_args[);
 -    }
 -}
 -
 -#if !YYDEBUG
 -# 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");
++                           yystackp, yyvalp]b4_locuser_args[);
      }
  }
 -#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
  yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
 -           yybool yyforceEval]b4_user_formals[)
 +             yybool yyforceEval]b4_user_formals[)
  {
    size_t yyposn = yystackp->yytops.yystates[yyk]->yyposn;
  
-   if (yyforceEval || yystackp->yysplitPoint == NULL)
+   if (yyforceEval || yystackp->yysplitPoint == YY_NULL)
      {
-       YYSTYPE yysval;
-       YYLTYPE yyloc;
 +      YYRESULTTAG yyflag;
+       YYSTYPE yysval;]b4_locations_if([
+       YYLTYPE yyloc;])[
  
-       yyflag = yydoAction (yystackp, yyk, yyrule, &yysval,
-                            &yyloc]b4_user_args[);
 -      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 != 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,
 -                               yylhsNonterm (yyrule)),
 -                yyposn, &yysval]b4_locations_if([, &yyloc])[);
 +                  yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState,
 +                                 yylhsNonterm (yyrule)),
-                   yyposn, &yysval, &yyloc);
++                  yyposn, &yysval]b4_locations_if([, &yyloc])[);
      }
    else
      {
        yyStateNum yynewLRState;
  
        for (yys = yystackp->yytops.yystates[yyk], yyn = yyrhsLength (yyrule);
 -         0 < yyn; yyn -= 1)
 -      {
 -        yys = yys->yypred;
 -        YYASSERT (yys);
 -      }
 +           0 < yyn; yyn -= 1)
 +        {
 +          yys = yys->yypred;
 +          YYASSERT (yys);
 +        }
        yyupdateSplit (yystackp, yys);
        yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule));
        YYDPRINTF ((stderr,
 -                "Reduced stack %lu by rule #%d; action deferred.  Now in state %d.\n",
 -                (unsigned long int) yyk, yyrule - 1, yynewLRState));
 +                  "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] != NULL)
 -      if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL)
 -        {
 -          yyGLRState* yyp, *yysplit = yystackp->yysplitPoint;
 -          yyp = yystackp->yytops.yystates[yyi];
 -          while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn)
 -            {
 -              if (yyp->yylrState == yynewLRState && yyp->yypred == yys)
 -                {
 -                  yyaddDeferredAction (yystackp, yyk, yyp, yys0, yyrule);
 -                  yymarkStackDeleted (yystackp, yyk);
 -                  YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n",
 -                              (unsigned long int) yyk,
 -                              (unsigned long int) yyi));
 -                  return yyok;
 -                }
 -              yyp = yyp->yypred;
 -            }
 -        }
++        if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL)
 +          {
 +            yyGLRState* yyp, *yysplit = yystackp->yysplitPoint;
 +            yyp = yystackp->yytops.yystates[yyi];
 +            while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn)
 +              {
 +                if (yyp->yylrState == yynewLRState && yyp->yypred == yys)
 +                  {
 +                    yyaddDeferredAction (yystackp, yyk, yyp, yys0, yyrule);
 +                    yymarkStackDeleted (yystackp, yyk);
 +                    YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n",
 +                                (unsigned long int) yyk,
 +                                (unsigned long int) yyi));
 +                    return yyok;
 +                  }
 +                yyp = yyp->yypred;
 +              }
 +          }
        yystackp->yytops.yystates[yyk] = yys;
        yyglrShiftDefer (yystackp, yyk, yynewLRState, yyposn, yys0, yyrule);
      }
  static size_t
  yysplitStack (yyGLRStack* yystackp, size_t yyk)
  {
-   if (yystackp->yysplitPoint == NULL)
+   if (yystackp->yysplitPoint == YY_NULL)
      {
        YYASSERT (yyk == 0);
        yystackp->yysplitPoint = yystackp->yytops.yystates[yyk];
        yyGLRState** yynewStates;
        yybool* yynewLookaheadNeeds;
  
-       yynewStates = NULL;
+       yynewStates = YY_NULL;
  
        if (yystackp->yytops.yycapacity
 -        > (YYSIZEMAX / (2 * sizeof yynewStates[0])))
 -      yyMemoryExhausted (yystackp);
 +          > (YYSIZEMAX / (2 * sizeof yynewStates[0])))
 +        yyMemoryExhausted (yystackp);
        yystackp->yytops.yycapacity *= 2;
  
        yynewStates =
 -      (yyGLRState**) YYREALLOC (yystackp->yytops.yystates,
 -                                (yystackp->yytops.yycapacity
 -                                 * sizeof yynewStates[0]));
 +        (yyGLRState**) YYREALLOC (yystackp->yytops.yystates,
 +                                  (yystackp->yytops.yycapacity
 +                                   * sizeof yynewStates[0]));
-       if (yynewStates == NULL)
+       if (yynewStates == YY_NULL)
 -      yyMemoryExhausted (yystackp);
 +        yyMemoryExhausted (yystackp);
        yystackp->yytops.yystates = yynewStates;
  
        yynewLookaheadNeeds =
 -      (yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds,
 -                           (yystackp->yytops.yycapacity
 -                            * sizeof yynewLookaheadNeeds[0]));
 +        (yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds,
 +                             (yystackp->yytops.yycapacity
 +                              * sizeof yynewLookaheadNeeds[0]));
-       if (yynewLookaheadNeeds == NULL)
+       if (yynewLookaheadNeeds == YY_NULL)
 -      yyMemoryExhausted (yystackp);
 +        yyMemoryExhausted (yystackp);
        yystackp->yytops.yylookaheadNeeds = yynewLookaheadNeeds;
      }
    yystackp->yytops.yystates[yystackp->yytops.yysize]
    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
@@@ -1535,19 -1591,19 +1546,19 @@@ yyidenticalOptions (yySemanticOption* y
        yyGLRState *yys0, *yys1;
        int yyn;
        for (yys0 = yyy0->yystate, yys1 = yyy1->yystate,
 -         yyn = yyrhsLength (yyy0->yyrule);
 -         yyn > 0;
 -         yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1)
 -      if (yys0->yyposn != yys1->yyposn)
 -        return yyfalse;
 +           yyn = yyrhsLength (yyy0->yyrule);
 +           yyn > 0;
 +           yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1)
 +        if (yys0->yyposn != yys1->yyposn)
 +          return yyfalse;
        return yytrue;
      }
    else
      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)
  {
         yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1)
      {
        if (yys0 == yys1)
 -      break;
 +        break;
        else if (yys0->yyresolved)
 -      {
 -        yys1->yyresolved = yytrue;
 -        yys1->yysemantics.yysval = yys0->yysemantics.yysval;
 -      }
 +        {
 +          yys1->yyresolved = yytrue;
 +          yys1->yysemantics.yysval = yys0->yysemantics.yysval;
 +        }
        else if (yys1->yyresolved)
 -      {
 -        yys0->yyresolved = yytrue;
 -        yys0->yysemantics.yysval = yys1->yysemantics.yysval;
 -      }
 +        {
 +          yys0->yyresolved = yytrue;
 +          yys0->yysemantics.yysval = yys1->yysemantics.yysval;
 +        }
        else
 -      {
 -        yySemanticOption** yyz0p;
 -        yySemanticOption* yyz1;
 -        yyz0p = &yys0->yysemantics.yyfirstVal;
 -        yyz1 = yys1->yysemantics.yyfirstVal;
 -        while (YYID (yytrue))
 -          {
 -            if (yyz1 == *yyz0p || yyz1 == YY_NULL)
 -              break;
 -            else if (*yyz0p == YY_NULL)
 -              {
 -                *yyz0p = yyz1;
 -                break;
 -              }
 -            else if (*yyz0p < yyz1)
 -              {
 -                yySemanticOption* yyz = *yyz0p;
 -                *yyz0p = yyz1;
 -                yyz1 = yyz1->yynext;
 -                (*yyz0p)->yynext = yyz;
 -              }
 -            yyz0p = &(*yyz0p)->yynext;
 -          }
 -        yys1->yysemantics.yyfirstVal = yys0->yysemantics.yyfirstVal;
 -      }
 +        {
 +          yySemanticOption** yyz0p;
 +          yySemanticOption* yyz1;
 +          yyz0p = &yys0->yysemantics.yyfirstVal;
 +          yyz1 = yys1->yysemantics.yyfirstVal;
 +          while (YYID (yytrue))
 +            {
-               if (yyz1 == *yyz0p || yyz1 == NULL)
++              if (yyz1 == *yyz0p || yyz1 == YY_NULL)
 +                break;
-               else if (*yyz0p == NULL)
++              else if (*yyz0p == YY_NULL)
 +                {
 +                  *yyz0p = yyz1;
 +                  break;
 +                }
 +              else if (*yyz0p < yyz1)
 +                {
 +                  yySemanticOption* yyz = *yyz0p;
 +                  *yyz0p = yyz1;
 +                  yyz1 = yyz1->yynext;
 +                  (*yyz0p)->yynext = yyz;
 +                }
 +              yyz0p = &(*yyz0p)->yynext;
 +            }
 +          yys1->yysemantics.yyfirstVal = yys0->yysemantics.yyfirstVal;
 +        }
      }
  }
  
@@@ -1611,9 -1667,9 +1622,9 @@@ yypreference (yySemanticOption* y0, yyS
    if (p0 == p1)
      {
        if (yymerger[r0] == 0 || yymerger[r0] != yymerger[r1])
 -      return 0;
 +        return 0;
        else
 -      return 1;
 +        return 1;
      }
    if (p0 == 0 || p1 == 0)
      return 0;
  }
  
  static YYRESULTTAG yyresolveValue (yyGLRState* yys,
 -                                 yyGLRStack* yystackp]b4_user_formals[);
 +                                   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[)
 +                 yyGLRStack* yystackp]b4_user_formals[)
  {
    if (0 < yyn)
      {
        YYASSERT (yys->yypred);
        YYCHK (yyresolveStates (yys->yypred, yyn-1, yystackp]b4_user_args[));
        if (! yys->yyresolved)
 -      YYCHK (yyresolveValue (yys, yystackp]b4_user_args[));
 +        YYCHK (yyresolveValue (yys, yystackp]b4_user_args[));
      }
    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,
-                  YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
 -               YYSTYPE* yyvalp]b4_locuser_formals[)
++                 YYSTYPE* yyvalp]b4_locuser_formals[)
  {
    yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
    int yynrhs;
    int yychar_current;
-   YYSTYPE yylval_current;
-   YYLTYPE yylloc_current;
+   YYSTYPE yylval_current;]b4_locations_if([
+   YYLTYPE yylloc_current;])[
    YYRESULTTAG yyflag;
  
    yynrhs = yyrhsLength (yyopt->yyrule);
      {
        yyGLRState *yys;
        for (yys = yyopt->yystate; yynrhs > 0; yys = yys->yypred, yynrhs -= 1)
 -      yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
 +        yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
        return yyflag;
      }
  
      /* Set default location.  */
      yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yyopt->yystate->yyloc;]])[
    yychar_current = yychar;
-   yylval_current = yylval;
-   yylloc_current = yylloc;
+   yylval_current = yylval;]b4_locations_if([
+   yylloc_current = yylloc;])[
    yychar = yyopt->yyrawchar;
-   yylval = yyopt->yyval;
-   yylloc = yyopt->yyloc;
+   yylval = yyopt->yyval;]b4_locations_if([
+   yylloc = yyopt->yyloc;])[
    yyflag = yyuserAction (yyopt->yyrule, yynrhs,
 -                       yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
 -                       yystackp, yyvalp]b4_locuser_args[);
 +                           yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
-                            yyvalp, yylocp, yystackp]b4_user_args[);
++                         yystackp, yyvalp]b4_locuser_args[);
    yychar = yychar_current;
-   yylval = yylval_current;
-   yylloc = yylloc_current;
+   yylval = yylval_current;]b4_locations_if([
+   yylloc = yylloc_current;])[
    return yyflag;
  }
  
@@@ -1704,7 -1759,7 +1715,7 @@@ yyreportTree (yySemanticOption* yyx, in
  
    for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred)
      yystates[yyi] = yys;
-   if (yys == NULL)
+   if (yys == YY_NULL)
      {
        yyleftmost_state.yyposn = 0;
        yystates[0] = &yyleftmost_state;
  
    if (yyx->yystate->yyposn < yys->yyposn + 1)
      YYFPRINTF (stderr, "%*s%s -> <Rule %d, empty>\n",
 -             yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
 -             yyx->yyrule - 1);
 +               yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
 +               yyx->yyrule - 1);
    else
      YYFPRINTF (stderr, "%*s%s -> <Rule %d, tokens %lu .. %lu>\n",
 -             yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
 -             yyx->yyrule - 1, (unsigned long int) (yys->yyposn + 1),
 -             (unsigned long int) yyx->yystate->yyposn);
 +               yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
 +               yyx->yyrule - 1, (unsigned long int) (yys->yyposn + 1),
 +               (unsigned long int) yyx->yystate->yyposn);
    for (yyi = 1; yyi <= yynrhs; yyi += 1)
      {
        if (yystates[yyi]->yyresolved)
 -      {
 -        if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
 -          YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
 -                     yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]));
 -        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),
 -                     (unsigned long int) yystates[yyi]->yyposn);
 -      }
 +        {
 +          if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
 +            YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
 +                       yytokenName (yystos[yystates[yyi]->yylrState]));
 +          else
 +            YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "",
 +                       yytokenName (yystos[yystates[yyi]->yylrState]),
 +                       (unsigned long int) (yystates[yyi-1]->yyposn + 1),
 +                       (unsigned long int) yystates[yyi]->yyposn);
 +        }
        else
 -      yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2);
 +        yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2);
      }
  }
  #endif
  
  /*ARGSUSED*/ static YYRESULTTAG
  yyreportAmbiguity (yySemanticOption* yyx0,
 -                 yySemanticOption* yyx1]b4_pure_formals[)
 +                   yySemanticOption* yyx1]b4_pure_formals[)
  {
    YYUSE (yyx0);
    YYUSE (yyx1);
    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[)
 +                    yyGLRStack *yystackp]b4_user_formals[)
  {
    if (0 < yyn1)
      {
        yyresolveLocations (yys1->yypred, yyn1 - 1, yystackp]b4_user_args[);
        if (!yys1->yyresolved)
 -      {
 -        yySemanticOption *yyoption;
 -        yyGLRStackItem yyrhsloc[1 + YYMAXRHS];
 -        int yynrhs;
 -        int yychar_current;
 -        YYSTYPE yylval_current;
 -        YYLTYPE yylloc_current;
 -        yyoption = yys1->yysemantics.yyfirstVal;
 -        YYASSERT (yyoption != YY_NULL);
 -        yynrhs = yyrhsLength (yyoption->yyrule);
 -        if (yynrhs > 0)
 -          {
 -            yyGLRState *yys;
 -            int yyn;
 -            yyresolveLocations (yyoption->yystate, yynrhs,
 -                                yystackp]b4_user_args[);
 -            for (yys = yyoption->yystate, yyn = yynrhs;
 -                 yyn > 0;
 -                 yys = yys->yypred, yyn -= 1)
 -              yyrhsloc[yyn].yystate.yyloc = yys->yyloc;
 -          }
 -        else
 -          {
 -            /* Both yyresolveAction and yyresolveLocations traverse the GSS
 -               in reverse rightmost order.  It is only necessary to invoke
 -               yyresolveLocations on a subforest for which yyresolveAction
 -               would have been invoked next had an ambiguity not been
 -               detected.  Thus the location of the previous state (but not
 -               necessarily the previous state itself) is guaranteed to be
 -               resolved already.  */
 -            yyGLRState *yyprevious = yyoption->yystate;
 -            yyrhsloc[0].yystate.yyloc = yyprevious->yyloc;
 -          }
 -        yychar_current = yychar;
 -        yylval_current = yylval;
 -        yylloc_current = yylloc;
 -        yychar = yyoption->yyrawchar;
 -        yylval = yyoption->yyval;
 -        yylloc = yyoption->yyloc;
 -        YYLLOC_DEFAULT ((yys1->yyloc), yyrhsloc, yynrhs);
 -        yychar = yychar_current;
 -        yylval = yylval_current;
 -        yylloc = yylloc_current;
 -      }
 +        {
 +          yySemanticOption *yyoption;
 +          yyGLRStackItem yyrhsloc[1 + YYMAXRHS];
 +          int yynrhs;
 +          int yychar_current;
 +          YYSTYPE yylval_current;
 +          YYLTYPE yylloc_current;
 +          yyoption = yys1->yysemantics.yyfirstVal;
-           YYASSERT (yyoption != NULL);
++          YYASSERT (yyoption != YY_NULL);
 +          yynrhs = yyrhsLength (yyoption->yyrule);
 +          if (yynrhs > 0)
 +            {
 +              yyGLRState *yys;
 +              int yyn;
 +              yyresolveLocations (yyoption->yystate, yynrhs,
 +                                  yystackp]b4_user_args[);
 +              for (yys = yyoption->yystate, yyn = yynrhs;
 +                   yyn > 0;
 +                   yys = yys->yypred, yyn -= 1)
 +                yyrhsloc[yyn].yystate.yyloc = yys->yyloc;
 +            }
 +          else
 +            {
 +              /* Both yyresolveAction and yyresolveLocations traverse the GSS
 +                 in reverse rightmost order.  It is only necessary to invoke
 +                 yyresolveLocations on a subforest for which yyresolveAction
 +                 would have been invoked next had an ambiguity not been
 +                 detected.  Thus the location of the previous state (but not
 +                 necessarily the previous state itself) is guaranteed to be
 +                 resolved already.  */
 +              yyGLRState *yyprevious = yyoption->yystate;
 +              yyrhsloc[0].yystate.yyloc = yyprevious->yyloc;
 +            }
 +          yychar_current = yychar;
 +          yylval_current = yylval;
 +          yylloc_current = yylloc;
 +          yychar = yyoption->yyrawchar;
 +          yylval = yyoption->yyval;
 +          yylloc = yyoption->yyloc;
 +          YYLLOC_DEFAULT ((yys1->yyloc), yyrhsloc, yynrhs);
 +          yychar = yychar_current;
 +          yylval = yylval_current;
 +          yylloc = yylloc_current;
 +        }
      }
  }]])[
  
 -/** 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[)
  {
    yySemanticOption* yyoptionList = yys->yysemantics.yyfirstVal;
-   yySemanticOption* yybest;
+   yySemanticOption* yybest = yyoptionList;
    yySemanticOption** yypp;
-   yybool yymerge;
+   yybool yymerge = yyfalse;
    YYSTYPE yysval;
-   YYRESULTTAG yyflag;
-   YYLTYPE *yylocp = &yys->yyloc;
+   YYRESULTTAG yyflag;]b4_locations_if([
+   YYLTYPE *yylocp = &yys->yyloc;])[
  
-   yybest = yyoptionList;
-   yymerge = yyfalse;
-   for (yypp = &yyoptionList->yynext; *yypp != NULL; )
+   for (yypp = &yyoptionList->yynext; *yypp != YY_NULL; )
      {
        yySemanticOption* yyp = *yypp;
  
        if (yyidenticalOptions (yybest, yyp))
 -      {
 -        yymergeOptionSets (yybest, yyp);
 -        *yypp = yyp->yynext;
 -      }
 +        {
 +          yymergeOptionSets (yybest, yyp);
 +          *yypp = yyp->yynext;
 +        }
        else
 -      {
 -        switch (yypreference (yybest, yyp))
 -          {
 -          case 0:]b4_locations_if([[
 -            yyresolveLocations (yys, 1, yystackp]b4_user_args[);]])[
 -            return yyreportAmbiguity (yybest, yyp]b4_pure_args[);
 -            break;
 -          case 1:
 -            yymerge = yytrue;
 -            break;
 -          case 2:
 -            break;
 -          case 3:
 -            yybest = yyp;
 -            yymerge = yyfalse;
 -            break;
 -          default:
 -            /* This cannot happen so it is not worth a YYASSERT (yyfalse),
 -               but some compilers complain if the default case is
 -               omitted.  */
 -            break;
 -          }
 -        yypp = &yyp->yynext;
 -      }
 +        {
 +          switch (yypreference (yybest, yyp))
 +            {
 +            case 0:]b4_locations_if([[
 +              yyresolveLocations (yys, 1, yystackp]b4_user_args[);]])[
 +              return yyreportAmbiguity (yybest, yyp]b4_pure_args[);
 +              break;
 +            case 1:
 +              yymerge = yytrue;
 +              break;
 +            case 2:
 +              break;
 +            case 3:
 +              yybest = yyp;
 +              yymerge = yyfalse;
 +              break;
 +            default:
 +              /* This cannot happen so it is not worth a YYASSERT (yyfalse),
 +                 but some compilers complain if the default case is
 +                 omitted.  */
 +              break;
 +            }
 +          yypp = &yyp->yynext;
 +        }
      }
  
    if (yymerge)
      {
        yySemanticOption* yyp;
        int yyprec = yydprec[yybest->yyrule];
-       yyflag = yyresolveAction (yybest, yystackp, &yysval,
-                                 yylocp]b4_user_args[);
+       yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args[);
        if (yyflag == yyok)
-         for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext)
 -      for (yyp = yybest->yynext; yyp != YY_NULL; yyp = yyp->yynext)
 -        {
 -          if (yyprec == yydprec[yyp->yyrule])
 -            {
 -              YYSTYPE yysval_other;]b4_locations_if([
++        for (yyp = yybest->yynext; yyp != YY_NULL; yyp = yyp->yynext)
 +          {
 +            if (yyprec == yydprec[yyp->yyrule])
 +              {
-                 YYSTYPE yysval_other;
-                 YYLTYPE yydummy;
-                 yyflag = yyresolveAction (yyp, yystackp, &yysval_other,
-                                           &yydummy]b4_user_args[);
++                YYSTYPE yysval_other;]b4_locations_if([
+                 YYLTYPE yydummy;])[
+                 yyflag = yyresolveAction (yyp, yystackp, &yysval_other]b4_locuser_args([&yydummy])[);
 -              if (yyflag != yyok)
 -                {
 -                  yydestruct ("Cleanup: discarding incompletely merged value for",
 -                              yystos[yys->yylrState],
 -                              &yysval]b4_locuser_args[);
 -                  break;
 -                }
 -              yyuserMerge (yymerger[yyp->yyrule], &yysval, &yysval_other);
 -            }
 -        }
 +                if (yyflag != yyok)
 +                  {
 +                    yydestruct ("Cleanup: discarding incompletely merged value for",
 +                                yystos[yys->yylrState],
-                                 &yysval]b4_locations_if([, yylocp])[]b4_user_args[);
++                                &yysval]b4_locuser_args[);
 +                    break;
 +                  }
 +                yyuserMerge (yymerger[yyp->yyrule], &yysval, &yysval_other);
 +              }
 +          }
      }
    else
-     yyflag = yyresolveAction (yybest, yystackp, &yysval, yylocp]b4_user_args[);
+     yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args([yylocp])[);
  
    if (yyflag == yyok)
      {
        yys->yysemantics.yysval = yysval;
      }
    else
-     yys->yysemantics.yyfirstVal = NULL;
+     yys->yysemantics.yyfirstVal = YY_NULL;
    return yyflag;
  }
  
  static YYRESULTTAG
  yyresolveStack (yyGLRStack* yystackp]b4_user_formals[)
  {
-   if (yystackp->yysplitPoint != NULL)
+   if (yystackp->yysplitPoint != YY_NULL)
      {
        yyGLRState* yys;
        int yyn;
  
        for (yyn = 0, yys = yystackp->yytops.yystates[0];
 -         yys != yystackp->yysplitPoint;
 -         yys = yys->yypred, yyn += 1)
 -      continue;
 +           yys != yystackp->yysplitPoint;
 +           yys = yys->yypred, yyn += 1)
 +        continue;
        YYCHK (yyresolveStates (yystackp->yytops.yystates[0], yyn, yystackp
 -                           ]b4_user_args[));
 +                             ]b4_user_args[));
      }
    return yyok;
  }
@@@ -1936,10 -1986,10 +1943,10 @@@ yycompressStack (yyGLRStack* yystackp
  {
    yyGLRState* yyp, *yyq, *yyr;
  
-   if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == NULL)
+   if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == YY_NULL)
      return;
  
-   for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = NULL;
+   for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULL;
         yyp != yystackp->yysplitPoint;
         yyr = yyp, yyp = yyq, yyq = yyp->yypred)
      yyp->yypred = yyr;
    yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems;
    yystackp->yynextFree = ((yyGLRStackItem*) yystackp->yysplitPoint) + 1;
    yystackp->yyspaceLeft -= yystackp->yynextFree - yystackp->yyitems;
-   yystackp->yysplitPoint = NULL;
-   yystackp->yylastDeleted = NULL;
+   yystackp->yysplitPoint = YY_NULL;
+   yystackp->yylastDeleted = YY_NULL;
  
-   while (yyr != NULL)
+   while (yyr != YY_NULL)
      {
        yystackp->yynextFree->yystate = *yyr;
        yyr = yyr->yypred;
  
  static YYRESULTTAG
  yyprocessOneStack (yyGLRStack* yystackp, size_t yyk,
 -                 size_t yyposn]b4_pure_formals[)
 +                   size_t yyposn]b4_pure_formals[)
  {
-   while (yystackp->yytops.yystates[yyk] != NULL)
 -  int yyaction;
 -  const short int* yyconflicts;
 -  yyRuleNum yyrule;
 -
+   while (yystackp->yytops.yystates[yyk] != YY_NULL)
      {
        yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
        YYDPRINTF ((stderr, "Stack %lu Entering state %d\n",
 -                (unsigned long int) yyk, yystate));
 +                  (unsigned long int) yyk, yystate));
  
        YYASSERT (yystate != YYFINAL);
  
        if (yyisDefaultedState (yystate))
 -      {
 -        yyrule = yydefaultAction (yystate);
 -        if (yyrule == 0)
 -          {
 -            YYDPRINTF ((stderr, "Stack %lu dies.\n",
 -                        (unsigned long int) yyk));
 -            yymarkStackDeleted (yystackp, yyk);
 -            return yyok;
 -          }
 -        YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[));
 -      }
 +        {
 +          YYRESULTTAG yyflag;
 +          yyRuleNum yyrule = yydefaultAction (yystate);
 +          if (yyrule == 0)
 +            {
 +              YYDPRINTF ((stderr, "Stack %lu dies.\n",
 +                          (unsigned long int) yyk));
 +              yymarkStackDeleted (yystackp, yyk);
 +              return yyok;
 +            }
 +          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;
 -        yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
 -        if (yychar == YYEMPTY)
 -          {
 -            YYDPRINTF ((stderr, "Reading a token: "));
 -            yychar = YYLEX;
 -          }
 -
 -        if (yychar <= YYEOF)
 -          {
 -            yychar = yytoken = YYEOF;
 -            YYDPRINTF ((stderr, "Now at end of input.\n"));
 -          }
 -        else
 -          {
 -            yytoken = YYTRANSLATE (yychar);
 -            YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 -          }
 -
 -        yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
 -
 -        while (*yyconflicts != 0)
 -          {
 -            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[));
 -            yyconflicts += 1;
 -          }
 -
 -        if (yyisShiftAction (yyaction))
 -          break;
 -        else if (yyisErrorAction (yyaction))
 -          {
 -            YYDPRINTF ((stderr, "Stack %lu dies.\n",
 -                        (unsigned long int) yyk));
 -            yymarkStackDeleted (yystackp, yyk);
 -            break;
 -          }
 -        else
 -          YYCHK (yyglrReduce (yystackp, yyk, -yyaction,
 -                              yyfalse]b4_user_args[));
 -      }
 +        {
 +          yySymbol yytoken;
 +          int yyaction;
 +          const short int* yyconflicts;
 +
 +          yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
 +          if (yychar == YYEMPTY)
 +            {
 +              YYDPRINTF ((stderr, "Reading a token: "));
 +              yychar = YYLEX;
 +            }
 +
 +          if (yychar <= YYEOF)
 +            {
 +              yychar = yytoken = YYEOF;
 +              YYDPRINTF ((stderr, "Now at end of input.\n"));
 +            }
 +          else
 +            {
 +              yytoken = YYTRANSLATE (yychar);
 +              YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 +            }
 +
 +          yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
 +
 +          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));
 +              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;
 +            }
 +
 +          if (yyisShiftAction (yyaction))
 +            break;
 +          else if (yyisErrorAction (yyaction))
 +            {
 +              YYDPRINTF ((stderr, "Stack %lu dies.\n",
 +                          (unsigned long int) yyk));
 +              yymarkStackDeleted (yystackp, yyk);
 +              break;
 +            }
 +          else
 +            {
 +              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;
  }
@@@ -2086,14 -2101,14 +2093,14 @@@ yyreportSyntaxError (yyGLRStack* yystac
    yyerror (]b4_lyyerror_args[YY_("syntax error"));
  #else
    yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-   size_t yysize0 = yytnamerr (NULL, yytokenName (yytoken));
+   size_t yysize0 = yytnamerr (YY_NULL, yytokenName (yytoken));
    size_t yysize = yysize0;
    size_t yysize1;
    yybool yysize_overflow = yyfalse;
-   char* yymsg = NULL;
+   char* yymsg = YY_NULL;
    enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
    /* Internationalized format string. */
-   const char *yyformat = 0;
+   const char *yyformat = YY_NULL;
    /* Arguments of yyformat. */
    char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
    /* Number of reported tokens (one for the "unexpected", one per
                      break;
                    }
                  yyarg[yycount++] = yytokenName (yyx);
-                 yysize1 = yysize + yytnamerr (NULL, yytokenName (yyx));
+                 yysize1 = yysize + yytnamerr (YY_NULL, yytokenName (yyx));
                  yysize_overflow |= yysize1 < yysize;
                  yysize = yysize1;
                }
@@@ -2220,53 -2235,53 +2227,53 @@@ yyrecoverSyntaxError (yyGLRStack* yysta
         reductions.  Skip tokens until we can proceed.  */
      while (YYID (yytrue))
        {
 -      yySymbol yytoken;
 -      if (yychar == YYEOF)
 -        yyFail (yystackp][]b4_lpure_args[, YY_NULL);
 -      if (yychar != YYEMPTY)
 -        {]b4_locations_if([[
 -          /* We throw away the lookahead, but the error range
 -             of the shifted error token must take it into account.  */
 -          yyGLRState *yys = yystackp->yytops.yystates[0];
 -          yyGLRStackItem yyerror_range[3];
 -          yyerror_range[1].yystate.yyloc = yys->yyloc;
 -          yyerror_range[2].yystate.yyloc = yylloc;
 -          YYLLOC_DEFAULT ((yys->yyloc), yyerror_range, 2);]])[
 -          yytoken = YYTRANSLATE (yychar);
 -          yydestruct ("Error: discarding",
 -                      yytoken, &yylval]b4_locuser_args([&yylloc])[);
 -        }
 -      YYDPRINTF ((stderr, "Reading a token: "));
 -      yychar = YYLEX;
 -      if (yychar <= YYEOF)
 -        {
 -          yychar = yytoken = YYEOF;
 -          YYDPRINTF ((stderr, "Now at end of input.\n"));
 -        }
 -      else
 -        {
 -          yytoken = YYTRANSLATE (yychar);
 -          YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 -        }
 -      yyj = yypact[yystackp->yytops.yystates[0]->yylrState];
 -      if (yypact_value_is_default (yyj))
 -        return;
 -      yyj += yytoken;
 -      if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken)
 -        {
 -          if (yydefact[yystackp->yytops.yystates[0]->yylrState] != 0)
 -            return;
 -        }
 -      else if (! yytable_value_is_error (yytable[yyj]))
 -        return;
 +        yySymbol yytoken;
 +        if (yychar == YYEOF)
-           yyFail (yystackp][]b4_lpure_args[, NULL);
++          yyFail (yystackp][]b4_lpure_args[, YY_NULL);
 +        if (yychar != YYEMPTY)
 +          {]b4_locations_if([[
 +            /* We throw away the lookahead, but the error range
 +               of the shifted error token must take it into account.  */
 +            yyGLRState *yys = yystackp->yytops.yystates[0];
 +            yyGLRStackItem yyerror_range[3];
 +            yyerror_range[1].yystate.yyloc = yys->yyloc;
 +            yyerror_range[2].yystate.yyloc = yylloc;
 +            YYLLOC_DEFAULT ((yys->yyloc), yyerror_range, 2);]])[
 +            yytoken = YYTRANSLATE (yychar);
 +            yydestruct ("Error: discarding",
-                         yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
++                        yytoken, &yylval]b4_locuser_args([&yylloc])[);
 +          }
 +        YYDPRINTF ((stderr, "Reading a token: "));
 +        yychar = YYLEX;
 +        if (yychar <= YYEOF)
 +          {
 +            yychar = yytoken = YYEOF;
 +            YYDPRINTF ((stderr, "Now at end of input.\n"));
 +          }
 +        else
 +          {
 +            yytoken = YYTRANSLATE (yychar);
 +            YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 +          }
 +        yyj = yypact[yystackp->yytops.yystates[0]->yylrState];
 +        if (yypact_value_is_default (yyj))
 +          return;
 +        yyj += yytoken;
 +        if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken)
 +          {
 +            if (yydefact[yystackp->yytops.yystates[0]->yylrState] != 0)
 +              return;
 +          }
 +        else if (! yytable_value_is_error (yytable[yyj]))
 +          return;
        }
  
    /* Reduce to one stack.  */
    for (yyk = 0; yyk < yystackp->yytops.yysize; yyk += 1)
-     if (yystackp->yytops.yystates[yyk] != NULL)
+     if (yystackp->yytops.yystates[yyk] != YY_NULL)
        break;
    if (yyk >= yystackp->yytops.yysize)
-     yyFail (yystackp][]b4_lpure_args[, NULL);
+     yyFail (yystackp][]b4_lpure_args[, YY_NULL);
    for (yyk += 1; yyk < yystackp->yytops.yysize; yyk += 1)
      yymarkStackDeleted (yystackp, yyk);
    yyremoveDeletes (yystackp);
  
    /* Now pop stack until we find a state that shifts the error token.  */
    yystackp->yyerrState = 3;
-   while (yystackp->yytops.yystates[0] != NULL)
+   while (yystackp->yytops.yystates[0] != YY_NULL)
      {
        yyGLRState *yys = yystackp->yytops.yystates[0];
        yyj = yypact[yys->yylrState];
        if (! yypact_value_is_default (yyj))
 -      {
 -        yyj += YYTERROR;
 -        if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
 -            && yyisShiftAction (yytable[yyj]))
 -          {
 -            /* Shift the error token.  */]b4_locations_if([[
 -            /* First adjust its location.*/
 +        {
 +          yyj += YYTERROR;
 +          if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR
 +              && yyisShiftAction (yytable[yyj]))
 +            {
-               /* Shift the error token having adjusted its location.  */
-               YYLTYPE yyerrloc;]b4_locations_if([[
++              /* Shift the error token.  */]b4_locations_if([[
++              /* First adjust its location.*/
+               YYLTYPE yyerrloc;
 -            yystackp->yyerror_range[2].yystate.yyloc = yylloc;
 -            YYLLOC_DEFAULT (yyerrloc, (yystackp->yyerror_range), 2);]])[
 -            YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
 -                             &yylval, &yyerrloc);
 -            yyglrShift (yystackp, 0, yytable[yyj],
 -                        yys->yyposn, &yylval]b4_locations_if([, &yyerrloc])[);
 -            yys = yystackp->yytops.yystates[0];
 -            break;
 -          }
 -      }]b4_locations_if([[
 +              yystackp->yyerror_range[2].yystate.yyloc = yylloc;
 +              YYLLOC_DEFAULT (yyerrloc, (yystackp->yyerror_range), 2);]])[
 +              YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
 +                               &yylval, &yyerrloc);
 +              yyglrShift (yystackp, 0, yytable[yyj],
-                           yys->yyposn, &yylval, &yyerrloc);
++                          yys->yyposn, &yylval]b4_locations_if([, &yyerrloc])[);
 +              yys = yystackp->yytops.yystates[0];
 +              break;
 +            }
-         }
- ]b4_locations_if([[      yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
-       if (yys->yypred != NULL)
++        }]b4_locations_if([[
+       yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
+       if (yys->yypred != YY_NULL)
 -      yydestroyGLRState ("Error: popping", yys]b4_user_args[);
 +        yydestroyGLRState ("Error: popping", yys]b4_user_args[);
        yystackp->yytops.yystates[0] = yys->yypred;
        yystackp->yynextFree -= 1;
        yystackp->yyspaceLeft += 1;
      }
-   if (yystackp->yytops.yystates[0] == NULL)
-     yyFail (yystackp][]b4_lpure_args[, NULL);
+   if (yystackp->yytops.yystates[0] == YY_NULL)
+     yyFail (yystackp][]b4_lpure_args[, YY_NULL);
  }
  
 -#define YYCHK1(YYE)                                                        \
 -  do {                                                                             \
 -    switch (YYE) {                                                         \
 -    case yyok:                                                                     \
 -      break;                                                               \
 -    case yyabort:                                                          \
 -      goto yyabortlab;                                                             \
 -    case yyaccept:                                                         \
 -      goto yyacceptlab;                                                            \
 -    case yyerr:                                                                    \
 -      goto yyuser_error;                                                   \
 -    default:                                                               \
 -      goto yybuglab;                                                       \
 -    }                                                                      \
 +#define YYCHK1(YYE)                                                          \
 +  do {                                                                       \
 +    switch (YYE) {                                                           \
 +    case yyok:                                                               \
 +      break;                                                                 \
 +    case yyabort:                                                            \
 +      goto yyabortlab;                                                       \
 +    case yyaccept:                                                           \
 +      goto yyacceptlab;                                                      \
 +    case yyerr:                                                              \
 +      goto yyuser_error;                                                     \
 +    default:                                                                 \
 +      goto yybuglab;                                                         \
 +    }                                                                        \
    } while (YYID (0))
  
 -
  /*----------.
  | yyparse.  |
  `----------*/
@@@ -2361,154 -2378,154 +2369,154 @@@ m4_popdef([b4_at_dollar])])dn
      case 2: goto yyexhaustedlab;
      default: goto yybuglab;
      }
-   yyglrShift (&yystack, 0, 0, 0, &yylval, &yylloc);
+   yyglrShift (&yystack, 0, 0, 0, &yylval]b4_locations_if([, &yylloc])[);
    yyposn = 0;
  
    while (YYID (yytrue))
      {
        /* For efficiency, we have two loops, the first of which is
 -       specialized to deterministic operation (single stack, no
 -       potential ambiguity).  */
 +         specialized to deterministic operation (single stack, no
 +         potential ambiguity).  */
        /* Standard mode */
        while (YYID (yytrue))
 -      {
 -        yyRuleNum yyrule;
 -        int yyaction;
 -        const short int* yyconflicts;
 -
 -        yyStateNum yystate = yystack.yytops.yystates[0]->yylrState;
 -        YYDPRINTF ((stderr, "Entering state %d\n", yystate));
 -        if (yystate == YYFINAL)
 -          goto yyacceptlab;
 -        if (yyisDefaultedState (yystate))
 -          {
 -            yyrule = yydefaultAction (yystate);
 -            if (yyrule == 0)
 -              {
 -]b4_locations_if([[             yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
 -                yyreportSyntaxError (&yystack]b4_user_args[);
 -                goto yyuser_error;
 -              }
 -            YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_user_args[));
 -          }
 -        else
 -          {
 -            yySymbol yytoken;
 -            if (yychar == YYEMPTY)
 -              {
 -                YYDPRINTF ((stderr, "Reading a token: "));
 -                yychar = YYLEX;
 -              }
 -
 -            if (yychar <= YYEOF)
 -              {
 -                yychar = yytoken = YYEOF;
 -                YYDPRINTF ((stderr, "Now at end of input.\n"));
 -              }
 -            else
 -              {
 -                yytoken = YYTRANSLATE (yychar);
 -                YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 -              }
 -
 -            yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
 -            if (*yyconflicts != 0)
 -              break;
 -            if (yyisShiftAction (yyaction))
 -              {
 -                YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 -                yychar = YYEMPTY;
 -                yyposn += 1;
 -                yyglrShift (&yystack, 0, yyaction, yyposn, &yylval]b4_locations_if([, &yylloc])[);
 -                if (0 < yystack.yyerrState)
 -                  yystack.yyerrState -= 1;
 -              }
 -            else if (yyisErrorAction (yyaction))
 -              {
 -]b4_locations_if([[             yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
 -                yyreportSyntaxError (&yystack]b4_user_args[);
 -                goto yyuser_error;
 -              }
 -            else
 -              YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_user_args[));
 -          }
 -      }
 +        {
 +          yyRuleNum yyrule;
 +          int yyaction;
 +          const short int* yyconflicts;
 +
 +          yyStateNum yystate = yystack.yytops.yystates[0]->yylrState;
 +          YYDPRINTF ((stderr, "Entering state %d\n", yystate));
 +          if (yystate == YYFINAL)
 +            goto yyacceptlab;
 +          if (yyisDefaultedState (yystate))
 +            {
 +              yyrule = yydefaultAction (yystate);
 +              if (yyrule == 0)
 +                {
 +]b4_locations_if([[               yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
 +                  yyreportSyntaxError (&yystack]b4_user_args[);
 +                  goto yyuser_error;
 +                }
 +              YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_user_args[));
 +            }
 +          else
 +            {
 +              yySymbol yytoken;
 +              if (yychar == YYEMPTY)
 +                {
 +                  YYDPRINTF ((stderr, "Reading a token: "));
 +                  yychar = YYLEX;
 +                }
 +
 +              if (yychar <= YYEOF)
 +                {
 +                  yychar = yytoken = YYEOF;
 +                  YYDPRINTF ((stderr, "Now at end of input.\n"));
 +                }
 +              else
 +                {
 +                  yytoken = YYTRANSLATE (yychar);
 +                  YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 +                }
 +
 +              yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
 +              if (*yyconflicts != 0)
 +                break;
 +              if (yyisShiftAction (yyaction))
 +                {
 +                  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 +                  yychar = YYEMPTY;
 +                  yyposn += 1;
-                   yyglrShift (&yystack, 0, yyaction, yyposn, &yylval, &yylloc);
++                  yyglrShift (&yystack, 0, yyaction, yyposn, &yylval]b4_locations_if([, &yylloc])[);
 +                  if (0 < yystack.yyerrState)
 +                    yystack.yyerrState -= 1;
 +                }
 +              else if (yyisErrorAction (yyaction))
 +                {
 +]b4_locations_if([[               yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
 +                  yyreportSyntaxError (&yystack]b4_user_args[);
 +                  goto yyuser_error;
 +                }
 +              else
 +                YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_user_args[));
 +            }
 +        }
  
        while (YYID (yytrue))
 -      {
 -        yySymbol yytoken_to_shift;
 -        size_t yys;
 -
 -        for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
 -          yystackp->yytops.yylookaheadNeeds[yys] = yychar != YYEMPTY;
 -
 -        /* yyprocessOneStack returns one of three things:
 -
 -            - An error flag.  If the caller is yyprocessOneStack, it
 -              immediately returns as well.  When the caller is finally
 -              yyparse, it jumps to an error label via YYCHK1.
 -
 -            - yyok, but yyprocessOneStack has invoked yymarkStackDeleted
 -              (&yystack, yys), which sets the top state of yys to NULL.  Thus,
 -              yyparse's following invocation of yyremoveDeletes will remove
 -              the stack.
 -
 -            - yyok, when ready to shift a token.
 -
 -           Except in the first case, yyparse will invoke yyremoveDeletes and
 -           then shift the next token onto all remaining stacks.  This
 -           synchronization of the shift (that is, after all preceding
 -           reductions on all stacks) helps prevent double destructor calls
 -           on yylval in the event of memory exhaustion.  */
 -
 -        for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
 -          YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn]b4_lpure_args[));
 -        yyremoveDeletes (&yystack);
 -        if (yystack.yytops.yysize == 0)
 -          {
 -            yyundeleteLastStack (&yystack);
 -            if (yystack.yytops.yysize == 0)
 -              yyFail (&yystack][]b4_lpure_args[, YY_("syntax error"));
 -            YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
 -            YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
 -]b4_locations_if([[         yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
 -            yyreportSyntaxError (&yystack]b4_user_args[);
 -            goto yyuser_error;
 -          }
 -
 -        /* If any yyglrShift call fails, it will fail after shifting.  Thus,
 -           a copy of yylval will already be on stack 0 in the event of a
 -           failure in the following loop.  Thus, yychar is set to YYEMPTY
 -           before the loop to make sure the user destructor for yylval isn't
 -           called twice.  */
 -        yytoken_to_shift = YYTRANSLATE (yychar);
 -        yychar = YYEMPTY;
 -        yyposn += 1;
 -        for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
 -          {
 -            int yyaction;
 -            const short int* yyconflicts;
 -            yyStateNum yystate = yystack.yytops.yystates[yys]->yylrState;
 -            yygetLRActions (yystate, yytoken_to_shift, &yyaction,
 -                            &yyconflicts);
 -            /* Note that yyconflicts were handled by yyprocessOneStack.  */
 -            YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long int) yys));
 -            YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, &yylval, &yylloc);
 -            yyglrShift (&yystack, yys, yyaction, yyposn,
 -                        &yylval]b4_locations_if([, &yylloc])[);
 -            YYDPRINTF ((stderr, "Stack %lu now in state #%d\n",
 -                        (unsigned long int) yys,
 -                        yystack.yytops.yystates[yys]->yylrState));
 -          }
 -
 -        if (yystack.yytops.yysize == 1)
 -          {
 -            YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
 -            YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
 -            yycompressStack (&yystack);
 -            break;
 -          }
 -      }
 +        {
 +          yySymbol yytoken_to_shift;
 +          size_t yys;
 +
 +          for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
 +            yystackp->yytops.yylookaheadNeeds[yys] = yychar != YYEMPTY;
 +
 +          /* yyprocessOneStack returns one of three things:
 +
 +              - An error flag.  If the caller is yyprocessOneStack, it
 +                immediately returns as well.  When the caller is finally
 +                yyparse, it jumps to an error label via YYCHK1.
 +
 +              - yyok, but yyprocessOneStack has invoked yymarkStackDeleted
 +                (&yystack, yys), which sets the top state of yys to NULL.  Thus,
 +                yyparse's following invocation of yyremoveDeletes will remove
 +                the stack.
 +
 +              - yyok, when ready to shift a token.
 +
 +             Except in the first case, yyparse will invoke yyremoveDeletes and
 +             then shift the next token onto all remaining stacks.  This
 +             synchronization of the shift (that is, after all preceding
 +             reductions on all stacks) helps prevent double destructor calls
 +             on yylval in the event of memory exhaustion.  */
 +
 +          for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
 +            YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn]b4_lpure_args[));
 +          yyremoveDeletes (&yystack);
 +          if (yystack.yytops.yysize == 0)
 +            {
 +              yyundeleteLastStack (&yystack);
 +              if (yystack.yytops.yysize == 0)
 +                yyFail (&yystack][]b4_lpure_args[, YY_("syntax error"));
 +              YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
 +              YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
 +]b4_locations_if([[           yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
 +              yyreportSyntaxError (&yystack]b4_user_args[);
 +              goto yyuser_error;
 +            }
 +
 +          /* If any yyglrShift call fails, it will fail after shifting.  Thus,
 +             a copy of yylval will already be on stack 0 in the event of a
 +             failure in the following loop.  Thus, yychar is set to YYEMPTY
 +             before the loop to make sure the user destructor for yylval isn't
 +             called twice.  */
 +          yytoken_to_shift = YYTRANSLATE (yychar);
 +          yychar = YYEMPTY;
 +          yyposn += 1;
 +          for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
 +            {
 +              int yyaction;
 +              const short int* yyconflicts;
 +              yyStateNum yystate = yystack.yytops.yystates[yys]->yylrState;
 +              yygetLRActions (yystate, yytoken_to_shift, &yyaction,
 +                              &yyconflicts);
 +              /* Note that yyconflicts were handled by yyprocessOneStack.  */
 +              YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long int) yys));
 +              YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, &yylval, &yylloc);
 +              yyglrShift (&yystack, yys, yyaction, yyposn,
-                           &yylval, &yylloc);
++                          &yylval]b4_locations_if([, &yylloc])[);
 +              YYDPRINTF ((stderr, "Stack %lu now in state #%d\n",
 +                          (unsigned long int) yys,
 +                          yystack.yytops.yystates[yys]->yylrState));
 +            }
 +
 +          if (yystack.yytops.yysize == 1)
 +            {
 +              YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
 +              YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
 +              yycompressStack (&yystack);
 +              break;
 +            }
 +        }
        continue;
      yyuser_error:
        yyrecoverSyntaxError (&yystack]b4_user_args[);
   yyreturn:
    if (yychar != YYEMPTY)
      yydestruct ("Cleanup: discarding lookahead",
-                 YYTRANSLATE (yychar),
-                 &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
 -              YYTRANSLATE (yychar), &yylval]b4_locuser_args([&yylloc])[);
++                YYTRANSLATE (yychar), &yylval]b4_locuser_args([&yylloc])[);
  
    /* If the stack is well-formed, pop the stack until it is empty,
       destroying its entries as we go.  But free the stack regardless
      {
        yyGLRState** yystates = yystack.yytops.yystates;
        if (yystates)
 -      {
 -        size_t yysize = yystack.yytops.yysize;
 -        size_t yyk;
 -        for (yyk = 0; yyk < yysize; yyk += 1)
 -          if (yystates[yyk])
 -            {
 -              while (yystates[yyk])
 -                {
 -                  yyGLRState *yys = yystates[yyk];
 -]b4_locations_if([[               yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
 -)[                if (yys->yypred != YY_NULL)
 -                    yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
 -                  yystates[yyk] = yys->yypred;
 -                  yystack.yynextFree -= 1;
 -                  yystack.yyspaceLeft += 1;
 -                }
 -              break;
 -            }
 -      }
 +        {
 +          size_t yysize = yystack.yytops.yysize;
 +          size_t yyk;
 +          for (yyk = 0; yyk < yysize; yyk += 1)
 +            if (yystates[yyk])
 +              {
 +                while (yystates[yyk])
 +                  {
 +                    yyGLRState *yys = yystates[yyk];
 +]b4_locations_if([[                 yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
- )[                  if (yys->yypred != NULL)
++)[                  if (yys->yypred != YY_NULL)
 +                      yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
 +                    yystates[yyk] = yys->yypred;
 +                    yystack.yynextFree -= 1;
 +                    yystack.yyspaceLeft += 1;
 +                  }
 +                break;
 +              }
 +        }
        yyfreeGLRStack (&yystack);
      }
  
@@@ -2592,7 -2608,7 +2599,7 @@@ yy_yypstack (yyGLRState* yys
  static void
  yypstates (yyGLRState* yyst)
  {
-   if (yyst == NULL)
+   if (yyst == YY_NULL)
      YYFPRINTF (stderr, "<null>");
    else
      yy_yypstack (yyst);
@@@ -2605,8 -2621,8 +2612,8 @@@ yypstack (yyGLRStack* yystackp, size_t 
    yypstates (yystackp->yytops.yystates[yyk]);
  }
  
 -#define YYINDEX(YYX)                                                       \
 +#define YYINDEX(YYX)                                                         \
-     ((YYX) == NULL ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems)
+     ((YYX) == YY_NULL ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems)
  
  
  static void
@@@ -2619,33 -2635,35 +2626,33 @@@ yypdumpstack (yyGLRStack* yystackp
        YYFPRINTF (stderr, "%3lu. ",
                   (unsigned long int) (yyp - yystackp->yyitems));
        if (*(yybool *) yyp)
 -      {
 -        YYFPRINTF (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
 -                   yyp->yystate.yyresolved, yyp->yystate.yylrState,
 -                   (unsigned long int) yyp->yystate.yyposn,
 -                   (long int) YYINDEX (yyp->yystate.yypred));
 -        if (! yyp->yystate.yyresolved)
 -          YYFPRINTF (stderr, ", firstVal: %ld",
 -                     (long int) YYINDEX (yyp->yystate
 +        {
 +          YYFPRINTF (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
 +                     yyp->yystate.yyresolved, yyp->yystate.yylrState,
 +                     (unsigned long int) yyp->yystate.yyposn,
 +                     (long int) YYINDEX (yyp->yystate.yypred));
 +          if (! yyp->yystate.yyresolved)
 +            YYFPRINTF (stderr, ", firstVal: %ld",
 +                       (long int) YYINDEX (yyp->yystate
                                               .yysemantics.yyfirstVal));
 -      }
 +        }
        else
 -      {
 -        YYFPRINTF (stderr, "Option. rule: %d, state: %ld, next: %ld",
 -                   yyp->yyoption.yyrule - 1,
 -                   (long int) YYINDEX (yyp->yyoption.yystate),
 -                   (long int) YYINDEX (yyp->yyoption.yynext));
 -      }
 +        {
 +          YYFPRINTF (stderr, "Option. rule: %d, state: %ld, next: %ld",
 +                     yyp->yyoption.yyrule - 1,
 +                     (long int) YYINDEX (yyp->yyoption.yystate),
 +                     (long int) YYINDEX (yyp->yyoption.yynext));
 +        }
        YYFPRINTF (stderr, "\n");
      }
    YYFPRINTF (stderr, "Tops:");
    for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
      YYFPRINTF (stderr, "%lu: %ld; ", (unsigned long int) yyi,
 -             (long int) YYINDEX (yystackp->yytops.yystates[yyi]));
 +               (long int) YYINDEX (yystackp->yytops.yystates[yyi]));
    YYFPRINTF (stderr, "\n");
  }
  #endif
 -]
 -
 -b4_epilogue
 +]b4_epilogue[]dnl
  dnl
  dnl glr.cc produces its own header.
  dnl
@@@ -2663,5 -2681,5 +2670,5 @@@ b4_pure_if([]
  b4_locations_if([b4_pure_if([],
  [extern YYLTYPE ]b4_prefix[lloc;])
  ])
 -])])
 +])])[]dnl
  m4_divert_pop(0)
diff --combined data/lalr1.cc
index 4179deafdf691119f2a6c00f07cf63b673da0740,d7201dd42c5f5b449c95ff83ed3e4467524dee26..d67c9548cf603db81d34573863e75f2cae79f907
  
  m4_include(b4_pkgdatadir/[c++.m4])
  
 +
 +# b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
 +# --------------------------------------------------------------
 +# Declare "parser::yy<TABLE-NAME>_" which contents is CONTENT.
 +m4_define([b4_integral_parser_table_declare],
 +[m4_ifval([$3], [b4_c_comment([$3], [  ])
 +])dnl
 +  static const b4_int_type_for([$2]) yy$1_[[]];dnl
 +])
 +
 +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
 +# -------------------------------------------------------------
 +# Define "parser::yy<TABLE-NAME>_" which 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_symbol_value_template(VAL, [TYPE])
 +# -------------------------------------
 +# Same as b4_symbol_value, but used in a template method.  It makes
 +# a difference when using variants.
 +m4_copy([b4_symbol_value], [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_dollar_dollar],
 +    [b4_symbol_value_template([yysym.value],
 +                              b4_symbol_if([$1], [has_type],
 +                                           [b4_symbol([$1], [type])]))])dnl
 +m4_pushdef([b4_at_dollar], [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;
 +
 +m4_popdef([b4_at_dollar])dnl
 +m4_popdef([b4_dollar_dollar])dnl
 +])])
 +
 +
 +m4_pushdef([b4_copyright_years],
 +           [2002-2012])
 +
  m4_define([b4_parser_class_name],
            [b4_percent_define_get([[parser_class_name]])])
  
  b4_defines_if([],
                [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
  
 -b4_percent_define_ifdef([[location_type]], [],
 +b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
    [# Backward compatibility.
    m4_define([b4_location_constructors])
 -  m4_include(b4_pkgdatadir/[location.cc])])
 +  m4_include(b4_pkgdatadir/[location.cc])])])
 +m4_include(b4_pkgdatadir/[stack.hh])
 +b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
  
  # We do want M4 expansion after # for CPP macros.
  m4_changecom()
  m4_divert_push(0)dnl
 -b4_defines_if(
 -[@output(b4_spec_defines_file@)@
 -b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
 -             [2002-2012])
 +@output(b4_spec_defines_file@)@
 +b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
  dnl FIXME: This is wrong, we want computed header guards.
  [
  /* C++ LALR(1) parser skeleton written by Akim Demaille.  */
  
  ]b4_percent_code_get([[requires]])[
  
 +]b4_parse_assert_if([#include <cassert>])[
 +#include <stdexcept>
  #include <string>
  #include <iostream>
  #include "stack.hh"
 -]b4_percent_define_ifdef([[location_type]], [],
 -                         [[#include "location.hh"]])[
 +]b4_locations_if([b4_percent_define_ifdef([[location_type]], [],
 +                                          [[#include "location.hh"]])])[
 +
 +]b4_variant_if([b4_namespace_open
 +b4_variant_define
 +b4_namespace_close])[
  
+ ]b4_null_define[
  /* Enabling traces.  */
  #ifndef YYDEBUG
 -# define YYDEBUG ]b4_debug_flag[
 +# define YYDEBUG ]b4_parse_trace_if([1], [0])[
  #endif
  
  /* Enabling verbose error messages.  */
  # 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
  
  /* Enabling the token table.  */
    class ]b4_parser_class_name[
    {
    public:
 -    /// Symbol semantic values.
 -#ifndef YYSTYPE
 -]m4_ifdef([b4_stype],
 -[    union semantic_type
 -    {
 -b4_user_stype
 -    };],
 -[m4_if(b4_tag_seen_flag, 0,
 -[[    typedef int semantic_type;]],
 -[[    typedef YYSTYPE semantic_type;]])])[
 -#else
 -    typedef YYSTYPE semantic_type;
 -#endif
 -    /// Symbol locations.
 -    typedef ]b4_percent_define_get([[location_type]],
 -                                   [[location]])[ 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
  
 -  private:
 -    /// 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);
 -
 -    /// 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);
 -
 -#if YYDEBUG
 -    /// \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
 +    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:
      /// 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_;
 +
 +    /// Generate an error message.
 +    /// \param yystate   the state where the error occurred.
 +    /// \param yytoken   the lookahead token.
 +    virtual std::string yysyntax_error_ (state_type yystate, int yytoken);
 +
 +    /// 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
  
      /// 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_[];
 -
 -    /// 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_[];
 +    /* Tables.  */
 +]b4_parser_tables_declare[
  
  #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
      /// For a symbol, its name in clear.
      static std::string yytnamerr_ (const char *n);])[
  
  #if YYDEBUG
 -    /// 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.
  #endif
  
      /// Convert a scanner token number \a t to a symbol number.
 -    token_number_type yytranslate_ (int t);
 +    static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t);
 +
 +#if YYDEBUG
 +    /// \brief Display a symbol type, value and location.
 +    /// \param yyo    The output stream.
 +    /// \param yysym  The symbol.
 +    template <typename Exact>
 +    void yy_print_ (std::ostream& yyo,
 +                    const symbol_base_type<Exact>& yysym) const;
 +#endif
  
      /// \brief Reclaim the memory associated to a symbol.
 -    /// \param yymsg        Why this token is reclaimed.
 -    /// \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 Exact>
 +    inline void yy_destroy_ (const char* yymsg,
 +                             symbol_base_type<Exact>& yysym) const;
 +
 +  private:
 +    /// Element of the stack: a state and its attributes.
 +    struct stack_symbol_type : symbol_base_type<stack_symbol_type>
 +    {
 +      /// The parent class.
 +      typedef symbol_base_type<stack_symbol_type> super_type;
 +
 +      /// Default constructor.
 +      inline stack_symbol_type ();
 +
 +      /// Constructor.
 +      inline stack_symbol_type (]b4_args([state_type s],
 +                                         [const semantic_type& v],
 +                                         b4_locations_if([const location_type& l]))[);
 +
 +      /// The state.
 +      state_type state;
 +
 +      /// The type (corresponding to \a state).
 +      inline int type_get_ () const;
 +    };
 +
 +    /// 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.
 +    inline 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.
 +    inline 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_;
 +    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_lex_symbol_if([b4_yytranslate_define
 +b4_public_types_define])[
  ]b4_namespace_close[
  
  ]b4_percent_define_flag_if([[global_tokens_and_yystype]],
  b4_percent_code_get([[provides]])[]dnl
  
  [#endif /* ! defined PARSER_HEADER_H */]
 -])dnl
  @output(b4_parser_file_name@)@
 -b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
 -             [2002-2012])
 +b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++])
  b4_percent_code_get([[top]])[]dnl
  m4_if(b4_prefix, [yy], [],
  [
  #define yylex   b4_prefix[]lex])[
  
  /* First part of user declarations.  */
 -]b4_user_pre_prologue
 +]b4_user_pre_prologue[
  
 -b4_defines_if([[
 -#include "@basename(]b4_spec_defines_file[@)"]])[
 +#include "@basename(]b4_spec_defines_file[@)"
  
  /* User implementation prologue.  */
  ]b4_user_post_prologue
@@@ -389,12 -313,11 +391,12 @@@ b4_percent_code_get[]dn
  # endif
  #endif
  
 -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
 +]b4_locations_if([dnl
 +[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
     If N is 0, then set CURRENT to the empty location which ends
     the previous symbol: RHS[0] (always defined).  */
  
 -#define YYRHSLOC(Rhs, K) ((Rhs)[K])
 +#define YYRHSLOC(Rhs, K) ((Rhs)[K].location)
  #ifndef YYLLOC_DEFAULT
  # define YYLLOC_DEFAULT(Current, Rhs, N)                               \
   do                                                                    \
         (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;        \
       }                                                                 \
   while (false)
 -#endif
 +#endif]])[
  
  /* Suppress unused-variable warnings by "using" E.  */
  #define YYUSE(e) ((void) (e))
  /* 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)
 +# 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 /* !YYDEBUG */
  
  # define YYCDEBUG if (false) std::cerr
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 -# define YY_REDUCE_PRINT(Rule)
 -# define YY_STACK_PRINT()
 +# 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 /* !YYDEBUG */
  
 -#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([[
    {
    }
  
 -#if YYDEBUG
 -  /*--------------------------------.
 -  | Print this symbol on YYOUTPUT.  |
 -  `--------------------------------*/
  
 -  inline void
 -  ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
 -                         const semantic_type* yyvaluep, const location_type* yylocationp)
 +  /*---------------.
 +  | Symbol types.  |
 +  `---------------*/
 +
 +]b4_lex_symbol_if([], [b4_public_types_define])[
 +
 +  // stack_symbol_type.
 +  ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type ()
 +    : super_type ()
 +    , state ()
    {
 -    YYUSE (yylocationp);
 -    YYUSE (yyvaluep);
 -    switch (yytype)
 -      {
 -  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
 -[       default:
 -        break;
 -      }
    }
  
 +  ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_args(
 +                 [state_type s],
 +                 [const semantic_type& v],
 +                 b4_locations_if([const location_type& l]))[)
 +    : super_type (v]b4_locations_if([, l])[)
 +    , state (s)
 +  {
 +  }
  
 -  void
 -  ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
 -                         const semantic_type* yyvaluep, const location_type* yylocationp)
 +  int
 +  ]b4_parser_class_name[::stack_symbol_type::type_get_ () const
    {
 -    *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
 -             << ' ' << yytname_[yytype] << " ("
 -             << *yylocationp << ": ";
 -    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
 -    *yycdebug_ << ')';
 +    return yystos_[state];
    }
 -#endif
  
 +
 +  template <typename Exact>
    void
 -  ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
 -                         int yytype, semantic_type* yyvaluep, location_type* yylocationp)
 +  ]b4_parser_class_name[::yy_destroy_ (const char* yymsg,
 +                                       symbol_base_type<Exact>& yysym) const
    {
 -    YYUSE (yylocationp);
 -    YYUSE (yymsg);
 -    YYUSE (yyvaluep);
 +    int yytype = yysym.type_get ();
 +    if (yymsg)
 +      YY_SYMBOL_PRINT (yymsg, yysym);
 +
 +    // User destructor.
 +    switch (yytype)
 +      {
 +]b4_symbol_foreach([b4_symbol_destructor])dnl
 +[       default:
 +          break;
 +      }]b4_variant_if([
  
 -    YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 +    // Type destructor.
 +  b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[
 +  }
  
 +#if YYDEBUG
 +  template <typename Exact>
 +  void
 +  ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
 +                                     const symbol_base_type<Exact>& yysym) const
 +  {
 +    int yytype = yysym.type_get ();
 +    yyo << (yytype < yyntokens_ ? "token" : "nterm")
 +        << ' ' << yytname_[yytype] << " ("]b4_locations_if([
 +        << yysym.location << ": "])[;
      switch (yytype)
        {
 -  ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
 -      default:
 -        break;
 +]b4_symbol_foreach([b4_symbol_printer])dnl
 +      default:
 +          break;
        }
 +    yyo << ')';
 +  }
 +#endif
 +
 +  void
 +  ]b4_parser_class_name[::yypush_ (const char* m, state_type s,
 +                                   symbol_type& sym)
 +  {
 +    if (m)
 +      YY_SYMBOL_PRINT (m, sym);
 +]b4_variant_if(
 +[[    yystack_.push (stack_symbol_type (]b4_args(
 +                    [s],
 +                    [semantic_type()],
 +                    b4_locations_if([sym.location]))[));
 +    ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]],
 +                       [build], [sym.value])],
 +[[    yystack_.push (stack_symbol_type (]b4_args(
 +                      [s],
 +                      [sym.value],
 +                      b4_locations_if([sym.location]))[));]])[
 +  }
 +
 +  void
 +  ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
 +  {
 +    if (m)
 +      YY_SYMBOL_PRINT (m, s);
 +]b4_variant_if(
 +[[    yystack_.push (stack_symbol_type (]b4_args(
 +                       [s.state],
 +                       [semantic_type()],
 +                       b4_locations_if([s.location]))[));
 +    ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]],
 +                       [build], [s.value])],
 +[    yystack_.push (s);])[
    }
  
    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 YYDEBUG
    }
  #endif
  
 +  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.
 -    semantic_type yylval;
 -    /// 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;
  
      YYCDEBUG << "Starting parse" << std::endl;
  
  ]m4_ifdef([b4_initial_action], [
 -m4_pushdef([b4_at_dollar],     [yylloc])dnl
 -m4_pushdef([b4_dollar_dollar], [yylval])dnl
 +m4_pushdef([b4_at_dollar],     [yyla.location])dnl
 +m4_pushdef([b4_dollar_dollar], [yyla.value])dnl
      /* User initialization code.  */
      b4_user_initial_action
  m4_popdef([b4_dollar_dollar])dnl
  m4_popdef([b4_at_dollar])])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.  */
 -    yystate_stack_ = state_stack_type (0);
 -    yysemantic_stack_ = semantic_stack_type (0);
 -    yylocation_stack_ = location_stack_type (0);
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yylloc);
 +    yystack_ = stack_type (0);
 +    yypush_ (0, 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_)
 +    if (yystack_[0].state == yyfinal_)
        goto yyacceptlab;
  
      goto yybackup;
    yybackup:
  
      /* Try to take a decision without lookahead.  */
 -    yyn = yypact_[yystate];
 +    yyn = yypact_[yystack_[0].state];
      if (yy_pact_value_is_default_ (yyn))
        goto yydefault;
  
      /* Read a lookahead token.  */
 -    if (yychar == yyempty_)
 -      {
 -      YYCDEBUG << "Reading a token: ";
 -      yychar = ]b4_c_function_call([yylex], [int],
 -                                   [[YYSTYPE*], [&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
 +    if (yyempty)
        {
 -      yytoken = yytranslate_ (yychar);
 -      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
 +        YYCDEBUG << "Reading a token: ";
 +        try
 +        {
 +]b4_lex_symbol_if(
 +[          yyla = b4_c_function_call([yylex], [symbol_type],
 +                                     m4_ifdef([b4_lex_param], b4_lex_param));],
 +[          yyla.type = yytranslate_ (b4_c_function_call([yylex], [int],
 +                                     [[YYSTYPE*], [&yyla.value]][]dnl
 +b4_locations_if([, [[location*], [&yyla.location]]])dnl
 +m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
 +        }
 +        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;
 +    if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type)
        goto yydefault;
  
      /* 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);
 +    yyempty = true;
  
      /* 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.
  
 -       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
 +    {
 +      switch (yyn)
        {
 -      ]b4_user_actions[
 -      default:
 +]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);
 +]b4_variant_if([[
 +    // Destroy the rhs symbols.
 +    for (int i = 0; i < yylen; ++i)
 +      // Destroy a variant which value may have been swapped with
 +      // yylhs.value (for instance if the action was "std::swap($$,
 +      // $1)").  The value of yylhs.value (hence possibly one of these
 +      // rhs symbols) depends on the default contruction for this
 +      // type.  In the case of pointers for instance, no
 +      // initialization is done, so the value is junk.  Therefore do
 +      // not try to report the value of symbols about to be destroyed
 +      // in the debug trace, it's possibly junk.  Hence yymsg = 0.
 +      // Besides, that keeps exactly the same traces as with the other
 +      // Bison skeletons.
 +      yy_destroy_ (0, yystack_[i]);]])[
  
      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_];
 +    yypush_ (0, 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 (!yyerrstatus_)
        {
 -      ++yynerrs_;
 -      if (yychar == yyempty_)
 -        yytoken = yyempty_;
 -      error (yylloc, yysyntax_error_ (yystate, yytoken));
 +        ++yynerrs_;
 +        error (]b4_args(b4_locations_if([yyla.location]),
 +                        [[yysyntax_error_ (yystack_[0].state,
 +                                           yyempty ? yyempty_ : yyla.type)]])[);
        }
  
 -    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
 -        {
 -          yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
 -          yychar = yyempty_;
 -        }
 +        /* If just tried and failed to reuse lookahead token after an
 +           error, discard it.  */
 +
 +        /* Return failure if at end of input.  */
 +        if (yyla.type == yyeof_)
 +          YYABORT;
 +        else if (!yyempty)
 +          {
 +            yy_destroy_ ("Error: discarding", yyla);
 +            yyempty = true;
 +          }
        }
  
      /* Else will try to reuse lookahead token after shifting the error
         YYERROR and the label yyerrorlab therefore never appears in user
         code.  */
      if (false)
 -      goto yyerrorlab;
 -
 -    yyerror_range[1] = yylocation_stack_[yylen - 1];
 +      goto yyerrorlab;]b4_locations_if([[
 +    yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
 +    /* $$ was initialized before running the user action.  */
 +    yy_destroy_ ("Error: discarding", yylhs);]])[
      /* Do not reclaim the symbols of the rule which 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.  */
      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
         this YYABORT or YYACCEPT.  */
      yypop_ (yylen);
 -    while (yystate_stack_.height () != 1)
 +    while (yystack_.size () != 1)
        {
 -      yydestruct_ ("Cleanup: popping",
 -                 yystos_[yystate_stack_[0]],
 -                 &yysemantic_stack_[0],
 -                 &yylocation_stack_[0]);
 -      yypop_ ();
 +        yy_destroy_ ("Cleanup: popping", yystack_[0]);
 +        yypop_ ();
        }
  
      return yyresult;
    }
  
 +  void
 +  ]b4_parser_class_name[::error (const syntax_error& yyexc)
 +  {
 +    error (]b4_args(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],
 +b4_error_verbose_if([state_type yystate, int yytoken],
                      [int, int])[)
    {]b4_error_verbose_if([[
      std::string yyres;
           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
            }
        }
  
-     char const* yyformat = 0;
+     char const* yyformat = YY_NULL;
      switch (yycount)
        {
  #define YYCASE_(N, S)                         \
    }
  
  
 -  /* 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 YYDEBUG
 -  /* 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[
  
  #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
    /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    const char*
    const ]b4_parser_class_name[::yytname_[] =
    {
 -    ]b4_tname[
 +  ]b4_tname[
    };
  #endif
  
  #if YYDEBUG
 -  /* 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;
    }
  
      int yynrhs = yyr2_[yyrule];
      /* Print the symbols being reduced, and their result.  */
      *yycdebug_ << "Reducing stack by rule " << yyrule - 1
 -             << " (line " << yylno << "):" << std::endl;
 +               << " (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 // YYDEBUG
  
 -  /* 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_namespace_close[
 -
 -]b4_epilogue
 -dnl
 -@output(b4_dir_prefix[]stack.hh@)@
 -b4_copyright([Stack handling for Bison parsers in C++],
 -             [2002-2012])[
 -
 -#ifndef BISON_STACK_HH
 -# define BISON_STACK_HH
 -
 -#include <deque>
 -
 -]b4_namespace_open[
 -  template <class T, class S = std::deque<T> >
 -  class stack
 -  {
 -  public:
 -
 -    // Hide our reversed order.
 -    typedef typename S::reverse_iterator iterator;
 -    typedef typename S::const_reverse_iterator const_iterator;
 -
 -    stack () : seq_ ()
 -    {
 -    }
 -
 -    stack (unsigned int n) : seq_ (n)
 -    {
 -    }
 -
 -    inline
 -    T&
 -    operator [] (unsigned int i)
 -    {
 -      return seq_[i];
 -    }
 -
 -    inline
 -    const T&
 -    operator [] (unsigned int i) const
 -    {
 -      return seq_[i];
 -    }
 -
 -    inline
 -    void
 -    push (const T& t)
 -    {
 -      seq_.push_front (t);
 -    }
 -
 -    inline
 -    void
 -    pop (unsigned int n = 1)
 -    {
 -      for (; n; --n)
 -      seq_.pop_front ();
 -    }
 -
 -    inline
 -    unsigned int
 -    height () const
 -    {
 -      return seq_.size ();
 -    }
 -
 -    inline const_iterator begin () const { return seq_.rbegin (); }
 -    inline const_iterator end () const { return seq_.rend (); }
 -
 -  private:
 -
 -    S seq_;
 -  };
 -
 -  /// Present a slice of the top of a stack.
 -  template <class T, class S = stack<T> >
 -  class slice
 -  {
 -  public:
 -
 -    slice (const S& stack,
 -         unsigned int range) : stack_ (stack),
 -                               range_ (range)
 -    {
 -    }
 -
 -    inline
 -    const T&
 -    operator [] (unsigned int i) const
 -    {
 -      return stack_[range_ - i];
 -    }
 -
 -  private:
 -
 -    const S& stack_;
 -    unsigned int range_;
 -  };
 +]b4_lex_symbol_if([], [b4_yytranslate_define])[
  ]b4_namespace_close[
 -
 -#endif // not BISON_STACK_HH[]dnl
 -]
 +]b4_epilogue[]dnl
  m4_divert_pop(0)
 +m4_popdef([b4_copyright_years])dnl
diff --combined data/lalr1.java
index 57ff9932f93086a152d23edc34287424747df61f,103c03ddc83032356c329ea0ec421e2cea130d40..a40d6c272a6ee2374acf437b9c6f83c1a4698825
  
  m4_include(b4_pkgdatadir/[java.m4])
  
 -b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], [b4_skeleton])])
 -m4_ifval(m4_defn([b4_symbol_destructors]),
 -        [b4_fatal([%s: %%destructor does not make sense in Java], [b4_skeleton])],
 -        [])
 +b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java],
 +              [b4_skeleton])])
 +
 +# We don't depend on %debug in Java, but pacify warnings about non-used flags.
 +b4_parse_trace_if([0], [0])
 +
 +m4_define([b4_symbol_no_destructor_assert],
 +[b4_symbol_if([$1], [has_destructor],
 +              [b4_fatal([%s: %s: %%destructor does not make sense in Java],
 +                        [b4_skeleton],
 +                        [b4_symbol_action_location([$1], [destructor])])])])
 +b4_symbol_foreach([b4_symbol_no_destructor_assert])
  
  m4_divert_push(0)dnl
  @output(b4_parser_file_name@)@
@@@ -37,16 -29,14 +37,16 @@@ b4_copyright([Skeleton implementation f
  
  b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
  ])[/* First part of user declarations.  */
 -]b4_pre_prologue
 +]b4_user_pre_prologue
 +b4_user_post_prologue
  b4_percent_code_get([[imports]])
  [/**
   * A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
   *
   * @@author LALR (1) parser skeleton written by Paolo Bonzini.
   */
 -]b4_public_if([public ])dnl
 +]b4_percent_define_get3([annotations], [], [ ])dnl
 +b4_public_if([public ])dnl
  b4_abstract_if([abstract ])dnl
  b4_final_if([final ])dnl
  b4_strictfp_if([strictfp ])dnl
@@@ -55,22 -45,9 +55,22 @@@ b4_percent_define_get3([extends], [ ext
  b4_percent_define_get3([implements], [ implements ])[
  {
    ]b4_identification[
 -
 +]b4_error_verbose_if([[
    /** True if verbose error messages are enabled.  */
 -  public boolean errorVerbose = ]b4_flag_value([error_verbose]);
 +  private boolean yyErrorVerbose = true;
 +
 +  /**
 +   * Return whether verbose error messages are enabled.
 +   */
 +  public final boolean getErrorVerbose() { return yyErrorVerbose; }
 +
 +  /**
 +   * Set the verbosity of error messages.
 +   * @@param verbose True to request verbose error messages.
 +   */
 +  public final void setErrorVerbose(boolean verbose)
 +  { yyErrorVerbose = verbose; }
 +]])
  
  b4_locations_if([[
    /**
  
  ]])
  
 -[  /** Token returned by the scanner to signal the end of its input.  */
 -  public static final int EOF = 0;]
 -
 -b4_token_enums(b4_tokens)
 -
    b4_locations_if([[
    private ]b4_location_type[ yylloc (YYStack rhs, int n)
    {
     * parser <tt>]b4_parser_class_name[</tt>.
     */
    public interface Lexer {
 +    /** Token returned by the scanner to signal the end of its input.  */
 +    public static final int EOF = 0;
 +
 +]b4_token_enums(b4_tokens)[
 +
      ]b4_locations_if([[/**
       * Method to retrieve the beginning position of the last scanned token.
       * @@return the position at which the last scanned token starts.  */
       *
       * ]b4_locations_if([[@@param loc The location of the element to which the
       *                error message is related]])[
 -     * @@param s The string for the error message.  */
 -     void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s);]
 +     * @@param msg The string for the error message.  */
 +     void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);]
    }
  
    b4_lexer_if([[private class YYLexer implements Lexer {
@@@ -180,9 -157,7 +180,9 @@@ b4_lexer_if([
    /**
     * Instantiates the Bison-generated parser.
     */
 -  public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) {
 +  public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) ]b4_maybe_throws([b4_init_throws])[
 +  {
 +    ]b4_percent_code_get([[init]])[
      this.yylexer = new YYLexer(]b4_lex_param_call[);
      ]b4_parse_param_cons[
    }
     * Instantiates the Bison-generated parser.
     * @@param yylexer The scanner that will supply tokens to the parser.
     */
 -  b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) {
 +  b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) ]b4_maybe_throws([b4_init_throws])[
 +  {
 +    ]b4_percent_code_get([[init]])[
      this.yylexer = yylexer;
      ]b4_parse_param_cons[
    }
     */
    public final void setDebugLevel(int level) { yydebug = level; }
  
 -  private final int yylex () ]b4_maybe_throws([b4_lex_throws]) [{
 -    return yylexer.yylex ();
 +  /**
 +   * Print an error message via the lexer.
 +   *]b4_locations_if([[ Use a <code>null</code> location.]])[
 +   * @@param msg The error message.
 +   */
 +  public final void yyerror (String msg)
 +  {
 +    yylexer.yyerror (]b4_locations_if([[(]b4_location_type[)null, ]])[msg);
    }
 -  protected final void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s) {
 -    yylexer.yyerror (]b4_locations_if([loc, ])[s);
 +]b4_locations_if([[
 +  /**
 +   * Print an error message via the lexer.
 +   * @@param loc The location associated with the message.
 +   * @@param msg The error message.
 +   */
 +  public final void yyerror (]b4_location_type[ loc, String msg)
 +  {
 +    yylexer.yyerror (loc, msg);
    }
  
 -  ]b4_locations_if([
 -  protected final void yyerror (String s) {
 -    yylexer.yyerror ((]b4_location_type[)null, s);
 -  }
 -  protected final void yyerror (]b4_position_type[ loc, String s) {
 -    yylexer.yyerror (new ]b4_location_type[ (loc), s);
 -  }])
 +  /**
 +   * Print an error message via the lexer.
 +   * @@param pos The position associated with the message.
 +   * @@param msg The error message.
 +   */
 +  public final void yyerror (]b4_position_type[ pos, String msg)
 +  {
 +    yylexer.yyerror (new ]b4_location_type[ (pos), msg);
 +  }]])
  
    [protected final void yycdebug (String s) {
      if (yydebug > 0)
      public int height = -1;
  
      public final void push (int state, ]b4_yystype[ value]dnl
 -                          b4_locations_if([, ]b4_location_type[ loc])[) {
 +                            b4_locations_if([, ]b4_location_type[ loc])[) {
        height++;
        if (size == height)
          {
 -        int[] newStateStack = new int[size * 2];
 -        System.arraycopy (stateStack, 0, newStateStack, 0, height);
 -        stateStack = newStateStack;
 -        ]b4_locations_if([[
 -        ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
 -        System.arraycopy (locStack, 0, newLocStack, 0, height);
 -        locStack = newLocStack;]])
 -
 -        b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
 -        System.arraycopy (valueStack, 0, newValueStack, 0, height);
 -        valueStack = newValueStack;
 -
 -        size *= 2;
 -      }
 +          int[] newStateStack = new int[size * 2];
 +          System.arraycopy (stateStack, 0, newStateStack, 0, height);
 +          stateStack = newStateStack;
 +          ]b4_locations_if([[
 +          ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
 +          System.arraycopy (locStack, 0, newLocStack, 0, height);
 +          locStack = newLocStack;]])
 +
 +          b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
 +          System.arraycopy (valueStack, 0, newValueStack, 0, height);
 +          valueStack = newValueStack;
 +
 +          size *= 2;
 +        }
  
        stateStack[height] = state;
        ]b4_locations_if([[locStack[height] = loc;]])[
      public final void pop (int num) {
        // Avoid memory leaks... garbage collection is a white lie!
        if (num > 0) {
 -      java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);
 +        java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);
          ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[
        }
        height -= num;
  
        for (int i = 0; i <= height; i++)
          {
 -        out.print (' ');
 -        out.print (stateStack[i]);
 +          out.print (' ');
 +          out.print (stateStack[i]);
          }
        out.println ();
      }
  
      switch (yyn)
        {
 -      ]b4_user_actions[
 -      default: break;
 +        ]b4_user_actions[
 +        default: break;
        }
  
      yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[);
      yyn = yyr1_[yyn];
      int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
      if (0 <= yystate && yystate <= yylast_
 -      && yycheck_[yystate] == yystack.stateAt (0))
 +        && yycheck_[yystate] == yystack.stateAt (0))
        yystate = yytable_[yystate];
      else
        yystate = yydefgoto_[yyn - yyntokens_];
      return YYNEWSTATE;
    }
  
 +]b4_error_verbose_if([[
    /* Return YYSTR after stripping away unnecessary quotes and
       backslashes, so that it's suitable for yyerror.  The heuristic is
       that double-quoting is unnecessary unless the string contains an
                break strip_quotes;
  
              case '\\':
 -            if (yystr.charAt(++i) != '\\')
 +              if (yystr.charAt(++i) != '\\')
                  break strip_quotes;
                /* Fall through.  */
              default:
  
      return yystr;
    }
 +]])[
  
    /*--------------------------------.
    | Print this symbol on YYOUTPUT.  |
    `--------------------------------*/
  
    private void yy_symbol_print (String s, int yytype,
 -                               ]b4_yystype[ yyvaluep]dnl
 -                               b4_locations_if([, Object yylocationp])[)
 +                                 ]b4_yystype[ yyvaluep]dnl
 +                                 b4_locations_if([, Object yylocationp])[)
    {
      if (yydebug > 0)
      yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
 -            + yytname_[yytype] + " ("]b4_locations_if([
 -            + yylocationp + ": "])[
 -            + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
 +              + yytname_[yytype] + " ("]b4_locations_if([
 +              + yylocationp + ": "])[
 +              + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
    }
  
    /**
@@@ -517,7 -473,7 +517,7 @@@ m4_popdef([b4_at_dollar])])dn
        switch (label)
        {
          /* New state.  Unlike in the C/C++ skeletons, the state is already
 -         pushed when we come here.  */
 +           pushed when we come here.  */
        case YYNEWSTATE:
          yycdebug ("Entering state " + yystate + "\n");
          if (yydebug > 0)
          if (yy_pact_value_is_default_ (yyn))
            {
              label = YYDEFAULT;
 -          break;
 +            break;
            }
  
          /* Read a lookahead token.  */
          if (yychar == yyempty_)
            {
 -          yycdebug ("Reading a token: ");
 -          yychar = yylex ();]
 +            yycdebug ("Reading a token: ");
 +            yychar = yylexer.yylex ();]
              b4_locations_if([[
 -          yylloc = new ]b4_location_type[(yylexer.getStartPos (),
 -                                          yylexer.getEndPos ());]])
 +            yylloc = new ]b4_location_type[(yylexer.getStartPos (),
 +                            yylexer.getEndPos ());]])
              yylval = yylexer.getLVal ();[
            }
  
          /* Convert token to internal form.  */
 -        if (yychar <= EOF)
 +        if (yychar <= Lexer.EOF)
            {
 -          yychar = yytoken = EOF;
 -          yycdebug ("Now at end of input.\n");
 +            yychar = yytoken = Lexer.EOF;
 +            yycdebug ("Now at end of input.\n");
            }
          else
            {
 -          yytoken = yytranslate_ (yychar);
 -          yy_symbol_print ("Next token is", yytoken,
 -                           yylval]b4_locations_if([, yylloc])[);
 +            yytoken = yytranslate_ (yychar);
 +            yy_symbol_print ("Next token is", yytoken,
 +                             yylval]b4_locations_if([, yylloc])[);
            }
  
          /* If the proper action on seeing token YYTOKEN is to reduce or to
          /* <= 0 means reduce or error.  */
          else if ((yyn = yytable_[yyn]) <= 0)
            {
 -          if (yy_table_value_is_error_ (yyn))
 -            label = YYERRLAB;
 -          else
 -            {
 -              yyn = -yyn;
 -              label = YYREDUCE;
 -            }
 +            if (yy_table_value_is_error_ (yyn))
 +              label = YYERRLAB;
 +            else
 +              {
 +                yyn = -yyn;
 +                label = YYREDUCE;
 +              }
            }
  
          else
            {
              /* Shift the lookahead token.  */
 -          yy_symbol_print ("Shifting", yytoken,
 -                           yylval]b4_locations_if([, yylloc])[);
 +            yy_symbol_print ("Shifting", yytoken,
 +                             yylval]b4_locations_if([, yylloc])[);
  
              /* Discard the token being shifted.  */
              yychar = yyempty_;
        case YYREDUCE:
          yylen = yyr2_[yyn];
          label = yyaction (yyn, yystack, yylen);
 -      yystate = yystack.stateAt (0);
 +        yystate = yystack.stateAt (0);
          break;
  
        /*------------------------------------.
          ]b4_locations_if([yyerrloc = yylloc;])[
          if (yyerrstatus_ == 3)
            {
 -          /* If just tried and failed to reuse lookahead token after an
 -           error, discard it.  */
 -
 -          if (yychar <= EOF)
 -            {
 -            /* Return failure if at end of input.  */
 -            if (yychar == EOF)
 -              return false;
 -            }
 -          else
 -            yychar = yyempty_;
 +        /* If just tried and failed to reuse lookahead token after an
 +         error, discard it.  */
 +
 +        if (yychar <= Lexer.EOF)
 +          {
 +          /* Return failure if at end of input.  */
 +          if (yychar == Lexer.EOF)
 +            return false;
 +          }
 +        else
 +              yychar = yyempty_;
            }
  
          /* Else will try to reuse lookahead token after shifting the error
        | yyerrlab1 -- common code for both syntax error and YYERROR.  |
        `-------------------------------------------------------------*/
        case YYERRLAB1:
 -        yyerrstatus_ = 3;     /* Each real token shifted decrements this.  */
 +        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 (yystack.height == 0)
 -            return false;
 -
 -          ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
 -          yystack.pop ();
 -          yystate = yystack.stateAt (0);
 -          if (yydebug > 0)
 -            yystack.print (yyDebugStream);
 +            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 (yystack.height == 1)
++            if (yystack.height == 0)
 +              return false;
 +
 +            ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
 +            yystack.pop ();
 +            yystate = yystack.stateAt (0);
 +            if (yydebug > 0)
 +              yystack.print (yyDebugStream);
            }
  
 -      ]b4_locations_if([
 -      /* Muck with the stack to setup for yylloc.  */
 -      yystack.push (0, null, yylloc);
 -      yystack.push (0, null, yyerrloc);
 +        ]b4_locations_if([
 +        /* Muck with the stack to setup for yylloc.  */
 +        yystack.push (0, null, yylloc);
 +        yystack.push (0, null, yyerrloc);
          yyloc = yylloc (yystack, 2);
 -      yystack.pop (2);])[
 +        yystack.pop (2);])[
  
          /* Shift the error token.  */
          yy_symbol_print ("Shifting", yystos_[yyn],
 -                       yylval]b4_locations_if([, yyloc])[);
 +                         yylval]b4_locations_if([, yyloc])[);
  
          yystate = yyn;
 -      yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
 +        yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
          label = YYNEWSTATE;
          break;
  
  
    // Generate an error message.
    private String yysyntax_error (int yystate, int tok)
 -  {
 -    if (errorVerbose)
 +  {]b4_error_verbose_if([[
 +    if (yyErrorVerbose)
        {
          /* There are many possibilities here to consider:
             - Assume YYFAIL is not used.  It's too flawed to consider.
              return res.toString ();
            }
        }
 -
 +]])[
      return "syntax error";
    }
  
      return yyvalue == yytable_ninf_;
    }
  
 -  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -     STATE-NUM.  */
    private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[;
 -  private static final ]b4_int_type_for([b4_pact])[ yypact_[] =
 -  {
 -    ]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.  */
 -  private static final ]b4_int_type_for([b4_defact])[ yydefact_[] =
 -  {
 -    ]b4_defact[
 -  };
 -
 -  /* YYPGOTO[NTERM-NUM].  */
 -  private static final ]b4_int_type_for([b4_pgoto])[ yypgoto_[] =
 -  {
 -    ]b4_pgoto[
 -  };
 -
 -  /* YYDEFGOTO[NTERM-NUM].  */
 -  private static final ]b4_int_type_for([b4_defgoto])[
 -  yydefgoto_[] =
 -  {
 -    ]b4_defgoto[
 -  };
 -
 -  /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
 -     positive, shift that token.  If negative, reduce the rule which
 -     number is the opposite.  If YYTABLE_NINF_, syntax error.  */
    private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
 -  private static final ]b4_int_type_for([b4_table])[
 -  yytable_[] =
 -  {
 -    ]b4_table[
 -  };
  
 -  /* YYCHECK.  */
 -  private static final ]b4_int_type_for([b4_check])[
 -  yycheck_[] =
 -  {
 -    ]b4_check[
 -  };
 -
 -  /* STOS_[STATE-NUM] -- The (internal number of the) accessing
 -     symbol of state STATE-NUM.  */
 -  private static final ]b4_int_type_for([b4_stos])[
 -  yystos_[] =
 -  {
 -    ]b4_stos[
 -  };
 -
 -  /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
 -     to YYLEX-NUM.  */
 -  private static final ]b4_int_type_for([b4_toknum])[
 -  yytoken_number_[] =
 -  {
 -    ]b4_toknum[
 -  };
 -
 -  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -  private static final ]b4_int_type_for([b4_r1])[
 -  yyr1_[] =
 -  {
 -    ]b4_r1[
 -  };
 -
 -  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -  private static final ]b4_int_type_for([b4_r2])[
 -  yyr2_[] =
 -  {
 -    ]b4_r2[
 -  };
 +  ]b4_parser_tables_define[
 +  ]b4_integral_parser_table_define([token_number], [b4_toknum],
 +     [TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
 +     to YYLEX-NUM.])[
  
    /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
       First, the terminals, then, starting at \a yyntokens_, nonterminals.  */
 -  private static final String yytname_[] =
 -  {
 -    ]b4_tname[
 -  };
 -
 -  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -  private static final ]b4_int_type_for([b4_rhs])[ yyrhs_[] =
 -  {
 -    ]b4_rhs[
 -  };
 +  ]b4_typed_parser_table_define([String], [tname], [b4_tname])[
  
 -  /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -     YYRHS.  */
 -  private static final ]b4_int_type_for([b4_prhs])[ yyprhs_[] =
 -  {
 -    ]b4_prhs[
 -  };
 -
 -  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 -  private static final ]b4_int_type_for([b4_rline])[ yyrline_[] =
 -  {
 -    ]b4_rline[
 -  };
 +  ]b4_integral_parser_table_define([rline], [b4_rline],
 +  [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
  
    // Report on the debug stream that the rule yyrule is going to be reduced.
    private void yy_reduce_print (int yyrule, YYStack yystack)
      int yynrhs = yyr2_[yyrule];
      /* Print the symbols being reduced, and their result.  */
      yycdebug ("Reducing stack by rule " + (yyrule - 1)
 -            + " (line " + yylno + "), ");
 +              + " (line " + yylno + "), ");
  
      /* 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_locations_if([,
 -                     b4_rhs_location(yynrhs, yyi + 1)])[);
 +                       yystos_[yystack.stateAt(yynrhs - (yyi + 1))],
 +                       ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([,
 +                       b4_rhs_location(yynrhs, yyi + 1)])[);
    }
  
    /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 -  private static final ]b4_int_type_for([b4_translate])[ yytranslate_table_[] =
 -  {
 -    ]b4_translate[
 -  };
 +  ]b4_integral_parser_table_define([translate_table], [b4_translate])[
  
    private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
    {
@@@ -880,5 -926,5 +880,5 @@@ b4_percent_code_get[]dn
  
  }
  
 -b4_epilogue
 +b4_epilogue[]dnl
  m4_divert_pop(0)dnl
diff --combined data/location.cc
index 174ce6ef47470cba742f5720328abfed0cfe6755,cb0f1f91fb604f06170bdb67ad49dc538c28eb29..e750779c0fc8de053cf6c4e9ea3dd51d3ee664ba
@@@ -1,6 -1,6 +1,6 @@@
  # C++ skeleton for Bison
  
 -# Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc.
 +# Copyright (C) 2002-2012 Free Software Foundation, Inc.
  
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
 +m4_pushdef([b4_copyright_years],
 +           [2002-2012])
 +
  # We do want M4 expansion after # for CPP macros.
  m4_changecom()
  m4_divert_push(0)dnl
  @output(b4_dir_prefix[]position.hh@)@
 -b4_copyright([Positions for Bison parsers in C++],
 -             [2002-2007, 2009-2012])[
 +b4_copyright([Positions for Bison parsers in C++])[
  
  /**
   ** \file position.hh
@@@ -36,6 -34,8 +36,8 @@@
  # include <string>
  # include <algorithm>
  
+ ]b4_null_define[
  ]b4_namespace_open[
    /// Abstract a position.
    class position
@@@ -43,7 -43,7 +45,7 @@@
    public:
  ]m4_ifdef([b4_location_constructors], [[
      /// Construct a position.
-     explicit position (]b4_percent_define_get([[filename_type]])[* f = 0,
+     explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULL,
                         unsigned int l = ]b4_location_initial_line[u,
                         unsigned int c = ]b4_location_initial_column[u)
        : filename (f)
  
  ]])[
      /// Initialization.
-     inline void initialize (]b4_percent_define_get([[filename_type]])[* fn)
+     void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULL,
+                      unsigned int l = ]b4_location_initial_line[u,
+                      unsigned int c = ]b4_location_initial_column[u)
      {
        filename = fn;
-       line = ]b4_location_initial_line[u;
-       column = ]b4_location_initial_column[u;
+       line = l;
+       column = c;
      }
  
      /** \name Line and Column related manipulators
       ** \{ */
      /// (line related) Advance to the COUNT next lines.
-     /// Set current column to initial value.
-     inline void lines (int count = 1)
+     void lines (int count = 1)
      {
        column = ]b4_location_initial_column[u;
        line += count;
      }
  
      /// (column related) Advance to the COUNT next columns.
-     inline void columns (int count = 1)
+     void columns (int count = 1)
      {
        column = std::max (]b4_location_initial_column[u, column + count);
      }
  ]b4_namespace_close[
  #endif // not BISON_POSITION_HH]
  @output(b4_dir_prefix[]location.hh@)@
 -b4_copyright([Locations for Bison parsers in C++],
 -             [2002-2007, 2009-2012])[
 +b4_copyright([Locations for Bison parsers in C++])[
  
  /**
   ** \file location.hh
  
  ])[
      /// Initialization.
-     inline void initialize (]b4_percent_define_get([[filename_type]])[* fn)
+     void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULL,
+                      unsigned int l = ]b4_location_initial_line[u,
+                      unsigned int c = ]b4_location_initial_column[u)
      {
-       begin.initialize (fn);
+       begin.initialize (f, l, c);
        end = begin;
      }
  
       ** \{ */
    public:
      /// Reset initial location to final location.
-     inline void step ()
+     void step ()
      {
        begin = end;
      }
  
      /// Extend the current location to the COUNT next columns.
-     inline void columns (unsigned int count = 1)
+     void columns (unsigned int count = 1)
      {
        end += count;
      }
  
      /// Extend the current location to the COUNT next lines.
-     inline void lines (unsigned int count = 1)
+     void lines (unsigned int count = 1)
      {
        end.lines (count);
      }
      position last = loc.end - 1;
      ostr << loc.begin;
      if (last.filename
 -      && (!loc.begin.filename
 -          || *loc.begin.filename != *last.filename))
 +        && (!loc.begin.filename
 +            || *loc.begin.filename != *last.filename))
        ostr << '-' << last;
      else if (loc.begin.line != last.line)
        ostr << '-' << last.line  << '.' << last.column;
  
  #endif // not BISON_LOCATION_HH]
  m4_divert_pop(0)
 +m4_popdef([b4_copyright_years])dnl
  m4_changecom([#])
diff --combined data/yacc.c
index 19b5331db0acd06bff6d2023190a15cbb65cd9a7,284e13de56a7eb87f18e48ba3d03969cc84273bb..a8dce4a7acdf32c7a1fe9e3c7d84955c5cf3d49e
@@@ -1,12 -1,10 +1,12 @@@
                                                               -*- C -*-
 -
  # Yacc compatible skeleton for Bison
  
  # Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation,
  # Inc.
  
 +m4_pushdef([b4_copyright_years],
 +           [1984, 1989-1990, 2000-2012])
 +
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation, either version 3 of the License, or
@@@ -76,8 -74,8 +76,8 @@@ m4_define([b4_pure_flag]
  # Expand IF-TRUE, if %pure-parser and %parse-param, IF-FALSE otherwise.
  m4_define([b4_yacc_pure_if],
  [b4_pure_if([m4_ifset([b4_parse_param],
 -                    [$1], [$2])],
 -          [$2])])
 +                      [$1], [$2])],
 +            [$2])])
  
  
  # b4_yyerror_args
@@@ -117,7 -115,7 +117,7 @@@ m4_define([b4_int_type]
  
         m4_eval([0 <= $1]),                [1], [unsigned int],
  
 -                                             [int])])
 +                                               [int])])
  
  
  ## ----------------- ##
  # --------------------
  # Expansion of $<TYPE>$.
  m4_define([b4_lhs_value],
 -[(yyval[]m4_ifval([$1], [.$1]))])
 +[b4_symbol_value(yyval, [$1])])
  
  
  # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
  # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
  # symbols on RHS.
  m4_define([b4_rhs_value],
 -[(yyvsp@{($2) - ($1)@}m4_ifval([$3], [.$3]))])
 +          [b4_symbol_value([yyvsp@{b4_subtract([$2], [$1])@}], [$3])])
  
  
  
@@@ -157,7 -155,7 +157,7 @@@ m4_define([b4_lhs_location]
  # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
  # on RHS.
  m4_define([b4_rhs_location],
 -[(yylsp@{($2) - ($1)@})])
 +          [(yylsp@{b4_subtract([$2], [$1])@})])
  
  
  ## ------------------ ##
@@@ -235,7 -233,8 +235,7 @@@ m4_define([b4_declare_parser_state_vari
  m4_changecom()
  m4_divert_push(0)dnl
  @output(b4_parser_file_name@)@
 -b4_copyright([Bison implementation for Yacc-like parsers in C],
 -             [1984, 1989-1990, 2000-2012])[
 +b4_copyright([Bison implementation for Yacc-like parsers in C])[
  
  /* C LALR(1) parser skeleton written by Richard Stallman, by
     simplifying the original so-called "semantic" parser.  */
@@@ -268,9 -267,11 +268,11 @@@ m4_if(b4_prefix, [yy], []
  /* Copy the first part of user declarations.  */
  ]b4_user_pre_prologue[
  
+ ]b4_null_define[
  /* Enabling traces.  */
  #ifndef YYDEBUG
 -# define YYDEBUG ]b4_debug_flag[
 +# define YYDEBUG ]b4_parse_trace_if([1], [0])[
  #endif
  
  /* Enabling verbose error messages.  */
  # 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
  
  /* Enabling the token table.  */
@@@ -465,7 -466,7 +467,7 @@@ b4_push_if([], [b4_lac_if([], [
  #  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
@@@ -490,8 -491,8 +492,8 @@@ void free (void *); /* INFRINGES ON USE
  
  #if (! defined yyoverflow \
       && (! defined __cplusplus \
 -       || (]b4_locations_if([[defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
 -           && ]])[defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 +         || (]b4_locations_if([[defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
 +             && ]])[defined YYSTYPE_IS_TRIVIAL && YYSTYPE_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);                          \
 -      }                                                                       \
 +# 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))
  
  #endif
  #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 YYDEBUG
 -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -   YYRHS.  */
 -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
 -{
 -  ]b4_prhs[
 -};
 -
 -/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
 -{
 -  ]b4_rhs[
 -};
 -
 -/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 -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 YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
@@@ -598,34 -613,89 +600,34 @@@ 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[
 -};
 -
 -/* 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[
 -};
 +]b4_parser_tables_define[
  
 -#define yyerrok               (yyerrstatus = 0)
 -#define yyclearin     (yychar = YYEMPTY)
 -#define YYEMPTY               (-2)
 -#define YYEOF         0
 +#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 YYACCEPT        goto yyacceptlab
 +#define YYABORT         goto yyabortlab
 +#define YYERROR         goto yyerrorlab
  
  
  /* Like YYERROR except do call yyerror.  This remains here temporarily
     in Bison 2.4.2's NEWS entry, where a plan to phase it out is
     discussed.  */
  
 -#define YYFAIL                goto yyerrlab
 +#define YYFAIL          goto yyerrlab
  #if defined YYFAIL
    /* This is here to suppress warnings from the GCC cpp's
       -Wunused-macros.  Normally we don't worry about that warning, but
    else                                                          \
      {                                                           \
        yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
 -      YYERROR;                                                        \
 -    }                                                         \
 +      YYERROR;                                                  \
 +    }                                                           \
  while (YYID (0))
  
  
 -#define YYTERROR      1
 -#define YYERRCODE     256
 +#define YYTERROR        1
 +#define YYERRCODE       256
  
  
  /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
  
  #define YYRHSLOC(Rhs, K) ((Rhs)[K])
  #ifndef YYLLOC_DEFAULT
 -# define YYLLOC_DEFAULT(Current, Rhs, N)                              \
 -    do                                                                        \
 +# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
 +    do                                                                  \
        if (YYID (N))                                                    \
 -      {                                                               \
 -        (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
 -        (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
 -        (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
 -        (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
 -      }                                                               \
 -      else                                                            \
 -      {                                                               \
 -        (Current).first_line   = (Current).last_line   =              \
 -          YYRHSLOC (Rhs, 0).last_line;                                \
 -        (Current).first_column = (Current).last_column =              \
 -          YYRHSLOC (Rhs, 0).last_column;                              \
 -      }                                                               \
 +        {                                                               \
 +          (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
 +          (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
 +          (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
 +          (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
 +        }                                                               \
 +      else                                                              \
 +        {                                                               \
 +          (Current).first_line   = (Current).last_line   =              \
 +            YYRHSLOC (Rhs, 0).last_line;                                \
 +          (Current).first_column = (Current).last_column =              \
 +            YYRHSLOC (Rhs, 0).last_column;                              \
 +        }                                                               \
      while (YYID (0))
  #endif]b4_locations_if([[
  
  
  #ifndef YY_LOCATION_PRINT
  # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
 -#  define YY_LOCATION_PRINT(File, Loc)                        \
 -     fprintf (File, "%d.%d-%d.%d",                    \
 -            (Loc).first_line, (Loc).first_column,     \
 -            (Loc).last_line,  (Loc).last_column)
 +#  define YY_LOCATION_PRINT(File, Loc)                  \
 +     fprintf (File, "%d.%d-%d.%d",                      \
 +              (Loc).first_line, (Loc).first_column,     \
 +              (Loc).last_line,  (Loc).last_column)
  # else
  #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
  # endif
  #  define YYFPRINTF fprintf
  # endif
  
 -# define YYDPRINTF(Args)                      \
 -do {                                          \
 -  if (yydebug)                                        \
 -    YYFPRINTF Args;                           \
 +# 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");                                                 \
 -    }                                                                   \
 +# 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])[
  `------------------------------------------------------------------*/
  
  ]b4_c_function_def([yy_stack_print], [static void],
 -                 [[yytype_int16 *yybottom], [yybottom]],
 -                 [[yytype_int16 *yytop],    [yytop]])[
 +                   [[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));                         \
 +# define YY_STACK_PRINT(Bottom, Top)                            \
 +do {                                                            \
 +  if (yydebug)                                                  \
 +    yy_stack_print ((Bottom), (Top));                           \
  } while (YYID (0))
  
  
  `------------------------------------------------*/
  
  ]b4_c_function_def([yy_reduce_print], [static void],
 -                 [[YYSTYPE *yyvsp], [yyvsp]],
 +                   [[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[); \
 +# define YY_REDUCE_PRINT(Rule)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print (yyssp, yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
  } while (YYID (0))
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
@@@ -824,7 -892,7 +826,7 @@@ int yydebug
  
  
  /* YYINITDEPTH -- initial size of the parser's stacks.  */
 -#ifndef       YYINITDEPTH
 +#ifndef YYINITDEPTH
  # define YYINITDEPTH ]b4_stack_depth_init[
  #endif
  
@@@ -1131,27 -1199,27 +1133,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: ;
      }
  
@@@ -1554,26 -1622,26 +1556,26 @@@ m4_ifdef([b4_at_dollar_used], [[  yylsp
  
  #ifdef yyoverflow
        {
 -      /* Give user a chance to reallocate the stack.  Use copies of
 -         these so that the &'s don't force the real ones into
 -         memory.  */
 -      YYSTYPE *yyvs1 = yyvs;
 -      yytype_int16 *yyss1 = yyss;]b4_locations_if([
 -      YYLTYPE *yyls1 = yyls;])[
 -
 -      /* Each stack pointer address is followed by the size of the
 -         data in use in that stack, in bytes.  This used to be a
 -         conditional around just the two extra args, but that might
 -         be undefined if yyoverflow is a macro.  */
 -      yyoverflow (YY_("memory exhausted"),
 -                  &yyss1, yysize * sizeof (*yyssp),
 -                  &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 -                  &yyls1, yysize * sizeof (*yylsp),])[
 -                  &yystacksize);
 +        /* Give user a chance to reallocate the stack.  Use copies of
 +           these so that the &'s don't force the real ones into
 +           memory.  */
 +        YYSTYPE *yyvs1 = yyvs;
 +        yytype_int16 *yyss1 = yyss;]b4_locations_if([
 +        YYLTYPE *yyls1 = yyls;])[
 +
 +        /* Each stack pointer address is followed by the size of the
 +           data in use in that stack, in bytes.  This used to be a
 +           conditional around just the two extra args, but that might
 +           be undefined if yyoverflow is a macro.  */
 +        yyoverflow (YY_("memory exhausted"),
 +                    &yyss1, yysize * sizeof (*yyssp),
 +                    &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 +                    &yyls1, yysize * sizeof (*yylsp),])[
 +                    &yystacksize);
  ]b4_locations_if([
 -      yyls = yyls1;])[
 -      yyss = yyss1;
 -      yyvs = yyvs1;
 +        yyls = yyls1;])[
 +        yyss = yyss1;
 +        yyvs = yyvs1;
        }
  #else /* no yyoverflow */
  # ifndef YYSTACK_RELOCATE
  # else
        /* Extend the stack our own way.  */
        if (YYMAXDEPTH <= yystacksize)
 -      goto yyexhaustedlab;
 +        goto yyexhaustedlab;
        yystacksize *= 2;
        if (YYMAXDEPTH < yystacksize)
 -      yystacksize = YYMAXDEPTH;
 +        yystacksize = YYMAXDEPTH;
  
        {
 -      yytype_int16 *yyss1 = yyss;
 -      union yyalloc *yyptr =
 -        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 -      if (! yyptr)
 -        goto yyexhaustedlab;
 -      YYSTACK_RELOCATE (yyss_alloc, yyss);
 -      YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 -      YYSTACK_RELOCATE (yyls_alloc, yyls);])[
 +        yytype_int16 *yyss1 = yyss;
 +        union yyalloc *yyptr =
 +          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 +        if (! yyptr)
 +          goto yyexhaustedlab;
 +        YYSTACK_RELOCATE (yyss_alloc, yyss);
 +        YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 +        YYSTACK_RELOCATE (yyls_alloc, yyls);])[
  #  undef YYSTACK_RELOCATE
 -      if (yyss1 != yyssa)
 -        YYSTACK_FREE (yyss1);
 +        if (yyss1 != yyssa)
 +          YYSTACK_FREE (yyss1);
        }
  # endif
  #endif /* no yyoverflow */
        yylsp = yyls + yysize - 1;])[
  
        YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 -                (unsigned long int) yystacksize));
 +                  (unsigned long int) yystacksize));
  
        if (yyss + yystacksize - 1 <= yyssp)
 -      YYABORT;
 +        YYABORT;
      }
  
    YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@@ -1846,20 -1914,20 +1848,20 @@@ yyerrlab
    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
@@@ -1892,29 -1960,29 +1894,29 @@@ yyerrorlab
  | yyerrlab1 -- common code for both syntax error and YYERROR.  |
  `-------------------------------------------------------------*/
  yyerrlab1:
 -  yyerrstatus = 3;    /* Each real token shifted decrements this.  */
 +  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
  
    for (;;)
      {
        yyn = yypact[yystate];
        if (!yypact_value_is_default (yyn))
 -      {
 -        yyn += YYTERROR;
 -        if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
 -          {
 -            yyn = yytable[yyn];
 -            if (0 < yyn)
 -              break;
 -          }
 -      }
 +        {
 +          yyn += YYTERROR;
 +          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
 +            {
 +              yyn = yytable[yyn];
 +              if (0 < yyn)
 +                break;
 +            }
 +        }
  
        /* Pop the current state because it cannot handle the error token.  */
        if (yyssp == yyss)
 -      YYABORT;
 +        YYABORT;
  
  ]b4_locations_if([[      yyerror_range[1] = *yylsp;]])[
        yydestruct ("Error: popping",
 -                yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
 +                  yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
        YYPOPSTACK (1);
        yystate = *yyssp;
        YY_STACK_PRINT (yyss, yyssp);
@@@ -1979,7 -2047,7 +1981,7 @@@ yyreturn
    while (yyssp != yyss)
      {
        yydestruct ("Cleanup: popping",
 -                yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
 +                  yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
        YYPOPSTACK (1);
      }
  #ifndef yyoverflow
@@@ -1999,10 -2067,12 +2001,10 @@@ yypushreturn:]])
    return YYID (yyresult);
  }
  
 -
 -]b4_epilogue
 +]b4_epilogue[]dnl
  b4_defines_if(
  [@output(b4_spec_defines_file@)@
 -b4_copyright([Bison interface for Yacc-like parsers in C],
 -             [1984, 1989-1990, 2000-2012])
 +b4_copyright([Bison interface for Yacc-like parsers in C])dnl
  
  b4_percent_code_get([[requires]])[]dnl
  
@@@ -2065,4 -2135,3 +2067,4 @@@ b4_c_function_decl([b4_prefix[pstate_de
  b4_percent_code_get([[provides]])[]dnl
  ])dnl b4_defines_if
  m4_divert_pop(0)
 +m4_popdef([b4_copyright_years])
diff --combined doc/bison.texinfo
index 21883b3baedde630da9eeaa70779c8b61ef72162,76a7dbaee432c2c2b501bbb09672caf7b607ccbc..45125c191607849f707008f3ea24409621e9e4bb
@@@ -135,8 -135,7 +135,8 @@@ Writing GLR Parser
  
  * Simple GLR Parsers::     Using GLR parsers on unambiguous grammars.
  * Merging GLR Parses::     Using GLR parsers to resolve ambiguities.
 -* GLR Semantic Actions::   Deferred semantic actions have special concerns.
 +* GLR Semantic Actions::   Considerations for semantic values and deferred actions.
 +* Semantic Predicates::    Controlling a parse with arbitrary computations.
  * Compiler Requirements::  GLR parsers require a modern C compiler.
  
  Examples
@@@ -163,9 -162,9 +163,9 @@@ Reverse Polish Notation Calculato
  
  Grammar Rules for @code{rpcalc}
  
 -* Rpcalc Input::
 -* Rpcalc Line::
 -* Rpcalc Expr::
 +* Rpcalc Input::            Explanation of the @code{input} nonterminal
 +* Rpcalc Line::             Explanation of the @code{line} nonterminal
 +* Rpcalc Expr::             Explanation of the @code{expr} nonterminal
  
  Location Tracking Calculator: @code{ltcalc}
  
@@@ -178,8 -177,6 +178,8 @@@ Multi-Function Calculator: @code{mfcalc
  * Mfcalc Declarations::    Bison declarations for multi-function calculator.
  * Mfcalc Rules::           Grammar rules for the calculator.
  * Mfcalc Symbol Table::    Symbol table management subroutines.
 +* Mfcalc Lexer::           The lexical analyzer.
 +* Mfcalc Main::            The controlling function.
  
  Bison Grammar Files
  
@@@ -275,8 -272,7 +275,8 @@@ The Bison Parser Algorith
  Operator Precedence
  
  * Why Precedence::    An example showing why precedence is needed.
 -* Using Precedence::  How to specify precedence in Bison grammars.
 +* Using Precedence::  How to specify precedence and associativity.
 +* Precedence Only::   How to specify precedence only.
  * Precedence Examples::  How these features are used in the previous example.
  * How Precedence::    How they work.
  
@@@ -320,6 -316,11 +320,11 @@@ C++ Parser
  * C++ Scanner Interface::       Exchanges between yylex and parse
  * A Complete C++ Example::      Demonstrating their use
  
+ C++ Location Values
+ * C++ position::                One point in the source file
+ * C++ location::                Two points in the source file
  A Complete C++ Example
  
  * Calc++ --- C++ Calculator::   The specifications
@@@ -761,8 -762,7 +766,8 @@@ merged result
  @menu
  * Simple GLR Parsers::     Using GLR parsers on unambiguous grammars.
  * Merging GLR Parses::     Using GLR parsers to resolve ambiguities.
 -* GLR Semantic Actions::   Deferred semantic actions have special concerns.
 +* GLR Semantic Actions::   Considerations for semantic values and deferred actions.
 +* Semantic Predicates::    Controlling a parse with arbitrary computations.
  * Compiler Requirements::  GLR parsers require a modern C compiler.
  @end menu
  
@@@ -1130,10 -1130,6 +1135,10 @@@ the offending merge
  @node GLR Semantic Actions
  @subsection GLR Semantic Actions
  
 +The nature of GLR parsing and the structure of the generated
 +parsers give rise to certain restrictions on semantic values and actions.
 +
 +@subsubsection Deferred semantic actions
  @cindex deferred semantic actions
  By definition, a deferred semantic action is not performed at the same time as
  the associated reduction.
@@@ -1167,7 -1163,6 +1172,7 @@@ For example, if a semantic action migh
  to invoke @code{yyclearin} (@pxref{Action Features}) or to attempt to free
  memory referenced by @code{yylval}.
  
 +@subsubsection YYERROR
  @findex YYERROR
  @cindex GLR parsers and @code{YYERROR}
  Another Bison feature requiring special consideration is @code{YYERROR}
  initiate error recovery.
  During deterministic GLR operation, the effect of @code{YYERROR} is
  the same as its effect in a deterministic parser.
 -In a deferred semantic action, its effect is undefined.
 -@c The effect is probably a syntax error at the split point.
 +The effect in a deferred action is similar, but the precise point of the
 +error is undefined;  instead, the parser reverts to deterministic operation,
 +selecting an unspecified stack on which to continue with a syntax error.
 +In a semantic predicate (see @ref{Semantic Predicates}) during nondeterministic
 +parsing, @code{YYERROR} silently prunes
 +the parse that invoked the test.
 +
 +@subsubsection Restrictions on semantic values and locations
 +GLR parsers require that you use POD (Plain Old Data) types for
 +semantic values and location types when using the generated parsers as
 +C++ code.
 +
 +@node Semantic Predicates
 +@subsection Controlling a Parse with Arbitrary Predicates
 +@findex %?
 +@cindex Semantic predicates in GLR parsers
 +
 +In addition to the @code{%dprec} and @code{%merge} directives,
 +GLR parsers
 +allow you to reject parses on the basis of arbitrary computations executed
 +in user code, without having Bison treat this rejection as an error
 +if there are alternative parses. (This feature is experimental and may
 +evolve.  We welcome user feedback.)  For example,
 +
 +@example
 +widget:
 +  %?@{  new_syntax @} "widget" id new_args  @{ $$ = f($3, $4); @}
 +| %?@{ !new_syntax @} "widget" id old_args  @{ $$ = f($3, $4); @}
 +;
 +@end example
 +
 +@noindent
 +is one way to allow the same parser to handle two different syntaxes for
 +widgets.  The clause preceded by @code{%?} is treated like an ordinary
 +action, except that its text is treated as an expression and is always
 +evaluated immediately (even when in nondeterministic mode).  If the
 +expression yields 0 (false), the clause is treated as a syntax error,
 +which, in a nondeterministic parser, causes the stack in which it is reduced
 +to die.  In a deterministic parser, it acts like YYERROR.
 +
 +As the example shows, predicates otherwise look like semantic actions, and
 +therefore you must be take them into account when determining the numbers
 +to use for denoting the semantic values of right-hand side symbols.
 +Predicate actions, however, have no defined value, and may not be given
 +labels.
 +
 +There is a subtle difference between semantic predicates and ordinary
 +actions in nondeterministic mode, since the latter are deferred.
 +For example, we could try to rewrite the previous example as
 +
 +@example
 +widget:
 +  @{ if (!new_syntax) YYERROR; @}
 +    "widget" id new_args  @{ $$ = f($3, $4); @}
 +|  @{ if (new_syntax) YYERROR; @}
 +    "widget" id old_args   @{ $$ = f($3, $4); @}
 +;
 +@end example
  
 -Also, see @ref{Location Default Action, ,Default Action for Locations}, which
 -describes a special usage of @code{YYLLOC_DEFAULT} in GLR parsers.
 +@noindent
 +(reversing the sense of the predicate tests to cause an error when they are
 +false).  However, this
 +does @emph{not} have the same effect if @code{new_args} and @code{old_args}
 +have overlapping syntax.
 +Since the mid-rule actions testing @code{new_syntax} are deferred,
 +a GLR parser first encounters the unresolved ambiguous reduction
 +for cases where @code{new_args} and @code{old_args} recognize the same string
 +@emph{before} performing the tests of @code{new_syntax}.  It therefore
 +reports an error.
 +
 +Finally, be careful in writing predicates: deferred actions have not been
 +evaluated, so that using them in a predicate will have undefined effects.
  
  @node Compiler Requirements
  @subsection Considerations when Compiling GLR Parsers
@@@ -1515,13 -1443,11 +1520,13 @@@ The source code for this calculator is 
  Here are the C and Bison declarations for the reverse polish notation
  calculator.  As in C, comments are placed between @samp{/*@dots{}*/}.
  
 +@comment file: rpcalc.y
  @example
  /* Reverse polish notation calculator.  */
  
  %@{
    #define YYSTYPE double
 +  #include <stdio.h>
    #include <math.h>
    int yylex (void);
    void yyerror (char const *);
@@@ -1566,7 -1492,6 +1571,7 @@@ type for numeric constants
  
  Here are the grammar rules for the reverse polish notation calculator.
  
 +@comment file: rpcalc.y
  @example
  @group
  input:
@@@ -1615,9 -1540,9 +1620,9 @@@ main job of most actions.  The semanti
  rule are referred to as @code{$1}, @code{$2}, and so on.
  
  @menu
 -* Rpcalc Input::
 -* Rpcalc Line::
 -* Rpcalc Expr::
 +* Rpcalc Input::            Explanation of the @code{input} nonterminal
 +* Rpcalc Line::             Explanation of the @code{line} nonterminal
 +* Rpcalc Expr::             Explanation of the @code{expr} nonterminal
  @end menu
  
  @node Rpcalc Input
@@@ -1781,7 -1706,6 +1786,7 @@@ A token type code of zero is returned i
  
  Here is the code for the lexical analyzer:
  
 +@comment file: rpcalc.y
  @example
  @group
  /* The lexical analyzer returns a double floating point
@@@ -1830,7 -1754,6 +1835,7 @@@ In keeping with the spirit of this exam
  kept to the bare minimum.  The only requirement is that it call
  @code{yyparse} to start the process of parsing.
  
 +@comment file: rpcalc.y
  @example
  @group
  int
@@@ -1851,7 -1774,6 +1856,7 @@@ always @code{"syntax error"}).  It is u
  @code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so
  here is the definition we will use:
  
 +@comment file: rpcalc.y
  @example
  @group
  #include <stdio.h>
@@@ -1936,15 -1858,15 +1941,15 @@@ example session using @code{rpcalc}
  @example
  $ @kbd{rpcalc}
  @kbd{4 9 +}
 -13
 +@result{} 13
  @kbd{3 7 + 3 4 5 *+-}
 --13
 +@result{} -13
  @kbd{3 7 + 3 4 5 * + - n}              @r{Note the unary minus, @samp{n}}
 -13
 +@result{} 13
  @kbd{5 6 / 4 n +}
 --3.166666667
 +@result{} -3.166666667
  @kbd{3 4 ^}                            @r{Exponentiation}
 -81
 +@result{} 81
  @kbd{^D}                               @r{End-of-file indicator}
  $
  @end example
@@@ -1978,8 -1900,8 +1983,8 @@@ parentheses nested to arbitrary depth
  %token NUM
  %left '-' '+'
  %left '*' '/'
 -%left NEG     /* negation--unary minus */
 -%right '^'    /* exponentiation */
 +%precedence NEG   /* negation--unary minus */
 +%right '^'        /* exponentiation */
  @end group
  
  %% /* The grammar follows.  */
@@@ -2022,16 -1944,15 +2027,16 @@@ In the second section (Bison declaratio
  types and says they are left-associative operators.  The declarations
  @code{%left} and @code{%right} (right associativity) take the place of
  @code{%token} which is used to declare a token type name without
 -associativity.  (These tokens are single-character literals, which
 +associativity/precedence.  (These tokens are single-character literals, which
  ordinarily don't need to be declared.  We declare them here to specify
 -the associativity.)
 +the associativity/precedence.)
  
  Operator precedence is determined by the line ordering of the
  declarations; the higher the line number of the declaration (lower on
  the page or screen), the higher the precedence.  Hence, exponentiation
  has the highest precedence, unary minus (@code{NEG}) is next, followed
 -by @samp{*} and @samp{/}, and so on.  @xref{Precedence, ,Operator
 +by @samp{*} and @samp{/}, and so on.  Unary minus is not associative,
 +only precedence matters (@code{%precedence}. @xref{Precedence, ,Operator
  Precedence}.
  
  The other important new feature is the @code{%prec} in the grammar
@@@ -2135,7 -2056,7 +2140,7 @@@ the same as the declarations for the in
  
  %left '-' '+'
  %left '*' '/'
 -%left NEG
 +%precedence NEG
  %right '^'
  
  %% /* The grammar follows.  */
@@@ -2336,23 -2257,19 +2341,23 @@@ to create named variables, store value
  Here is a sample session with the multi-function calculator:
  
  @example
 +@group
  $ @kbd{mfcalc}
  @kbd{pi = 3.141592653589}
 -3.1415926536
 +@result{} 3.1415926536
 +@end group
 +@group
  @kbd{sin(pi)}
 -0.0000000000
 +@result{} 0.0000000000
 +@end group
  @kbd{alpha = beta1 = 2.3}
 -2.3000000000
 +@result{} 2.3000000000
  @kbd{alpha}
 -2.3000000000
 +@result{} 2.3000000000
  @kbd{ln(alpha)}
 -0.8329091229
 +@result{} 0.8329091229
  @kbd{exp(ln(beta1))}
 -2.3000000000
 +@result{} 2.3000000000
  $
  @end example
  
@@@ -2362,8 -2279,6 +2367,8 @@@ Note that multiple assignment and neste
  * Mfcalc Declarations::    Bison declarations for multi-function calculator.
  * Mfcalc Rules::           Grammar rules for the calculator.
  * Mfcalc Symbol Table::    Symbol table management subroutines.
 +* Mfcalc Lexer::           The lexical analyzer.
 +* Mfcalc Main::            The controlling function.
  @end menu
  
  @node Mfcalc Declarations
@@@ -2375,9 -2290,8 +2380,9 @@@ Here are the C and Bison declarations f
  @example
  @group
  %@{
 -  #include <math.h>  /* For math functions, cos(), sin(), etc.  */
 -  #include "calc.h"  /* Contains definition of `symrec'.  */
 +  #include <stdio.h>  /* For printf, etc. */
 +  #include <math.h>   /* For pow, used in the grammar.  */
 +  #include "calc.h"   /* Contains definition of `symrec'.  */
    int yylex (void);
    void yyerror (char const *);
  %@}
  %right '='
  %left '-' '+'
  %left '*' '/'
 -%left NEG     /* negation--unary minus */
 -%right '^'    /* exponentiation */
 +%precedence NEG /* negation--unary minus */
 +%right '^'      /* exponentiation */
  @end group
  %% /* The grammar follows.  */
  @end example
@@@ -2513,11 -2427,22 +2518,11 @@@ symrec *getsym (char const *)
  @end group
  @end example
  
 -The new version of @code{main} includes a call to @code{init_table}, a
 -function that initializes the symbol table.  Here it is, and
 -@code{init_table} as well:
 +The new version of @code{main} will call @code{init_table} to initialize
 +the symbol table:
  
 +@comment file: mfcalc.y
  @example
 -#include <stdio.h>
 -
 -@group
 -/* Called by yyparse on error.  */
 -void
 -yyerror (char const *s)
 -@{
 -  printf ("%s\n", s);
 -@}
 -@end group
 -
  @group
  struct init
  @{
  @group
  struct init const arith_fncts[] =
  @{
 -  "sin",  sin,
 -  "cos",  cos,
 -  "atan", atan,
 -  "ln",   log,
 -  "exp",  exp,
 -  "sqrt", sqrt,
 -  0, 0
 +  @{ "atan", atan @},
 +  @{ "cos",  cos  @},
 +  @{ "exp",  exp  @},
 +  @{ "ln",   log  @},
 +  @{ "sin",  sin  @},
 +  @{ "sqrt", sqrt @},
 +  @{ 0, 0 @},
  @};
  @end group
  
@@@ -2546,7 -2471,6 +2551,7 @@@ symrec *sym_table
  
  @group
  /* Put arithmetic functions in table.  */
 +static
  void
  init_table (void)
  @{
      @}
  @}
  @end group
 -
 -@group
 -int
 -main (void)
 -@{
 -  init_table ();
 -  return yyparse ();
 -@}
 -@end group
  @end example
  
  By simply editing the initialization list and adding the necessary include
@@@ -2597,16 -2530,13 +2602,16 @@@ getsym (char const *sym_name
    symrec *ptr;
    for (ptr = sym_table; ptr != (symrec *) 0;
         ptr = (symrec *)ptr->next)
 -    if (strcmp (ptr->name,sym_name) == 0)
 +    if (strcmp (ptr->name, sym_name) == 0)
        return ptr;
    return 0;
  @}
  @end group
  @end example
  
 +@node Mfcalc Lexer
 +@subsection The @code{mfcalc} Lexer
 +
  The function @code{yylex} must now recognize variables, numeric values, and
  the single-character arithmetic operators.  Strings of alphanumeric
  characters with a leading letter are recognized as either variables or
@@@ -2663,6 -2593,7 +2668,6 @@@ yylex (void
        symrec *s;
        int i;
  @end group
 -
        if (!symbuf)
          symbuf = (char *) malloc (length + 1);
  
  @end group
  @end example
  
 +@node Mfcalc Main
 +@subsection The @code{mfcalc} Main
 +
 +The error reporting function is unchanged, and the new version of
 +@code{main} includes a call to @code{init_table}:
 +
 +@comment file: mfcalc.y
 +@example
 +@group
 +/* Called by yyparse on error.  */
 +void
 +yyerror (char const *s)
 +@{
 +  fprintf (stderr, "%s\n", s);
 +@}
 +@end group
 +
 +@group
 +int
 +main (int argc, char const* argv[])
 +@{
 +  init_table ();
 +  return yyparse ();
 +@}
 +@end group
 +@end example
 +
  This program is both powerful and flexible.  You may easily add new
  functions, and it is a simple job to modify this code to install
  predefined variables such as @code{pi} or @code{e} as well.
@@@ -4356,8 -4260,7 +4361,8 @@@ Bison will convert this into a @code{#d
  the parser, so that the function @code{yylex} (if it is in this file)
  can use the name @var{name} to stand for this token type's code.
  
 -Alternatively, you can use @code{%left}, @code{%right}, or
 +Alternatively, you can use @code{%left}, @code{%right},
 +@code{%precedence}, or
  @code{%nonassoc} instead of @code{%token}, if you wish to specify
  associativity and precedence.  @xref{Precedence Decl, ,Operator
  Precedence}.
@@@ -4433,8 -4336,7 +4438,8 @@@ of ``$end''
  @cindex declaring operator precedence
  @cindex operator precedence, declaring
  
 -Use the @code{%left}, @code{%right} or @code{%nonassoc} declaration to
 +Use the @code{%left}, @code{%right}, @code{%nonassoc}, or
 +@code{%precedence} declaration to
  declare a token and specify its precedence and associativity, all at
  once.  These are called @dfn{precedence declarations}.
  @xref{Precedence, ,Operator Precedence}, for general information on
@@@ -4470,10 -4372,6 +4475,10 @@@ left-associativity (grouping @var{x} wi
  means that @samp{@var{x} @var{op} @var{y} @var{op} @var{z}} is
  considered a syntax error.
  
 +@code{%precedence} gives only precedence to the @var{symbols}, and
 +defines no associativity at all.  Use this to define precedence only,
 +and leave any potential conflict due to associativity enabled.
 +
  @item
  The precedence of an operator determines how it nests with other operators.
  All the tokens declared in a single precedence declaration have equal
@@@ -4871,7 -4769,7 +4876,7 @@@ statically allocated variables for comm
  including @code{yylval} and @code{yylloc}.)
  
  Alternatively, you can generate a pure, reentrant parser.  The Bison
 -declaration @code{%define api.pure} says that you want the parser to be
 +declaration @samp{%define api.pure} says that you want the parser to be
  reentrant.  It looks like this:
  
  @example
@@@ -4975,14 -4873,14 +4980,14 @@@ for use by the next invocation of the @
  
  Bison also supports both the push parser interface along with the pull parser
  interface in the same generated parser.  In order to get this functionality,
 -you should replace the @code{%define api.push-pull push} declaration with the
 -@code{%define api.push-pull both} declaration.  Doing this will create all of
 +you should replace the @samp{%define api.push-pull push} declaration with the
 +@samp{%define api.push-pull both} declaration.  Doing this will create all of
  the symbols mentioned earlier along with the two extra symbols, @code{yyparse}
  and @code{yypull_parse}.  @code{yyparse} can be used exactly as it normally
  would be used.  However, the user should note that it is implemented in the
  generated parser by calling @code{yypull_parse}.
  This makes the @code{yyparse} function that is generated with the
 -@code{%define api.push-pull both} declaration slower than the normal
 +@samp{%define api.push-pull both} declaration slower than the normal
  @code{yyparse} function.  If the user
  calls the @code{yypull_parse} function it will parse the rest of the input
  stream.  It is possible to @code{yypush_parse} tokens to select a subgrammar
@@@ -4998,9 -4896,9 +5003,9 @@@ yypull_parse (ps); /* Will call the lex
  yypstate_delete (ps);
  @end example
  
 -Adding the @code{%define api.pure} declaration does exactly the same thing to
 -the generated parser with @code{%define api.push-pull both} as it did for
 -@code{%define api.push-pull push}.
 +Adding the @samp{%define api.pure} declaration does exactly the same thing to
 +the generated parser with @samp{%define api.push-pull both} as it did for
 +@samp{%define api.push-pull push}.
  
  @node Decl Summary
  @subsection Bison Declaration Summary
@@@ -5073,9 -4971,9 +5078,9 @@@ default location or at the location spe
  @end deffn
  
  @deffn {Directive} %debug
 -In the parser implementation file, define the macro @code{YYDEBUG} to
 -1 if it is not already defined, so that the debugging facilities are
 -compiled.  @xref{Tracing, ,Tracing Your Parser}.
 +Instrument the output parser for traces.  Obsoleted by @samp{%define
 +parse.trace}.
 +@xref{Tracing, ,Tracing Your Parser}.
  @end deffn
  
  @deffn {Directive} %define @var{variable}
@@@ -5164,7 -5062,7 +5169,7 @@@ is @code{yyparse}, @code{yylex}, @code{
  @code{yypstate_new} and @code{yypstate_delete} will
  also be renamed.  For example, if you use @samp{%name-prefix "c_"}, the
  names become @code{c_parse}, @code{c_lex}, and so on.
 -For C++ parsers, see the @code{%define namespace} documentation in this
 +For C++ parsers, see the @samp{%define api.namespace} documentation in this
  section.
  @xref{Multiple Parsers, ,Multiple Parsers in the Same Program}.
  @end deffn
@@@ -5192,7 -5090,7 +5197,7 @@@ Specify @var{file} for the parser imple
  @end deffn
  
  @deffn {Directive} %pure-parser
 -Deprecated version of @code{%define api.pure} (@pxref{%define
 +Deprecated version of @samp{%define api.pure} (@pxref{%define
  Summary,,api.pure}), for which Bison is more careful to warn about
  unreasonable usage.
  @end deffn
@@@ -5315,61 -5213,7 +5320,61 @@@ Summary,,%skeleton})
  Unaccepted @var{variable}s produce an error.
  Some of the accepted @var{variable}s are:
  
 -@itemize @bullet
 +@table @code
 +@c ================================================== api.namespace
 +@item api.namespace
 +@findex %define api.namespace
 +@itemize
 +@item Languages(s): C++
 +
 +@item Purpose: Specify the namespace for the parser class.
 +For example, if you specify:
 +
 +@example
 +%define api.namespace "foo::bar"
 +@end example
 +
 +Bison uses @code{foo::bar} verbatim in references such as:
 +
 +@example
 +foo::bar::parser::semantic_type
 +@end example
 +
 +However, to open a namespace, Bison removes any leading @code{::} and then
 +splits on any remaining occurrences:
 +
 +@example
 +namespace foo @{ namespace bar @{
 +  class position;
 +  class location;
 +@} @}
 +@end example
 +
 +@item Accepted Values:
 +Any absolute or relative C++ namespace reference without a trailing
 +@code{"::"}.  For example, @code{"foo"} or @code{"::foo::bar"}.
 +
 +@item Default Value:
 +The value specified by @code{%name-prefix}, which defaults to @code{yy}.
 +This usage of @code{%name-prefix} is for backward compatibility and can
 +be confusing since @code{%name-prefix} also specifies the textual prefix
 +for the lexical analyzer function.  Thus, if you specify
 +@code{%name-prefix}, it is best to also specify @samp{%define
 +api.namespace} so that @code{%name-prefix} @emph{only} affects the
 +lexical analyzer function.  For example, if you specify:
 +
 +@example
 +%define api.namespace "foo"
 +%name-prefix "bar::"
 +@end example
 +
 +The parser namespace is @code{foo} and @code{yylex} is referenced as
 +@code{bar::lex}.
 +@end itemize
 +@c namespace
 +
 +
 +
  @c ================================================== api.pure
  @item api.pure
  @findex %define api.pure
  
  @item Default Value: @code{false}
  @end itemize
 +@c api.pure
  
 +
 +
 +@c ================================================== api.push-pull
  @item api.push-pull
  @findex %define api.push-pull
  
@@@ -5404,69 -5244,6 +5409,69 @@@ More user feedback will help to stabili
  
  @item Default Value: @code{pull}
  @end itemize
 +@c api.push-pull
 +
 +
 +
 +@c ================================================== api.tokens.prefix
 +@item api.tokens.prefix
 +@findex %define api.tokens.prefix
 +
 +@itemize
 +@item Languages(s): all
 +
 +@item Purpose:
 +Add a prefix to the token names when generating their definition in the
 +target language.  For instance
 +
 +@example
 +%token FILE for ERROR
 +%define api.tokens.prefix "TOK_"
 +%%
 +start: FILE for ERROR;
 +@end example
 +
 +@noindent
 +generates the definition of the symbols @code{TOK_FILE}, @code{TOK_for},
 +and @code{TOK_ERROR} in the generated source files.  In particular, the
 +scanner must use these prefixed token names, while the grammar itself
 +may still use the short names (as in the sample rule given above).  The
 +generated informational files (@file{*.output}, @file{*.xml},
 +@file{*.dot}) are not modified by this prefix.  See @ref{Calc++ Parser}
 +and @ref{Calc++ Scanner}, for a complete example.
 +
 +@item Accepted Values:
 +Any string.  Should be a valid identifier prefix in the target language,
 +in other words, it should typically be an identifier itself (sequence of
 +letters, underscores, and ---not at the beginning--- digits).
 +
 +@item Default Value:
 +empty
 +@end itemize
 +@c api.tokens.prefix
 +
 +
 +@c ================================================== lex_symbol
 +@item lex_symbol
 +@findex %define lex_symbol
 +
 +@itemize @bullet
 +@item Language(s):
 +C++
 +
 +@item Purpose:
 +When variant-based semantic values are enabled (@pxref{C++ Variants}),
 +request that symbols be handled as a whole (type, value, and possibly
 +location) in the scanner.  @xref{Complete Symbols}, for details.
 +
 +@item Accepted Values:
 +Boolean.
 +
 +@item Default Value:
 +@code{false}
 +@end itemize
 +@c lex_symbol
 +
  
  @c ================================================== lr.default-reductions
  
@@@ -5501,7 -5278,6 +5506,7 @@@ remain in the parser tables.  @xref{Unr
  @item Accepted Values: Boolean
  @item Default Value: @code{false}
  @end itemize
 +@c lr.keep-unreachable-states
  
  @c ================================================== lr.type
  
@@@ -5520,59 -5296,57 +5525,59 @@@ More user feedback will help to stabili
  @item Default Value: @code{lalr}
  @end itemize
  
 +
 +@c ================================================== namespace
  @item namespace
  @findex %define namespace
 +Obsoleted by @code{api.namespace}
 +@c namespace
  
 -@itemize
 -@item Languages(s): C++
  
 -@item Purpose: Specify the namespace for the parser class.
 -For example, if you specify:
 +@c ================================================== parse.assert
 +@item parse.assert
 +@findex %define parse.assert
  
 -@smallexample
 -%define namespace "foo::bar"
 -@end smallexample
 +@itemize
 +@item Languages(s): C++
  
 -Bison uses @code{foo::bar} verbatim in references such as:
 +@item Purpose: Issue runtime assertions to catch invalid uses.
 +In C++, when variants are used (@pxref{C++ Variants}), symbols must be
 +constructed and
 +destroyed properly.  This option checks these constraints.
  
 -@smallexample
 -foo::bar::parser::semantic_type
 -@end smallexample
 +@item Accepted Values: Boolean
  
 -However, to open a namespace, Bison removes any leading @code{::} and then
 -splits on any remaining occurrences:
 +@item Default Value: @code{false}
 +@end itemize
 +@c parse.assert
  
 -@smallexample
 -namespace foo @{ namespace bar @{
 -  class position;
 -  class location;
 -@} @}
 -@end smallexample
 -
 -@item Accepted Values: Any absolute or relative C++ namespace reference without
 -a trailing @code{"::"}.
 -For example, @code{"foo"} or @code{"::foo::bar"}.
 -
 -@item Default Value: The value specified by @code{%name-prefix}, which defaults
 -to @code{yy}.
 -This usage of @code{%name-prefix} is for backward compatibility and can be
 -confusing since @code{%name-prefix} also specifies the textual prefix for the
 -lexical analyzer function.
 -Thus, if you specify @code{%name-prefix}, it is best to also specify
 -@code{%define namespace} so that @code{%name-prefix} @emph{only} affects the
 -lexical analyzer function.
 -For example, if you specify:
  
 -@smallexample
 -%define namespace "foo"
 -%name-prefix "bar::"
 -@end smallexample
 +@c ================================================== parse.error
 +@item parse.error
 +@findex %define parse.error
 +@itemize
 +@item Languages(s):
 +all
 +@item Purpose:
 +Control the kind of error messages passed to the error reporting
 +function.  @xref{Error Reporting, ,The Error Reporting Function
 +@code{yyerror}}.
 +@item Accepted Values:
 +@itemize
 +@item @code{simple}
 +Error messages passed to @code{yyerror} are simply @w{@code{"syntax
 +error"}}.
 +@item @code{verbose}
 +Error messages report the unexpected token, and possibly the expected ones.
 +However, this report can often be incorrect when LAC is not enabled
 +(@pxref{LAC}).
 +@end itemize
  
 -The parser namespace is @code{foo} and @code{yylex} is referenced as
 -@code{bar::lex}.
 +@item Default Value:
 +@code{simple}
  @end itemize
 +@c parse.error
 +
  
  @c ================================================== parse.lac
  @item parse.lac
@@@ -5586,46 -5360,7 +5591,46 @@@ syntax error handling.  @xref{LAC}
  @item Accepted Values: @code{none}, @code{full}
  @item Default Value: @code{none}
  @end itemize
 +@c parse.lac
 +
 +@c ================================================== parse.trace
 +@item parse.trace
 +@findex %define parse.trace
 +
 +@itemize
 +@item Languages(s): C, C++
 +
 +@item Purpose: Require parser instrumentation for tracing.
 +In C/C++, define the macro @code{YYDEBUG} to 1 in the parser implementation
 +file if it is not already defined, so that the debugging facilities are
 +compiled.  @xref{Tracing, ,Tracing Your Parser}.
 +
 +@item Accepted Values: Boolean
 +
 +@item Default Value: @code{false}
 +@end itemize
 +@c parse.trace
 +
 +@c ================================================== variant
 +@item variant
 +@findex %define variant
 +
 +@itemize @bullet
 +@item Language(s):
 +C++
 +
 +@item Purpose:
 +Request variant-based semantic values.
 +@xref{C++ Variants}.
 +
 +@item Accepted Values:
 +Boolean.
 +
 +@item Default Value:
 +@code{false}
  @end itemize
 +@c variant
 +@end table
  
  
  @node %code Summary
@@@ -5671,7 -5406,7 +5676,7 @@@ file
  Not all qualifiers are accepted for all target languages.  Unaccepted
  qualifiers produce an error.  Some of the accepted qualifiers are:
  
 -@itemize @bullet
 +@table @code
  @item requires
  @findex %code requires
  
@@@ -5735,7 -5470,7 +5740,7 @@@ parser implementation file.  For exampl
  @item Location(s): The parser Java file after any Java package directive and
  before any class definitions.
  @end itemize
 -@end itemize
 +@end table
  
  Though we say the insertion locations are language-dependent, they are
  technically skeleton-dependent.  Writers of non-standard skeletons
@@@ -5843,10 -5578,10 +5848,10 @@@ If you use a reentrant parser, you can 
  parameter information to it in a reentrant way.  To do so, use the
  declaration @code{%parse-param}:
  
 -@deffn {Directive} %parse-param @{@var{argument-declaration}@}
 +@deffn {Directive} %parse-param @{@var{argument-declaration}@} @dots{}
  @findex %parse-param
 -Declare that an argument declared by the braced-code
 -@var{argument-declaration} is an additional @code{yyparse} argument.
 +Declare that one or more
 +@var{argument-declaration} are additional @code{yyparse} arguments.
  The @var{argument-declaration} is used when declaring
  functions or prototypes.  The last identifier in
  @var{argument-declaration} must be the argument name.
  Here's an example.  Write this in the parser:
  
  @example
 -%parse-param @{int *nastiness@}
 -%parse-param @{int *randomness@}
 +%parse-param @{int *nastiness@} @{int *randomness@}
  @end example
  
  @noindent
@@@ -5885,8 -5621,8 +5890,8 @@@ exp: @dots{}    @{ @dots{}; *randomnes
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypush_parse} to parse a single token.  This
 -function is available if either the @code{%define api.push-pull push} or
 -@code{%define api.push-pull both} declaration is used.
 +function is available if either the @samp{%define api.push-pull push} or
 +@samp{%define api.push-pull both} declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
  @deftypefun int yypush_parse (yypstate *yyps)
@@@ -5903,7 -5639,7 +5908,7 @@@ is required to finish parsing the gramm
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypull_parse} to parse the rest of the input
 -stream.  This function is available if the @code{%define api.push-pull both}
 +stream.  This function is available if the @samp{%define api.push-pull both}
  declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
@@@ -5919,8 -5655,8 +5924,8 @@@ The value returned by @code{yypull_pars
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypstate_new} to create a new parser instance.
 -This function is available if either the @code{%define api.push-pull push} or
 -@code{%define api.push-pull both} declaration is used.
 +This function is available if either the @samp{%define api.push-pull push} or
 +@samp{%define api.push-pull both} declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
  @deftypefun yypstate *yypstate_new (void)
@@@ -5938,8 -5674,8 +5943,8 @@@ allocated
  More user feedback will help to stabilize it.)
  
  You call the function @code{yypstate_delete} to delete a parser instance.
 -function is available if either the @code{%define api.push-pull push} or
 -@code{%define api.push-pull both} declaration is used.
 +function is available if either the @samp{%define api.push-pull push} or
 +@samp{%define api.push-pull both} declaration is used.
  @xref{Push Decl, ,A Push Parser}.
  
  @deftypefun void yypstate_delete (yypstate *yyps)
@@@ -6128,7 -5864,7 +6133,7 @@@ The data type of @code{yylloc} has the 
  @node Pure Calling
  @subsection Calling Conventions for Pure Parsers
  
 -When you use the Bison declaration @code{%define api.pure} to request a
 +When you use the Bison declaration @samp{%define api.pure} to request a
  pure, reentrant parser, the global communication variables @code{yylval}
  and @code{yylloc} cannot be used.  (@xref{Pure Decl, ,A Pure (Reentrant)
  Parser}.)  In such parsers the two global variables are replaced by
@@@ -6152,57 -5888,46 +6157,57 @@@ textual locations, then the type @code{
  this case, omit the second argument; @code{yylex} will be called with
  only one argument.
  
 -
 -If you wish to pass the additional parameter data to @code{yylex}, use
 +If you wish to pass additional arguments to @code{yylex}, use
  @code{%lex-param} just like @code{%parse-param} (@pxref{Parser
 -Function}).
 +Function}).  To pass additional arguments to both @code{yylex} and
 +@code{yyparse}, use @code{%param}.
  
 -@deffn {Directive} lex-param @{@var{argument-declaration}@}
 +@deffn {Directive} %lex-param @{@var{argument-declaration}@} @dots{}
  @findex %lex-param
 -Declare that the braced-code @var{argument-declaration} is an
 -additional @code{yylex} argument declaration.
 +Specify that @var{argument-declaration} are additional @code{yylex} argument
 +declarations.  You may pass one or more such declarations, which is
 +equivalent to repeating @code{%lex-param}.
 +@end deffn
 +
 +@deffn {Directive} %param @{@var{argument-declaration}@} @dots{}
 +@findex %param
 +Specify that @var{argument-declaration} are additional
 +@code{yylex}/@code{yyparse} argument declaration.  This is equivalent to
 +@samp{%lex-param @{@var{argument-declaration}@} @dots{} %parse-param
 +@{@var{argument-declaration}@} @dots{}}.  You may pass one or more
 +declarations, which is equivalent to repeating @code{%param}.
  @end deffn
  
  For instance:
  
  @example
 -%parse-param @{int *nastiness@}
 -%lex-param   @{int *nastiness@}
 -%parse-param @{int *randomness@}
 +%lex-param   @{scanner_mode *mode@}
 +%parse-param @{parser_mode *mode@}
 +%param       @{environment_type *env@}
  @end example
  
  @noindent
  results in the following signature:
  
  @example
 -int yylex   (int *nastiness);
 -int yyparse (int *nastiness, int *randomness);
 +int yylex   (scanner_mode *mode, environment_type *env);
 +int yyparse (parser_mode *mode, environment_type *env);
  @end example
  
 -If @code{%define api.pure} is added:
 +If @samp{%define api.pure} is added:
  
  @example
 -int yylex   (YYSTYPE *lvalp, int *nastiness);
 -int yyparse (int *nastiness, int *randomness);
 +int yylex   (YYSTYPE *lvalp, scanner_mode *mode, environment_type *env);
 +int yyparse (parser_mode *mode, environment_type *env);
  @end example
  
  @noindent
 -and finally, if both @code{%define api.pure} and @code{%locations} are used:
 +and finally, if both @samp{%define api.pure} and @code{%locations} are used:
  
  @example
 -int yylex   (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness);
 -int yyparse (int *nastiness, int *randomness);
 +int yylex   (YYSTYPE *lvalp, YYLTYPE *llocp,
 +             scanner_mode *mode, environment_type *env);
 +int yyparse (parser_mode *mode, environment_type *env);
  @end example
  
  @node Error Reporting
  @cindex parse error
  @cindex syntax error
  
 -The Bison parser detects a @dfn{syntax error} or @dfn{parse error}
 +The Bison parser detects a @dfn{syntax error} (or @dfn{parse error})
  whenever it reads a token which cannot satisfy any syntax rule.  An
  action in the grammar can also explicitly proclaim an error, using the
  macro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use
@@@ -6224,8 -5949,8 +6229,8 @@@ called by @code{yyparse} whenever a syn
  receives one argument.  For a syntax error, the string is normally
  @w{@code{"syntax error"}}.
  
 -@findex %error-verbose
 -If you invoke the directive @code{%error-verbose} in the Bison declarations
 +@findex %define parse.error
 +If you invoke @samp{%define parse.error verbose} in the Bison declarations
  section (@pxref{Bison Declarations, ,The Bison Declarations Section}), then
  Bison provides a more verbose and specific error message string instead of
  just plain @w{@code{"syntax error"}}.  However, that message sometimes
@@@ -6283,7 -6008,7 +6288,7 @@@ void yyerror (int *nastiness, char cons
  Finally, GLR and Yacc parsers share the same @code{yyerror} calling
  convention for absolutely pure parsers, i.e., when the calling
  convention of @code{yylex} @emph{and} the calling convention of
 -@code{%define api.pure} are pure.
 +@samp{%define api.pure} are pure.
  I.e.:
  
  @example
@@@ -6808,8 -6533,7 +6813,8 @@@ shift and when to reduce
  
  @menu
  * Why Precedence::    An example showing why precedence is needed.
 -* Using Precedence::  How to specify precedence in Bison grammars.
 +* Using Precedence::  How to specify precedence and associativity.
 +* Precedence Only::   How to specify precedence only.
  * Precedence Examples::  How these features are used in the previous example.
  * How Precedence::    How they work.
  @end menu
@@@ -6865,9 -6589,8 +6870,9 @@@ makes right-associativity
  @node Using Precedence
  @subsection Specifying Operator Precedence
  @findex %left
 -@findex %right
  @findex %nonassoc
 +@findex %precedence
 +@findex %right
  
  Bison allows you to specify these choices with the operator precedence
  declarations @code{%left} and @code{%right}.  Each such declaration
@@@ -6877,63 -6600,13 +6882,63 @@@ those operators left-associative and th
  them right-associative.  A third alternative is @code{%nonassoc}, which
  declares that it is a syntax error to find the same operator twice ``in a
  row''.
 +The last alternative, @code{%precedence}, allows to define only
 +precedence and no associativity at all.  As a result, any
 +associativity-related conflict that remains will be reported as an
 +compile-time error.  The directive @code{%nonassoc} creates run-time
 +error: using the operator in a associative way is a syntax error.  The
 +directive @code{%precedence} creates compile-time errors: an operator
 +@emph{can} be involved in an associativity-related conflict, contrary to
 +what expected the grammar author.
  
  The relative precedence of different operators is controlled by the
 -order in which they are declared.  The first @code{%left} or
 -@code{%right} declaration in the file declares the operators whose
 +order in which they are declared.  The first precedence/associativity
 +declaration in the file declares the operators whose
  precedence is lowest, the next such declaration declares the operators
  whose precedence is a little higher, and so on.
  
 +@node Precedence Only
 +@subsection Specifying Precedence Only
 +@findex %precedence
 +
 +Since POSIX Yacc defines only @code{%left}, @code{%right}, and
 +@code{%nonassoc}, which all defines precedence and associativity, little
 +attention is paid to the fact that precedence cannot be defined without
 +defining associativity.  Yet, sometimes, when trying to solve a
 +conflict, precedence suffices.  In such a case, using @code{%left},
 +@code{%right}, or @code{%nonassoc} might hide future (associativity
 +related) conflicts that would remain hidden.
 +
 +The dangling @code{else} ambiguity (@pxref{Shift/Reduce, , Shift/Reduce
 +Conflicts}) can be solved explicitly.  This shift/reduce conflicts occurs
 +in the following situation, where the period denotes the current parsing
 +state:
 +
 +@example
 +if @var{e1} then if  @var{e2} then @var{s1} . else @var{s2}
 +@end example
 +
 +The conflict involves the reduction of the rule @samp{IF expr THEN
 +stmt}, which precedence is by default that of its last token
 +(@code{THEN}), and the shifting of the token @code{ELSE}.  The usual
 +disambiguation (attach the @code{else} to the closest @code{if}),
 +shifting must be preferred, i.e., the precedence of @code{ELSE} must be
 +higher than that of @code{THEN}.  But neither is expected to be involved
 +in an associativity related conflict, which can be specified as follows.
 +
 +@example
 +%precedence THEN
 +%precedence ELSE
 +@end example
 +
 +The unary-minus is another typical example where associativity is
 +usually over-specified, see @ref{Infix Calc, , Infix Notation
 +Calculator: @code{calc}}.  The @code{%left} directive is traditionally
 +used to declare the precedence of @code{NEG}, which is more than needed
 +since it also defines its associativity.  While this is harmless in the
 +traditional example, who knows how @code{NEG} might be used in future
 +evolutions of the grammar@dots{}
 +
  @node Precedence Examples
  @subsection Precedence Examples
  
@@@ -6995,8 -6668,8 +7000,8 @@@ outlandish at first, but it is really v
  sign typically has a very high precedence as a unary operator, and a
  somewhat lower precedence (lower than multiplication) as a binary operator.
  
 -The Bison precedence declarations, @code{%left}, @code{%right} and
 -@code{%nonassoc}, can only be used once for a given token; so a token has
 +The Bison precedence declarations
 +can only be used once for a given token; so a token has
  only one precedence declared in this way.  For context-dependent
  precedence, you need to use an additional mechanism: the @code{%prec}
  modifier for rules.
@@@ -7341,9 -7014,9 +7346,9 @@@ The default behavior of Bison's LR-base
  historical reasons, but that behavior is often not robust.  For example, in
  the previous section, we discussed the mysterious conflicts that can be
  produced by LALR(1), Bison's default parser table construction algorithm.
 -Another example is Bison's @code{%error-verbose} directive, which instructs
 -the generated parser to produce verbose syntax error messages, which can
 -sometimes contain incorrect information.
 +Another example is Bison's @code{%define parse.error verbose} directive,
 +which instructs the generated parser to produce verbose syntax error
 +messages, which can sometimes contain incorrect information.
  
  In this section, we explore several modern features of Bison that allow you
  to tune fundamental aspects of the generated LR-based parsers.  Some of
@@@ -7867,14 -7540,12 +7872,14 @@@ that allows variable-length arrays.  Th
  
  Do not allow @code{YYINITDEPTH} to be greater than @code{YYMAXDEPTH}.
  
 -@c FIXME: C++ output.
 -Because of semantic differences between C and C++, the deterministic
 -parsers in C produced by Bison cannot grow when compiled
 -by C++ compilers.  In this precise case (compiling a C parser as C++) you are
 -suggested to grow @code{YYINITDEPTH}.  The Bison maintainers hope to fix
 -this deficiency in a future release.
 +You can generate a deterministic parser containing C++ user code from
 +the default (C) skeleton, as well as from the C++ skeleton
 +(@pxref{C++ Parsers}).  However, if you do use the default skeleton
 +and want to allow the parsing stack to grow,
 +be careful not to use semantic types or location types that require
 +non-trivial copy constructors.
 +The C skeleton bypasses these constructors when copying data to
 +new, larger stacks.
  
  @node Error Recovery
  @chapter Error Recovery
@@@ -8666,20 -8337,15 +8671,20 @@@ Use the @samp{-t} option when you run B
  
  @item the directive @samp{%debug}
  @findex %debug
 -Add the @code{%debug} directive (@pxref{Decl Summary, ,Bison
 -Declaration Summary}).  This is a Bison extension, which will prove
 -useful when Bison will output parsers for languages that don't use a
 -preprocessor.  Unless POSIX and Yacc portability matter to
 -you, this is
 -the preferred solution.
 +Add the @code{%debug} directive (@pxref{Decl Summary, ,Bison Declaration
 +Summary}).  This Bison extension is maintained for backward
 +compatibility with previous versions of Bison.
 +
 +@item the variable @samp{parse.trace}
 +@findex %define parse.trace
 +Add the @samp{%define parse.trace} directive (@pxref{%define
 +Summary,,parse.trace}), or pass the @option{-Dparse.trace} option
 +(@pxref{Bison Options}).  This is a Bison extension, which is especially
 +useful for languages that don't use a preprocessor.  Unless POSIX and Yacc
 +portability matter to you, this is the preferred solution.
  @end table
  
 -We suggest that you always enable the debug option so that debugging is
 +We suggest that you always enable the trace option so that debugging is
  always possible.
  
  The trace facility outputs messages with macro calls of the form
@@@ -9151,16 -8817,16 +9156,16 @@@ The C++ deterministic parser is selecte
  
  When run, @command{bison} will create several entities in the @samp{yy}
  namespace.
 -@findex %define namespace
 -Use the @samp{%define namespace} directive to change the namespace
 -name, see @ref{%define Summary,,namespace}.  The various classes are
 -generated in the following files:
 +@findex %define api.namespace
 +Use the @samp{%define api.namespace} directive to change the namespace name,
 +see @ref{%define Summary,,api.namespace}.  The various classes are generated
 +in the following files:
  
  @table @file
  @item position.hh
  @itemx location.hh
  The definition of the classes @code{position} and @code{location},
 -used for location tracking.  @xref{C++ Location Values}.
 +used for location tracking when enabled.  @xref{C++ Location Values}.
  
  @item stack.hh
  An auxiliary class @code{stack} used by the parser.
@@@ -9186,22 -8852,11 +9191,22 @@@ for a complete and accurate documentati
  @c - YYSTYPE
  @c - Printer and destructor
  
 +Bison supports two different means to handle semantic values in C++.  One is
 +alike the C interface, and relies on unions (@pxref{C++ Unions}).  As C++
 +practitioners know, unions are inconvenient in C++, therefore another
 +approach is provided, based on variants (@pxref{C++ Variants}).
 +
 +@menu
 +* C++ Unions::             Semantic values cannot be objects
 +* C++ Variants::           Using objects as semantic values
 +@end menu
 +
 +@node C++ Unions
 +@subsubsection C++ Unions
 +
  The @code{%union} directive works as for C, see @ref{Union Decl, ,The
  Collection of Value Types}.  In particular it produces a genuine
 -@code{union}@footnote{In the future techniques to allow complex types
 -within pseudo-unions (similar to Boost variants) might be implemented to
 -alleviate these issues.}, which have a few specific features in C++.
 +@code{union}, which have a few specific features in C++.
  @itemize @minus
  @item
  The type @code{YYSTYPE} is defined but its use is discouraged: rather
@@@ -9218,98 -8873,6 +9223,98 @@@ reclaimed automatically: using the @cod
  only means to avoid leaks.  @xref{Destructor Decl, , Freeing Discarded
  Symbols}.
  
 +@node C++ Variants
 +@subsubsection C++ Variants
 +
 +Starting with version 2.6, Bison provides a @emph{variant} based
 +implementation of semantic values for C++.  This alleviates all the
 +limitations reported in the previous section, and in particular, object
 +types can be used without pointers.
 +
 +To enable variant-based semantic values, set @code{%define} variable
 +@code{variant} (@pxref{%define Summary,, variant}).  Once this defined,
 +@code{%union} is ignored, and instead of using the name of the fields of the
 +@code{%union} to ``type'' the symbols, use genuine types.
 +
 +For instance, instead of
 +
 +@example
 +%union
 +@{
 +  int ival;
 +  std::string* sval;
 +@}
 +%token <ival> NUMBER;
 +%token <sval> STRING;
 +@end example
 +
 +@noindent
 +write
 +
 +@example
 +%token <int> NUMBER;
 +%token <std::string> STRING;
 +@end example
 +
 +@code{STRING} is no longer a pointer, which should fairly simplify the user
 +actions in the grammar and in the scanner (in particular the memory
 +management).
 +
 +Since C++ features destructors, and since it is customary to specialize
 +@code{operator<<} to support uniform printing of values, variants also
 +typically simplify Bison printers and destructors.
 +
 +Variants are stricter than unions.  When based on unions, you may play any
 +dirty game with @code{yylval}, say storing an @code{int}, reading a
 +@code{char*}, and then storing a @code{double} in it.  This is no longer
 +possible with variants: they must be initialized, then assigned to, and
 +eventually, destroyed.
 +
 +@deftypemethod {semantic_type} {T&} build<T> ()
 +Initialize, but leave empty.  Returns the address where the actual value may
 +be stored.  Requires that the variant was not initialized yet.
 +@end deftypemethod
 +
 +@deftypemethod {semantic_type} {T&} build<T> (const T& @var{t})
 +Initialize, and copy-construct from @var{t}.
 +@end deftypemethod
 +
 +
 +@strong{Warning}: We do not use Boost.Variant, for two reasons.  First, it
 +appeared unacceptable to require Boost on the user's machine (i.e., the
 +machine on which the generated parser will be compiled, not the machine on
 +which @command{bison} was run).  Second, for each possible semantic value,
 +Boost.Variant not only stores the value, but also a tag specifying its
 +type.  But the parser already ``knows'' the type of the semantic value, so
 +that would be duplicating the information.
 +
 +Therefore we developed light-weight variants whose type tag is external (so
 +they are really like @code{unions} for C++ actually).  But our code is much
 +less mature that Boost.Variant.  So there is a number of limitations in
 +(the current implementation of) variants:
 +@itemize
 +@item
 +Alignment must be enforced: values should be aligned in memory according to
 +the most demanding type.  Computing the smallest alignment possible requires
 +meta-programming techniques that are not currently implemented in Bison, and
 +therefore, since, as far as we know, @code{double} is the most demanding
 +type on all platforms, alignments are enforced for @code{double} whatever
 +types are actually used.  This may waste space in some cases.
 +
 +@item
 +Our implementation is not conforming with strict aliasing rules.  Alias
 +analysis is a technique used in optimizing compilers to detect when two
 +pointers are disjoint (they cannot ``meet'').  Our implementation breaks
 +some of the rules that G++ 4.4 uses in its alias analysis, so @emph{strict
 +alias analysis must be disabled}.  Use the option
 +@option{-fno-strict-aliasing} to compile the generated parser.
 +
 +@item
 +There might be portability issues we are not aware of.
 +@end itemize
 +
 +As far as we know, these limitations @emph{can} be alleviated.  All it takes
 +is some time and/or some talented C++ hacker willing to contribute to Bison.
  
  @node C++ Location Values
  @subsection C++ Location Values
@@@ -9324,55 -8887,98 +9329,98 @@@ define a @code{position}, a single poin
  range composed of a pair of @code{position}s (possibly spanning several
  files).
  
- @deftypemethod {position} {std::string*} file
+ @tindex uint
+ In this section @code{uint} is an abbreviation for @code{unsigned int}: in
+ genuine code only the latter is used.
+ @menu
+ * C++ position::         One point in the source file
+ * C++ location::         Two points in the source file
+ @end menu
+ @node C++ position
+ @subsubsection C++ @code{position}
+ @deftypeop {Constructor} {position} {} position (std::string* @var{file} = 0, uint @var{line} = 1, uint @var{col} = 1)
+ Create a @code{position} denoting a given point.  Note that @code{file} is
+ not reclaimed when the @code{position} is destroyed: memory managed must be
+ handled elsewhere.
+ @end deftypeop
+ @deftypemethod {position} {void} initialize (std::string* @var{file} = 0, uint @var{line} = 1, uint @var{col} = 1)
+ Reset the position to the given values.
+ @end deftypemethod
+ @deftypeivar {position} {std::string*} file
  The name of the file.  It will always be handled as a pointer, the
  parser will never duplicate nor deallocate it.  As an experimental
  feature you may change it to @samp{@var{type}*} using @samp{%define
  filename_type "@var{type}"}.
- @end deftypemethod
+ @end deftypeivar
  
- @deftypemethod {position} {unsigned int} line
+ @deftypeivar {position} {uint} line
  The line, starting at 1.
- @end deftypemethod
+ @end deftypeivar
  
- @deftypemethod {position} {unsigned int} lines (int @var{height} = 1)
+ @deftypemethod {position} {uint} lines (int @var{height} = 1)
  Advance by @var{height} lines, resetting the column number.
  @end deftypemethod
  
- @deftypemethod {position} {unsigned int} column
- The column, starting at 0.
- @end deftypemethod
+ @deftypeivar {position} {uint} column
+ The column, starting at 1.
+ @end deftypeivar
  
- @deftypemethod {position} {unsigned int} columns (int @var{width} = 1)
+ @deftypemethod {position} {uint} columns (int @var{width} = 1)
  Advance by @var{width} columns, without changing the line number.
  @end deftypemethod
  
- @deftypemethod {position} {position&} operator+= (position& @var{pos}, int @var{width})
- @deftypemethodx {position} {position} operator+ (const position& @var{pos}, int @var{width})
- @deftypemethodx {position} {position&} operator-= (const position& @var{pos}, int @var{width})
- @deftypemethodx {position} {position} operator- (position& @var{pos}, int @var{width})
+ @deftypemethod {position} {position&} operator+= (int @var{width})
+ @deftypemethodx {position} {position} operator+ (int @var{width})
+ @deftypemethodx {position} {position&} operator-= (int @var{width})
+ @deftypemethodx {position} {position} operator- (int @var{width})
  Various forms of syntactic sugar for @code{columns}.
  @end deftypemethod
  
- @deftypemethod {position} {position} operator<< (std::ostream @var{o}, const position& @var{p})
+ @deftypemethod {position} {bool} operator== (const position& @var{that})
+ @deftypemethodx {position} {bool} operator!= (const position& @var{that})
+ Whether @code{*this} and @code{that} denote equal/different positions.
+ @end deftypemethod
+ @deftypefun {std::ostream&} operator<< (std::ostream& @var{o}, const position& @var{p})
  Report @var{p} on @var{o} like this:
  @samp{@var{file}:@var{line}.@var{column}}, or
  @samp{@var{line}.@var{column}} if @var{file} is null.
+ @end deftypefun
+ @node C++ location
+ @subsubsection C++ @code{location}
+ @deftypeop {Constructor} {location} {} location (const position& @var{begin}, const position& @var{end})
+ Create a @code{Location} from the endpoints of the range.
+ @end deftypeop
+ @deftypeop {Constructor} {location} {} location (const position& @var{pos} = position())
+ @deftypeopx {Constructor} {location} {} location (std::string* @var{file}, uint @var{line}, uint @var{col})
+ Create a @code{Location} denoting an empty range located at a given point.
+ @end deftypeop
+ @deftypemethod {location} {void} initialize (std::string* @var{file} = 0, uint @var{line} = 1, uint @var{col} = 1)
+ Reset the location to an empty range at the given values.
  @end deftypemethod
  
- @deftypemethod {location} {position} begin
- @deftypemethodx {location} {position} end
+ @deftypeivar {location} {position} begin
+ @deftypeivarx {location} {position} end
  The first, inclusive, position of the range, and the first beyond.
- @end deftypemethod
+ @end deftypeivar
  
- @deftypemethod {location} {unsigned int} columns (int @var{width} = 1)
- @deftypemethodx {location} {unsigned int} lines (int @var{height} = 1)
+ @deftypemethod {location} {uint} columns (int @var{width} = 1)
+ @deftypemethodx {location} {uint} lines (int @var{height} = 1)
  Advance the @code{end} position.
  @end deftypemethod
  
- @deftypemethod {location} {location} operator+ (const location& @var{begin}, const location& @var{end})
- @deftypemethodx {location} {location} operator+ (const location& @var{begin}, int @var{width})
- @deftypemethodx {location} {location} operator+= (const location& @var{loc}, int @var{width})
+ @deftypemethod {location} {location} operator+ (const location& @var{end})
+ @deftypemethodx {location} {location} operator+ (int @var{width})
+ @deftypemethodx {location} {location} operator+= (int @var{width})
  Various forms of syntactic sugar.
  @end deftypemethod
  
  Move @code{begin} onto @code{end}.
  @end deftypemethod
  
+ @deftypemethod {location} {bool} operator== (const location& @var{that})
+ @deftypemethodx {location} {bool} operator!= (const location& @var{that})
+ Whether @code{*this} and @code{that} denote equal/different ranges of
+ positions.
+ @end deftypemethod
+ @deftypefun {std::ostream&} operator<< (std::ostream& @var{o}, const location& @var{p})
+ Report @var{p} on @var{o}, taking care of special cases such as: no
+ @code{filename} defined, or equal filename/line or column.
+ @end deftypefun
  
  @node C++ Parser Interface
  @subsection C++ Parser Interface
@@@ -9400,7 -9016,7 +9458,7 @@@ additional argument for its constructor
  
  @defcv {Type} {parser} {semantic_type}
  @defcvx {Type} {parser} {location_type}
 -The types for semantics value and locations.
 +The types for semantic values and locations (if enabled).
  @end defcv
  
  @defcv {Type} {parser} {token}
@@@ -9411,27 -9027,11 +9469,27 @@@ use @code{yy::parser::token::FOO}.  Th
  (@pxref{Calc++ Scanner}).
  @end defcv
  
 +@defcv {Type} {parser} {syntax_error}
 +This class derives from @code{std::runtime_error}.  Throw instances of it
 +from the scanner or from the user actions to raise parse errors.  This is
 +equivalent with first
 +invoking @code{error} to report the location and message of the syntax
 +error, and then to invoke @code{YYERROR} to enter the error-recovery mode.
 +But contrary to @code{YYERROR} which can only be invoked from user actions
 +(i.e., written in the action itself), the exception can be thrown from
 +function invoked from the user action.
 +@end defcv
 +
  @deftypemethod {parser} {} parser (@var{type1} @var{arg1}, ...)
  Build a new parser object.  There are no arguments by default, unless
  @samp{%parse-param @{@var{type1} @var{arg1}@}} was used.
  @end deftypemethod
  
 +@deftypemethod {syntax_error} {} syntax_error (const location_type& @var{l}, const std::string& @var{m})
 +@deftypemethodx {syntax_error} {} syntax_error (const std::string& @var{m})
 +Instantiate a syntax-error exception.
 +@end deftypemethod
 +
  @deftypemethod {parser} {int} parse ()
  Run the syntactic analysis, and return 0 on success, 1 otherwise.
  @end deftypemethod
@@@ -9449,11 -9049,9 +9507,11 @@@ or nonzero, full tracing
  @end deftypemethod
  
  @deftypemethod {parser} {void} error (const location_type& @var{l}, const std::string& @var{m})
 +@deftypemethodx {parser} {void} error (const std::string& @var{m})
  The definition for this member function must be supplied by the user:
  the parser uses it to report a parser error occurring at @var{l},
 -described by @var{m}.
 +described by @var{m}.  If location tracking is not enabled, the second
 +signature is used.
  @end deftypemethod
  
  
  
  The parser invokes the scanner by calling @code{yylex}.  Contrary to C
  parsers, C++ parsers are always pure: there is no point in using the
 -@code{%define api.pure} directive.  Therefore the interface is as follows.
 +@samp{%define api.pure} directive.  The actual interface with @code{yylex}
 +depends whether you use unions, or variants.
 +
 +@menu
 +* Split Symbols::         Passing symbols as two/three components
 +* Complete Symbols::      Making symbols a whole
 +@end menu
 +
 +@node Split Symbols
 +@subsubsection Split Symbols
 +
 +Therefore the interface is as follows.
  
  @deftypemethod {parser} {int} yylex (semantic_type* @var{yylval}, location_type* @var{yylloc}, @var{type1} @var{arg1}, ...)
 -Return the next token.  Its type is the return value, its semantic
 -value and location being @var{yylval} and @var{yylloc}.  Invocations of
 +@deftypemethodx {parser} {int} yylex (semantic_type* @var{yylval}, @var{type1} @var{arg1}, ...)
 +Return the next token.  Its type is the return value, its semantic value and
 +location (if enabled) being @var{yylval} and @var{yylloc}.  Invocations of
  @samp{%lex-param @{@var{type1} @var{arg1}@}} yield additional arguments.
  @end deftypemethod
  
 +Note that when using variants, the interface for @code{yylex} is the same,
 +but @code{yylval} is handled differently.
 +
 +Regular union-based code in Lex scanner typically look like:
 +
 +@example
 +[0-9]+   @{
 +           yylval.ival = text_to_int (yytext);
 +           return yy::parser::INTEGER;
 +         @}
 +[a-z]+   @{
 +           yylval.sval = new std::string (yytext);
 +           return yy::parser::IDENTIFIER;
 +         @}
 +@end example
 +
 +Using variants, @code{yylval} is already constructed, but it is not
 +initialized.  So the code would look like:
 +
 +@example
 +[0-9]+   @{
 +           yylval.build<int>() = text_to_int (yytext);
 +           return yy::parser::INTEGER;
 +         @}
 +[a-z]+   @{
 +           yylval.build<std::string> = yytext;
 +           return yy::parser::IDENTIFIER;
 +         @}
 +@end example
 +
 +@noindent
 +or
 +
 +@example
 +[0-9]+   @{
 +           yylval.build(text_to_int (yytext));
 +           return yy::parser::INTEGER;
 +         @}
 +[a-z]+   @{
 +           yylval.build(yytext);
 +           return yy::parser::IDENTIFIER;
 +         @}
 +@end example
 +
 +
 +@node Complete Symbols
 +@subsubsection Complete Symbols
 +
 +If you specified both @code{%define variant} and @code{%define lex_symbol},
 +the @code{parser} class also defines the class @code{parser::symbol_type}
 +which defines a @emph{complete} symbol, aggregating its type (i.e., the
 +traditional value returned by @code{yylex}), its semantic value (i.e., the
 +value passed in @code{yylval}, and possibly its location (@code{yylloc}).
 +
 +@deftypemethod {symbol_type} {} symbol_type (token_type @var{type},  const semantic_type& @var{value}, const location_type& @var{location})
 +Build a complete terminal symbol which token type is @var{type}, and which
 +semantic value is @var{value}.  If location tracking is enabled, also pass
 +the @var{location}.
 +@end deftypemethod
 +
 +This interface is low-level and should not be used for two reasons.  First,
 +it is inconvenient, as you still have to build the semantic value, which is
 +a variant, and second, because consistency is not enforced: as with unions,
 +it is still possible to give an integer as semantic value for a string.
 +
 +So for each token type, Bison generates named constructors as follows.
 +
 +@deftypemethod {symbol_type} {} make_@var{token} (const @var{value_type}& @var{value}, const location_type& @var{location})
 +@deftypemethodx {symbol_type} {} make_@var{token} (const location_type& @var{location})
 +Build a complete terminal symbol for the token type @var{token} (not
 +including the @code{api.tokens.prefix}) whose possible semantic value is
 +@var{value} of adequate @var{value_type}.  If location tracking is enabled,
 +also pass the @var{location}.
 +@end deftypemethod
 +
 +For instance, given the following declarations:
 +
 +@example
 +%define api.tokens.prefix "TOK_"
 +%token <std::string> IDENTIFIER;
 +%token <int> INTEGER;
 +%token COLON;
 +@end example
 +
 +@noindent
 +Bison generates the following functions:
 +
 +@example
 +symbol_type make_IDENTIFIER(const std::string& v,
 +                            const location_type& l);
 +symbol_type make_INTEGER(const int& v,
 +                         const location_type& loc);
 +symbol_type make_COLON(const location_type& loc);
 +@end example
 +
 +@noindent
 +which should be used in a Lex-scanner as follows.
 +
 +@example
 +[0-9]+   return yy::parser::make_INTEGER(text_to_int (yytext), loc);
 +[a-z]+   return yy::parser::make_IDENTIFIER(yytext, loc);
 +":"      return yy::parser::make_COLON(loc);
 +@end example
 +
 +Tokens that do not have an identifier are not accessible: you cannot simply
 +use characters such as @code{':'}, they must be declared with @code{%token}.
  
  @node A Complete C++ Example
  @subsection A Complete C++ Example
  
  This section demonstrates the use of a C++ parser with a simple but
  complete example.  This example should be available on your system,
 -ready to compile, in the directory @dfn{../bison/examples/calc++}.  It
 +ready to compile, in the directory @dfn{.../bison/examples/calc++}.  It
  focuses on the use of Bison, therefore the design of the various C++
  classes is very naive: no accessors, no encapsulation of members etc.
  We will use a Lex scanner, and more precisely, a Flex scanner, to
 -demonstrate the various interaction.  A hand written scanner is
 +demonstrate the various interactions.  A hand-written scanner is
  actually easier to interface with.
  
  @menu
@@@ -9665,8 -9145,11 +9723,8 @@@ factor both as follows
  @comment file: calc++-driver.hh
  @example
  // Tell Flex the lexer's prototype ...
 -# define YY_DECL                                        \
 -  yy::calcxx_parser::token_type                         \
 -  yylex (yy::calcxx_parser::semantic_type* yylval,      \
 -         yy::calcxx_parser::location_type* yylloc,      \
 -         calcxx_driver& driver)
 +# define YY_DECL \
 +  yy::calcxx_parser::symbol_type yylex (calcxx_driver& driver)
  // ... and declare it for the parser's sake.
  YY_DECL;
  @end example
@@@ -9690,8 -9173,8 +9748,8 @@@ public
  @end example
  
  @noindent
 -To encapsulate the coordination with the Flex scanner, it is useful to
 -have two members function to open and close the scanning phase.
 +To encapsulate the coordination with the Flex scanner, it is useful to have
 +member functions to open and close the scanning phase.
  
  @comment file: calc++-driver.hh
  @example
@@@ -9706,13 -9189,9 +9764,13 @@@ Similarly for the parser itself
  
  @comment file: calc++-driver.hh
  @example
 -  // Run the parser.  Return 0 on success.
 +  // Run the parser on file F.
 +  // Return 0 on success.
    int parse (const std::string& f);
 +  // The name of the file being parsed.
 +  // Used later to pass the file name to the location tracker.
    std::string file;
 +  // Whether parser traces should be generated.
    bool trace_parsing;
  @end example
  
@@@ -9794,35 -9273,19 +9852,35 @@@ the grammar for
  %define parser_class_name "calcxx_parser"
  @end example
  
 +@noindent
 +@findex %define variant
 +@findex %define lex_symbol
 +This example will use genuine C++ objects as semantic values, therefore, we
 +require the variant-based interface.  To make sure we properly use it, we
 +enable assertions.  To fully benefit from type-safety and more natural
 +definition of ``symbol'', we enable @code{lex_symbol}.
 +
 +@comment file: calc++-parser.yy
 +@example
 +%define variant
 +%define parse.assert
 +%define lex_symbol
 +@end example
 +
  @noindent
  @findex %code requires
 -Then come the declarations/inclusions needed to define the
 -@code{%union}.  Because the parser uses the parsing driver and
 -reciprocally, both cannot include the header of the other.  Because the
 +Then come the declarations/inclusions needed by the semantic values.
 +Because the parser uses the parsing driver and reciprocally, both would like
 +to include the header of the other, which is, of course, insane.  This
 +mutual dependency will be broken using forward declarations.  Because the
  driver's header needs detailed knowledge about the parser class (in
 -particular its inner types), it is the parser's header which will simply
 -use a forward declaration of the driver.
 -@xref{%code Summary}.
 +particular its inner types), it is the parser's header which will use a
 +forward declaration of the driver.  @xref{%code Summary}.
  
  @comment file: calc++-parser.yy
  @example
 -%code requires @{
 +%code requires
 +@{
  # include <string>
  class calcxx_driver;
  @}
@@@ -9836,14 -9299,15 +9894,14 @@@ global variables
  @comment file: calc++-parser.yy
  @example
  // The parsing context.
 -%parse-param @{ calcxx_driver& driver @}
 -%lex-param   @{ calcxx_driver& driver @}
 +%param @{ calcxx_driver& driver @}
  @end example
  
  @noindent
 -Then we request the location tracking feature, and initialize the
 +Then we request location tracking, and initialize the
  first location's file name.  Afterward new locations are computed
  relatively to the previous locations: the file name will be
 -automatically propagated.
 +propagated.
  
  @comment file: calc++-parser.yy
  @example
  @end example
  
  @noindent
 -Use the two following directives to enable parser tracing and verbose error
 +Use the following two directives to enable parser tracing and verbose error
  messages.  However, verbose error messages can contain incorrect information
  (@pxref{LAC}).
  
  @comment file: calc++-parser.yy
  @example
 -%debug
 -%error-verbose
 -@end example
 -
 -@noindent
 -Semantic values cannot use ``real'' objects, but only pointers to
 -them.
 -
 -@comment file: calc++-parser.yy
 -@example
 -// Symbols.
 -%union
 -@{
 -  int          ival;
 -  std::string *sval;
 -@};
 +%define parse.trace
 +%define parse.error verbose
  @end example
  
  @noindent
@@@ -9873,8 -9351,7 +9931,8 @@@ The code between @samp{%code @{} and @s
  
  @comment file: calc++-parser.yy
  @example
 -%code @{
 +%code
 +@{
  # include "calc++-driver.hh"
  @}
  @end example
  
  @noindent
  The token numbered as 0 corresponds to end of file; the following line
 -allows for nicer error messages referring to ``end of file'' instead
 -of ``$end''.  Similarly user friendly named are provided for each
 -symbol.  Note that the tokens names are prefixed by @code{TOKEN_} to
 -avoid name clashes.
 +allows for nicer error messages referring to ``end of file'' instead of
 +``$end''.  Similarly user friendly names are provided for each symbol.  To
 +avoid name clashes in the generated files (@pxref{Calc++ Scanner}), prefix
 +tokens with @code{TOK_} (@pxref{%define Summary,,api.tokens.prefix}).
  
  @comment file: calc++-parser.yy
  @example
 -%token        END      0 "end of file"
 -%token        ASSIGN     ":="
 -%token <sval> IDENTIFIER "identifier"
 -%token <ival> NUMBER     "number"
 -%type  <ival> exp
 +%define api.tokens.prefix "TOK_"
 +%token
 +  END  0  "end of file"
 +  ASSIGN  ":="
 +  MINUS   "-"
 +  PLUS    "+"
 +  STAR    "*"
 +  SLASH   "/"
 +  LPAREN  "("
 +  RPAREN  ")"
 +;
  @end example
  
  @noindent
 -To enable memory deallocation during error recovery, use
 -@code{%destructor}.
 +Since we use variant-based semantic values, @code{%union} is not used, and
 +both @code{%type} and @code{%token} expect genuine types, as opposed to type
 +tags.
  
 -@c FIXME: Document %printer, and mention that it takes a braced-code operand.
  @comment file: calc++-parser.yy
  @example
 -%printer    @{ debug_stream () << *$$; @} "identifier"
 -%destructor @{ delete $$; @} "identifier"
 +%token <std::string> IDENTIFIER "identifier"
 +%token <int> NUMBER "number"
 +%type  <int> exp
 +@end example
 +
 +@noindent
 +No @code{%destructor} is needed to enable memory deallocation during error
 +recovery; the memory, for strings for instance, will be reclaimed by the
 +regular destructors.  All the values are printed using their
 +@code{operator<<}.
  
 -%printer    @{ debug_stream () << $$; @} <ival>
 +@c FIXME: Document %printer, and mention that it takes a braced-code operand.
 +@comment file: calc++-parser.yy
 +@example
 +%printer @{ debug_stream () << $$; @} <*>;
  @end example
  
  @noindent
 -The grammar itself is straightforward.
 +The grammar itself is straightforward (@pxref{Location Tracking Calc, ,
 +Location Tracking Calculator: @code{ltcalc}}).
  
  @comment file: calc++-parser.yy
  @example
@@@ -9941,18 -9400,17 +9999,18 @@@ assignments
  | assignments assignment @{@};
  
  assignment:
 -     "identifier" ":=" exp
 -       @{ driver.variables[*$1] = $3; delete $1; @};
 -
 -%left '+' '-';
 -%left '*' '/';
 -exp: exp '+' exp   @{ $$ = $1 + $3; @}
 -   | exp '-' exp   @{ $$ = $1 - $3; @}
 -   | exp '*' exp   @{ $$ = $1 * $3; @}
 -   | exp '/' exp   @{ $$ = $1 / $3; @}
 -   | "identifier"  @{ $$ = driver.variables[*$1]; delete $1; @}
 -   | "number"      @{ $$ = $1; @};
 +  "identifier" ":=" exp @{ driver.variables[$1] = $3; @};
 +
 +%left "+" "-";
 +%left "*" "/";
 +exp:
 +  exp "+" exp   @{ $$ = $1 + $3; @}
 +| exp "-" exp   @{ $$ = $1 - $3; @}
 +| exp "*" exp   @{ $$ = $1 * $3; @}
 +| exp "/" exp   @{ $$ = $1 / $3; @}
 +| "(" exp ")"   @{ std::swap ($$, $2); @}
 +| "identifier"  @{ $$ = driver.variables[$1]; @}
 +| "number"      @{ std::swap ($$, $1); @};
  %%
  @end example
  
@@@ -9963,7 -9421,7 +10021,7 @@@ driver
  @comment file: calc++-parser.yy
  @example
  void
 -yy::calcxx_parser::error (const yy::calcxx_parser::location_type& l,
 +yy::calcxx_parser::error (const location_type& l,
                            const std::string& m)
  @{
    driver.error (l, m);
@@@ -9979,22 -9437,24 +10037,22 @@@ parser's to get the set of defined toke
  @comment file: calc++-scanner.ll
  @example
  %@{ /* -*- C++ -*- */
 -# include <cstdlib>
  # include <cerrno>
  # include <climits>
 +# include <cstdlib>
  # include <string>
  # include "calc++-driver.hh"
  # include "calc++-parser.hh"
  
 -/* Work around an incompatibility in flex (at least versions
 -   2.5.31 through 2.5.33): it generates code that does
 -   not conform to C89.  See Debian bug 333231
 -   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
 +// Work around an incompatibility in flex (at least versions
 +// 2.5.31 through 2.5.33): it generates code that does
 +// not conform to C89.  See Debian bug 333231
 +// <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.
  # undef yywrap
  # define yywrap() 1
  
 -/* By default yylex returns int, we use token_type.
 -   Unfortunately yyterminate by default returns 0, which is
 -   not of token_type.  */
 -#define yyterminate() return token::END
 +// The location of the current token.
 +static yy::location loc;
  %@}
  @end example
  
  Because there is no @code{#include}-like feature we don't need
  @code{yywrap}, we don't need @code{unput} either, and we parse an
  actual file, this is not an interactive session with the user.
 -Finally we enable the scanner tracing features.
 +Finally, we enable scanner tracing.
  
  @comment file: calc++-scanner.ll
  @example
@@@ -10022,8 -9482,8 +10080,8 @@@ blank [ \t
  @noindent
  The following paragraph suffices to track locations accurately.  Each
  time @code{yylex} is invoked, the begin position is moved onto the end
 -position.  Then when a pattern is matched, the end position is
 -advanced of its width.  In case it matched ends of lines, the end
 +position.  Then when a pattern is matched, its width is added to the end
 +column.  When matching ends of lines, the end
  cursor is adjusted, and each time blanks are matched, the begin cursor
  is moved onto the end cursor to effectively ignore the blanks
  preceding tokens.  Comments would be treated equally.
  @example
  @group
  %@{
 -# define YY_USER_ACTION  yylloc->columns (yyleng);
 +  // Code run each time a pattern is matched.
 +  # define YY_USER_ACTION  loc.columns (yyleng);
  %@}
  @end group
  %%
 +@group
  %@{
 -  yylloc->step ();
 +  // Code run each time yylex is called.
 +  loc.step ();
  %@}
 -@{blank@}+   yylloc->step ();
 -[\n]+      yylloc->lines (yyleng); yylloc->step ();
 +@end group
 +@{blank@}+   loc.step ();
 +[\n]+      loc.lines (yyleng); loc.step ();
  @end example
  
  @noindent
 -The rules are simple, just note the use of the driver to report errors.
 -It is convenient to use a typedef to shorten
 -@code{yy::calcxx_parser::token::identifier} into
 -@code{token::identifier} for instance.
 +The rules are simple.  The driver is used to report errors.
  
  @comment file: calc++-scanner.ll
  @example
 -%@{
 -  typedef yy::calcxx_parser::token token;
 -%@}
 -           /* Convert ints to the actual type of tokens.  */
 -[-+*/]     return yy::calcxx_parser::token_type (yytext[0]);
 -":="       return token::ASSIGN;
 +"-"      return yy::calcxx_parser::make_MINUS(loc);
 +"+"      return yy::calcxx_parser::make_PLUS(loc);
 +"*"      return yy::calcxx_parser::make_STAR(loc);
 +"/"      return yy::calcxx_parser::make_SLASH(loc);
 +"("      return yy::calcxx_parser::make_LPAREN(loc);
 +")"      return yy::calcxx_parser::make_RPAREN(loc);
 +":="     return yy::calcxx_parser::make_ASSIGN(loc);
 +
 +@group
  @{int@}      @{
    errno = 0;
    long n = strtol (yytext, NULL, 10);
    if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
 -    driver.error (*yylloc, "integer is out of range");
 -  yylval->ival = n;
 -  return token::NUMBER;
 +    driver.error (loc, "integer is out of range");
 +  return yy::calcxx_parser::make_NUMBER(n, loc);
  @}
 -@{id@}       yylval->sval = new std::string (yytext); return token::IDENTIFIER;
 -.          driver.error (*yylloc, "invalid character");
 +@end group
 +@{id@}       return yy::calcxx_parser::make_IDENTIFIER(yytext, loc);
 +.          driver.error (loc, "invalid character");
 +<<EOF>>    return yy::calcxx_parser::make_END(loc);
  %%
  @end example
  
  @noindent
 -Finally, because the scanner related driver's member function depend
 +Finally, because the scanner-related driver's member-functions depend
  on the scanner's data, it is simpler to implement them in this file.
  
  @comment file: calc++-scanner.ll
@@@ -10119,7 -9574,6 +10177,7 @@@ The top level file, @file{calc++.cc}, p
  int
  main (int argc, char *argv[])
  @{
 +  int res = 0;
    calcxx_driver driver;
    for (++argv; argv[0]; ++argv)
      if (*argv == std::string ("-p"))
        driver.trace_scanning = true;
      else if (!driver.parse (*argv))
        std::cout << driver.result << std::endl;
 +    else
 +      res = 1;
 +  return res;
  @}
  @end group
  @end example
@@@ -10175,7 -9626,7 +10233,7 @@@ You can create documentation for genera
  Contrary to C parsers, Java parsers do not use global variables; the
  state of the parser is always local to an instance of the parser class.
  Therefore, all Java parsers are ``pure'', and the @code{%pure-parser}
 -and @code{%define api.pure} directives does not do anything when used in
 +and @samp{%define api.pure} directives does not do anything when used in
  Java.
  
  Push parsers are currently unsupported in Java and @code{%define
@@@ -10188,23 -9639,15 +10246,23 @@@ No header file can be generated for Jav
  @code{%defines} directive or the @option{-d}/@option{--defines} options.
  
  @c FIXME: Possible code change.
 -Currently, support for debugging and verbose errors are always compiled
 -in.  Thus the @code{%debug} and @code{%token-table} directives and the
 +Currently, support for tracing is always compiled
 +in.  Thus the @samp{%define parse.trace} and @samp{%token-table}
 +directives and the
  @option{-t}/@option{--debug} and @option{-k}/@option{--token-table}
  options have no effect.  This may change in the future to eliminate
 -unused code in the generated parser, so use @code{%debug} and
 -@code{%verbose-error} explicitly if needed.  Also, in the future the
 +unused code in the generated parser, so use @samp{%define parse.trace}
 +explicitly
 +if needed.  Also, in the future the
  @code{%token-table} directive might enable a public interface to
  access the token names and codes.
  
 +Getting a ``code too large'' error from the Java compiler means the code
 +hit the 64KB bytecode per method limitation of the Java class file.
 +Try reducing the amount of code in actions and static initializers;
 +otherwise, report a bug so that the parser skeleton will be improved.
 +
 +
  @node Java Semantic Values
  @subsection Java Semantic Values
  @c - No %union, specify type in %type/%token.
@@@ -10223,7 -9666,7 +10281,7 @@@ semantic values' types (class names) sh
  By default, the semantic stack is declared to have @code{Object} members,
  which means that the class types you specify can be of any class.
  To improve the type safety of the parser, you can declare the common
 -superclass of all the semantic values using the @code{%define stype}
 +superclass of all the semantic values using the @samp{%define stype}
  directive.  For example, after the following declaration:
  
  @example
@@@ -10262,11 -9705,11 +10320,11 @@@ class defines a @dfn{position}, a singl
  defines a class representing a @dfn{location}, a range composed of a pair of
  positions (possibly spanning several files).  The location class is an inner
  class of the parser; the name is @code{Location} by default, and may also be
 -renamed using @code{%define location_type "@var{class-name}"}.
 +renamed using @samp{%define location_type "@var{class-name}"}.
  
  The location class treats the position as a completely opaque value.
  By default, the class name is @code{Position}, but this can be changed
 -with @code{%define position_type "@var{class-name}"}.  This class must
 +with @samp{%define position_type "@var{class-name}"}.  This class must
  be supplied by the user.
  
  
@@@ -10301,22 -9744,20 +10359,22 @@@ properly, the position class should ove
  The name of the generated parser class defaults to @code{YYParser}.  The
  @code{YY} prefix may be changed using the @code{%name-prefix} directive
  or the @option{-p}/@option{--name-prefix} option.  Alternatively, use
 -@code{%define parser_class_name "@var{name}"} to give a custom name to
 +@samp{%define parser_class_name "@var{name}"} to give a custom name to
  the class.  The interface of this class is detailed below.
  
  By default, the parser class has package visibility.  A declaration
 -@code{%define public} will change to public visibility.  Remember that,
 +@samp{%define public} will change to public visibility.  Remember that,
  according to the Java language specification, the name of the @file{.java}
  file should match the name of the class in this case.  Similarly, you can
  use @code{abstract}, @code{final} and @code{strictfp} with the
  @code{%define} declaration to add other modifiers to the parser class.
 +A single @samp{%define annotations "@var{annotations}"} directive can
 +be used to add any number of annotations to the parser class.
  
  The Java package name of the parser class can be specified using the
 -@code{%define package} directive.  The superclass and the implemented
 +@samp{%define package} directive.  The superclass and the implemented
  interfaces of the parser class can be specified with the @code{%define
 -extends} and @code{%define implements} directives.
 +extends} and @samp{%define implements} directives.
  
  The parser class defines an inner class, @code{Location}, that is used
  for location tracking (see @ref{Java Location Values}), and a inner
@@@ -10325,33 -9766,30 +10383,33 @@@ these inner class/interface, and the me
  below, all the other members and fields are preceded with a @code{yy} or
  @code{YY} prefix to avoid clashes with user code.
  
 -@c FIXME: The following constants and variables are still undocumented:
 -@c @code{bisonVersion}, @code{bisonSkeleton} and @code{errorVerbose}.
 -
  The parser class can be extended using the @code{%parse-param}
  directive. Each occurrence of the directive will add a @code{protected
  final} field to the parser class, and an argument to its constructor,
  which initialize them automatically.
  
 -Token names defined by @code{%token} and the predefined @code{EOF} token
 -name are added as constant fields to the parser class.
 -
  @deftypeop {Constructor} {YYParser} {} YYParser (@var{lex_param}, @dots{}, @var{parse_param}, @dots{})
  Build a new parser object with embedded @code{%code lexer}.  There are
 -no parameters, unless @code{%parse-param}s and/or @code{%lex-param}s are
 -used.
 +no parameters, unless @code{%param}s and/or @code{%parse-param}s and/or
 +@code{%lex-param}s are used.
 +
 +Use @code{%code init} for code added to the start of the constructor
 +body. This is especially useful to initialize superclasses. Use
 +@samp{%define init_throws} to specify any uncaught exceptions.
  @end deftypeop
  
  @deftypeop {Constructor} {YYParser} {} YYParser (Lexer @var{lexer}, @var{parse_param}, @dots{})
  Build a new parser object using the specified scanner.  There are no
 -additional parameters unless @code{%parse-param}s are used.
 +additional parameters unless @code{%param}s and/or @code{%parse-param}s are
 +used.
  
  If the scanner is defined by @code{%code lexer}, this constructor is
  declared @code{protected} and is called automatically with a scanner
 -created with the correct @code{%lex-param}s.
 +created with the correct @code{%param}s and/or @code{%lex-param}s.
 +
 +Use @code{%code init} for code added to the start of the constructor
 +body. This is especially useful to initialize superclasses. Use
 +@samp{%define init_throws} to specify any uncaught exceptions.
  @end deftypeop
  
  @deftypemethod {YYParser} {boolean} parse ()
@@@ -10359,21 -9797,6 +10417,21 @@@ Run the syntactic analysis, and return 
  @code{false} otherwise.
  @end deftypemethod
  
 +@deftypemethod {YYParser} {boolean} getErrorVerbose ()
 +@deftypemethodx {YYParser} {void} setErrorVerbose (boolean @var{verbose})
 +Get or set the option to produce verbose error messages.  These are only
 +available with @samp{%define parse.error verbose}, which also turns on
 +verbose error messages.
 +@end deftypemethod
 +
 +@deftypemethod {YYParser} {void} yyerror (String @var{msg})
 +@deftypemethodx {YYParser} {void} yyerror (Position @var{pos}, String @var{msg})
 +@deftypemethodx {YYParser} {void} yyerror (Location @var{loc}, String @var{msg})
 +Print an error message using the @code{yyerror} method of the scanner
 +instance in use. The @code{Location} and @code{Position} parameters are
 +available only if location tracking is active.
 +@end deftypemethod
 +
  @deftypemethod {YYParser} {boolean} recovering ()
  During the syntactic analysis, return @code{true} if recovering
  from a syntax error.
@@@ -10392,11 -9815,6 +10450,11 @@@ Get or set the tracing level.  Currentl
  or nonzero, full tracing.
  @end deftypemethod
  
 +@deftypecv {Constant} {YYParser} {String} {bisonVersion}
 +@deftypecvx {Constant} {YYParser} {String} {bisonSkeleton}
 +Identify the Bison version and skeleton used to generate this parser.
 +@end deftypecv
 +
  
  @node Java Scanner Interface
  @subsection Java Scanner Interface
  There are two possible ways to interface a Bison-generated Java parser
  with a scanner: the scanner may be defined by @code{%code lexer}, or
  defined elsewhere.  In either case, the scanner has to implement the
 -@code{Lexer} inner interface of the parser class.
 +@code{Lexer} inner interface of the parser class.  This interface also
 +contain constants for all user-defined token names and the predefined
 +@code{EOF} token.
  
  In the first case, the body of the scanner class is placed in
  @code{%code lexer} blocks.  If you want to pass parameters from the
@@@ -10428,7 -9844,7 +10486,7 @@@ In both cases, the scanner has to imple
  @deftypemethod {Lexer} {void} yyerror (Location @var{loc}, String @var{msg})
  This method is defined by the user to emit an error message.  The first
  parameter is omitted if location tracking is not active.  Its type can be
 -changed using @code{%define location_type "@var{class-name}".}
 +changed using @samp{%define location_type "@var{class-name}".}
  @end deftypemethod
  
  @deftypemethod {Lexer} {int} yylex ()
@@@ -10436,7 -9852,7 +10494,7 @@@ Return the next token.  Its type is th
  value and location are saved and returned by the their methods in the
  interface.
  
 -Use @code{%define lex_throws} to specify any uncaught exceptions.
 +Use @samp{%define lex_throws} to specify any uncaught exceptions.
  Default is @code{java.io.IOException}.
  @end deftypemethod
  
@@@ -10446,14 -9862,14 +10504,14 @@@ Return respectively the first position 
  @code{yylex} returned, and the first position beyond it.  These
  methods are not needed unless location tracking is active.
  
 -The return type can be changed using @code{%define position_type
 +The return type can be changed using @samp{%define position_type
  "@var{class-name}".}
  @end deftypemethod
  
  @deftypemethod {Lexer} {Object} getLVal ()
  Return the semantic value of the last token that yylex returned.
  
 -The return type can be changed using @code{%define stype
 +The return type can be changed using @samp{%define stype
  "@var{class-name}".}
  @end deftypemethod
  
  The following special constructs can be uses in Java actions.
  Other analogous C action features are currently unavailable for Java.
  
 -Use @code{%define throws} to specify any uncaught exceptions from parser
 +Use @samp{%define throws} to specify any uncaught exceptions from parser
  actions, and initial actions specified by @code{%initial-action}.
  
  @defvar $@var{n}
@@@ -10481,7 -9897,7 +10539,7 @@@ Like @code{$@var{n}} but specifies a al
  @defvar $$
  The semantic value for the grouping made by the current rule.  As a
  value, this is in the base type (@code{Object} or as specified by
 -@code{%define stype}) as in not cast to the declared subtype because
 +@samp{%define stype}) as in not cast to the declared subtype because
  casts are not allowed on the left-hand side of Java assignments.
  Use an explicit Java cast if the correct subtype is needed.
  @xref{Java Semantic Values}.
@@@ -10528,12 -9944,11 +10586,12 @@@ operation
  @xref{Error Recovery}.
  @end deftypefn
  
 -@deftypefn  {Function} {protected void} yyerror (String msg)
 -@deftypefnx {Function} {protected void} yyerror (Position pos, String msg)
 -@deftypefnx {Function} {protected void} yyerror (Location loc, String msg)
 +@deftypefn  {Function} {void} yyerror (String @var{msg})
 +@deftypefnx {Function} {void} yyerror (Position @var{loc}, String @var{msg})
 +@deftypefnx {Function} {void} yyerror (Location @var{loc}, String @var{msg})
  Print an error message using the @code{yyerror} method of the scanner
 -instance in use.
 +instance in use. The @code{Location} and @code{Position} parameters are
 +available only if location tracking is active.
  @end deftypefn
  
  
@@@ -10577,7 -9992,7 +10635,7 @@@ The prologue declarations have a differ
  @item @code{%code imports}
  blocks are placed at the beginning of the Java source code.  They may
  include copyright notices.  For a @code{package} declarations, it is
 -suggested to use @code{%define package} instead.
 +suggested to use @samp{%define package} instead.
  
  @item unqualified @code{%code}
  blocks are placed inside the parser class.
@@@ -10618,7 -10033,7 +10676,7 @@@ constructor that @emph{creates} a lexer
  
  @deffn {Directive} %name-prefix "@var{prefix}"
  The prefix of the parser class name @code{@var{prefix}Parser} if
 -@code{%define parser_class_name} is not used.  Default is @code{YY}.
 +@samp{%define parser_class_name} is not used.  Default is @code{YY}.
  @xref{Java Bison Interface}.
  @end deffn
  
@@@ -10649,11 -10064,6 +10707,11 @@@ Code inserted just after the @code{pack
  @xref{Java Differences}.
  @end deffn
  
 +@deffn {Directive} {%code init} @{ @var{code} @dots{} @}
 +Code inserted at the beginning of the parser constructor body.
 +@xref{Java Parser Interface}.
 +@end deffn
 +
  @deffn {Directive} {%code lexer} @{ @var{code} @dots{} @}
  Code added to the body of a inner lexer class within the parser class.
  @xref{Java Scanner Interface}.
@@@ -10666,7 -10076,7 +10724,7 @@@ Code (after the second @code{%%}) appen
  @end deffn
  
  @deffn {Directive} %@{ @var{code} @dots{} %@}
 -Not supported.  Use @code{%code import} instead.
 +Not supported.  Use @code{%code imports} instead.
  @xref{Java Differences}.
  @end deffn
  
@@@ -10675,11 -10085,6 +10733,11 @@@ Whether the parser class is declared @c
  @xref{Java Bison Interface}.
  @end deffn
  
 +@deffn {Directive} {%define annotations} "@var{annotations}"
 +The Java annotations for the parser class.  Default is none.
 +@xref{Java Bison Interface}.
 +@end deffn
 +
  @deffn {Directive} {%define extends} "@var{superclass}"
  The superclass of the parser class.  Default is none.
  @xref{Java Bison Interface}.
@@@ -10696,12 -10101,6 +10754,12 @@@ Default is none
  @xref{Java Bison Interface}.
  @end deffn
  
 +@deffn {Directive} {%define init_throws} "@var{exceptions}"
 +The exceptions thrown by @code{%code init} from the parser class
 +constructor.  Default is none.
 +@xref{Java Parser Interface}.
 +@end deffn
 +
  @deffn {Directive} {%define lex_throws} "@var{exceptions}"
  The exceptions thrown by the @code{yylex} method of the lexer, a
  comma-separated list.  Default is @code{java.io.IOException}.
@@@ -11219,19 -10618,6 +11277,19 @@@ the grammar file.  @xref{Grammar Outlin
  Grammar}.
  @end deffn
  
 +@deffn {Directive} %?@{@var{expression}@}
 +Predicate actions.  This is a type of action clause that may appear in
 +rules. The expression is evaluated, and if false, causes a syntax error.  In
 +GLR parsers during nondeterministic operation,
 +this silently causes an alternative parse to die.  During deterministic
 +operation, it is the same as the effect of YYERROR.
 +@xref{Semantic Predicates}.
 +
 +This feature is experimental.
 +More user feedback will help to determine whether it should become a permanent
 +feature.
 +@end deffn
 +
  @deffn {Construct} /*@dots{}*/
  Comment delimiters, as in C.
  @end deffn
@@@ -11341,8 -10727,8 +11399,8 @@@ token is reset to the token that origin
  @end deffn
  
  @deffn {Directive} %error-verbose
 -Bison declaration to request verbose, specific error message strings
 -when @code{yyerror} is called.  @xref{Error Reporting}.
 +An obsolete directive standing for @samp{%define parse.error verbose}
 +(@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}).
  @end deffn
  
  @deffn {Directive} %file-prefix "@var{prefix}"
@@@ -11365,12 -10751,12 +11423,12 @@@ Specify the programming language for th
  @end deffn
  
  @deffn {Directive} %left
 -Bison declaration to assign left associativity to token(s).
 +Bison declaration to assign precedence and left associativity to token(s).
  @xref{Precedence Decl, ,Operator Precedence}.
  @end deffn
  
 -@deffn {Directive} %lex-param @{@var{argument-declaration}@}
 -Bison declaration to specifying an additional parameter that
 +@deffn {Directive} %lex-param @{@var{argument-declaration}@} @dots{}
 +Bison declaration to specifying additional arguments that
  @code{yylex} should accept.  @xref{Pure Calling,, Calling Conventions
  for Pure Parsers}.
  @end deffn
@@@ -11400,7 -10786,7 +11458,7 @@@ parser implementation file.  @xref{Dec
  @end deffn
  
  @deffn {Directive} %nonassoc
 -Bison declaration to assign nonassociativity to token(s).
 +Bison declaration to assign precedence and nonassociativity to token(s).
  @xref{Precedence Decl, ,Operator Precedence}.
  @end deffn
  
@@@ -11409,15 -10795,10 +11467,15 @@@ Bison declaration to set the name of th
  @xref{Decl Summary}.
  @end deffn
  
 -@deffn {Directive} %parse-param @{@var{argument-declaration}@}
 -Bison declaration to specifying an additional parameter that
 -@code{yyparse} should accept.  @xref{Parser Function,, The Parser
 -Function @code{yyparse}}.
 +@deffn {Directive} %param @{@var{argument-declaration}@} @dots{}
 +Bison declaration to specify additional arguments that both
 +@code{yylex} and @code{yyparse} should accept.  @xref{Parser Function,, The
 +Parser Function @code{yyparse}}.
 +@end deffn
 +
 +@deffn {Directive} %parse-param @{@var{argument-declaration}@} @dots{}
 +Bison declaration to specify additional arguments that @code{yyparse}
 +should accept.  @xref{Parser Function,, The Parser Function @code{yyparse}}.
  @end deffn
  
  @deffn {Directive} %prec
@@@ -11425,13 -10806,8 +11483,13 @@@ Bison declaration to assign a precedenc
  @xref{Contextual Precedence, ,Context-Dependent Precedence}.
  @end deffn
  
 +@deffn {Directive} %precedence
 +Bison declaration to assign precedence to token(s), but no associativity
 +@xref{Precedence Decl, ,Operator Precedence}.
 +@end deffn
 +
  @deffn {Directive} %pure-parser
 -Deprecated version of @code{%define api.pure} (@pxref{%define
 +Deprecated version of @samp{%define api.pure} (@pxref{%define
  Summary,,api.pure}), for which Bison is more careful to warn about
  unreasonable usage.
  @end deffn
@@@ -11442,7 -10818,7 +11500,7 @@@ Require a Version of Bison}
  @end deffn
  
  @deffn {Directive} %right
 -Bison declaration to assign right associativity to token(s).
 +Bison declaration to assign precedence and right associativity to token(s).
  @xref{Precedence Decl, ,Operator Precedence}.
  @end deffn
  
@@@ -11546,16 -10922,16 +11604,16 @@@ instead
  
  @deffn {Function} yyerror
  User-supplied function to be called by @code{yyparse} on error.
 -@xref{Error Reporting, ,The Error
 -Reporting Function @code{yyerror}}.
 +@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}.
  @end deffn
  
  @deffn {Macro} YYERROR_VERBOSE
 -An obsolete macro that you define with @code{#define} in the prologue
 -to request verbose, specific error message strings
 -when @code{yyerror} is called.  It doesn't matter what definition you
 -use for @code{YYERROR_VERBOSE}, just whether you define it.  Using
 -@code{%error-verbose} is preferred.  @xref{Error Reporting}.
 +An obsolete macro used in the @file{yacc.c} skeleton, that you define
 +with @code{#define} in the prologue to request verbose, specific error
 +message strings when @code{yyerror} is called.  It doesn't matter what
 +definition you use for @code{YYERROR_VERBOSE}, just whether you define
 +it.  Using @samp{%define parse.error verbose} is preferred
 +(@pxref{Error Reporting, ,The Error Reporting Function @code{yyerror}}).
  @end deffn
  
  @deffn {Macro} YYINITDEPTH
diff --combined src/system.h
index f0a76ceb7eea1da964bcdec9de085c9f99ef50cd,d3c544b4720a36dea8a132feb3b407ab9293e7de..0d69e93e32a98c5f360ce1d90c52a88030b01001
     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
  
  #ifndef BISON_SYSTEM_H
 -# define BISON_SYSTEM_H
 +#define BISON_SYSTEM_H
  
  /* flex 2.5.31 gratutiously defines macros like INT8_MIN.  But this
     runs afoul of pre-C99 compilers that have <inttypes.h> or
     <stdint.h>, which are included below if available.  It also runs
     afoul of pre-C99 compilers that define these macros in <limits.h>.  */
 -# if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901
 -#  undef INT8_MIN
 -#  undef INT16_MIN
 -#  undef INT32_MIN
 -#  undef INT8_MAX
 -#  undef INT16_MAX
 -#  undef UINT8_MAX
 -#  undef INT32_MAX
 -#  undef UINT16_MAX
 -#  undef UINT32_MAX
 -# endif
 -
 -# include <limits.h>
 -# include <stddef.h>
 -# include <stdlib.h>
 -# include <string.h>
 -
 -# if HAVE_SYS_TYPES_H
 -#  include <sys/types.h>
 -# endif
 -
 -# include <unistd.h>
 -# include <inttypes.h>
 -
 -# ifndef UINTPTR_MAX
 +#if ! defined __STDC_VERSION__ || __STDC_VERSION__ < 199901
 +# undef INT8_MIN
 +# undef INT16_MIN
 +# undef INT32_MIN
 +# undef INT8_MAX
 +# undef INT16_MAX
 +# undef UINT8_MAX
 +# undef INT32_MAX
 +# undef UINT16_MAX
 +# undef UINT32_MAX
 +#endif
 +
 +#include <limits.h>
 +#include <stddef.h>
 +#include <stdlib.h>
 +#include <string.h>
 +
 +#define STREQ(L, R)  (strcmp(L, R) == 0)
 +#define STRNEQ(L, R) (!STREQ(L, R))
 +
 +/* Just like strncmp, but the second argument must be a literal string
 +   and you don't specify the length.  */
 +#define STRNCMP_LIT(S, Literal)                         \
 +  strncmp (S, "" Literal "", sizeof (Literal) - 1)
 +
 +/* Whether Literal is a prefix of S.  */
 +#define STRPREFIX_LIT(Literal, S)               \
 +  (STRNCMP_LIT (S, Literal) == 0)
 +
 +#if HAVE_SYS_TYPES_H
 +# include <sys/types.h>
 +#endif
 +
 +#include <unistd.h>
 +#include <inttypes.h>
 +
 +#ifndef UINTPTR_MAX
  /* This isn't perfect, but it's good enough for Bison, which needs
     only to hash pointers.  */
  typedef size_t uintptr_t;
 -# endif
 +#endif
  
  // Version mismatch.
 -# define EX_MISMATCH 63
 +#define EX_MISMATCH 63
  
  /*---------.
  | Gnulib.  |
  `---------*/
  
 -# include <unlocked-io.h>
 -# include <verify.h>
 -# include <xalloc.h>
 +#include <unlocked-io.h>
 +#include <verify.h>
 +#include <xalloc.h>
  
  
  /*-----------------.
     and safer logic than it would for users.  Due to the overhead of M4,
     suppressing Code is unlikely to offer any significant improvement in
     Bison's performance anyway.  */
 -# define PACIFY_CC(Code) Code
 +#define PACIFY_CC(Code) Code
  
 -# ifndef __attribute__
 +#ifndef __attribute__
  /* This feature is available in gcc versions 2.5 and later.  */
 -#  if (! defined __GNUC__ || __GNUC__ < 2 \
 +# if (! defined __GNUC__ || __GNUC__ < 2 \
-       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__)
+        || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
 -#   define __attribute__(Spec) /* empty */
 -#  endif
 +#  define __attribute__(Spec) /* empty */
  # endif
 +#endif
  
  /* The __-protected variants of `format' and `printf' attributes
     are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
 -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
 -#  define __format__ format
 -#  define __printf__ printf
 -# endif
 +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
 +# define __format__ format
 +# define __printf__ printf
 +#endif
  
 -# ifndef ATTRIBUTE_NORETURN
 -#  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
 -# endif
 +#ifndef ATTRIBUTE_NORETURN
 +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
 +#endif
  
 -# ifndef ATTRIBUTE_UNUSED
 -#  define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
 -# endif
 +#ifndef ATTRIBUTE_UNUSED
 +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
 +#endif
  
 -# define FUNCTION_PRINT() fprintf (stderr, "%s: ", __func__)
 +#define FUNCTION_PRINT() fprintf (stderr, "%s: ", __func__)
  
  /*------.
  | NLS.  |
  `------*/
  
 -# include <locale.h>
 +#include <locale.h>
  
 -# include <gettext.h>
 -# define _(Msgid)  gettext (Msgid)
 -# define N_(Msgid) (Msgid)
 +#include <gettext.h>
 +#define _(Msgid)  gettext (Msgid)
 +#define N_(Msgid) (Msgid)
  
  
  /*-----------.
  | Booleans.  |
  `-----------*/
  
 -# include <stdbool.h>
 +#include <stdbool.h>
  
  
  
     For now, we use assert but we call it aver throughout Bison in case
     we later wish to try another scheme.
  */
 -# include <assert.h>
 -# define aver assert
 +#include <assert.h>
 +#define aver assert
  
  
  /*-----------.
  | Obstacks.  |
  `-----------*/
  
 -# define obstack_chunk_alloc xmalloc
 -# define obstack_chunk_free  free
 -# include <obstack.h>
 +#define obstack_chunk_alloc xmalloc
 +#define obstack_chunk_free  free
 +#include <obstack.h>
  
 -# define obstack_sgrow(Obs, Str) \
 +#define obstack_sgrow(Obs, Str) \
    obstack_grow (Obs, Str, strlen (Str))
  
 -# define obstack_fgrow1(Obs, Format, Arg1)    \
 -do {                                          \
 -  char buf[4096];                             \
 -  sprintf (buf, Format, Arg1);                        \
 -  obstack_grow (Obs, buf, strlen (buf));      \
 +#define obstack_fgrow1(Obs, Format, Arg1)       \
 +do {                                            \
 +  char buf[4096];                               \
 +  sprintf (buf, Format, Arg1);                  \
 +  obstack_grow (Obs, buf, strlen (buf));        \
  } while (0)
  
 -# define obstack_fgrow2(Obs, Format, Arg1, Arg2)      \
 -do {                                          \
 -  char buf[4096];                             \
 -  sprintf (buf, Format, Arg1, Arg2);          \
 -  obstack_grow (Obs, buf, strlen (buf));      \
 +#define obstack_fgrow2(Obs, Format, Arg1, Arg2) \
 +do {                                            \
 +  char buf[4096];                               \
 +  sprintf (buf, Format, Arg1, Arg2);            \
 +  obstack_grow (Obs, buf, strlen (buf));        \
  } while (0)
  
 -# define obstack_fgrow3(Obs, Format, Arg1, Arg2, Arg3)        \
 -do {                                                  \
 -  char buf[4096];                                     \
 -  sprintf (buf, Format, Arg1, Arg2, Arg3);            \
 -  obstack_grow (Obs, buf, strlen (buf));              \
 +#define obstack_fgrow3(Obs, Format, Arg1, Arg2, Arg3)   \
 +do {                                                    \
 +  char buf[4096];                                       \
 +  sprintf (buf, Format, Arg1, Arg2, Arg3);              \
 +  obstack_grow (Obs, buf, strlen (buf));                \
  } while (0)
  
 -# define obstack_fgrow4(Obs, Format, Arg1, Arg2, Arg3, Arg4)  \
 -do {                                                          \
 -  char buf[4096];                                             \
 -  sprintf (buf, Format, Arg1, Arg2, Arg3, Arg4);              \
 -  obstack_grow (Obs, buf, strlen (buf));                      \
 +#define obstack_fgrow4(Obs, Format, Arg1, Arg2, Arg3, Arg4)     \
 +do {                                                            \
 +  char buf[4096];                                               \
 +  sprintf (buf, Format, Arg1, Arg2, Arg3, Arg4);                \
 +  obstack_grow (Obs, buf, strlen (buf));                        \
  } while (0)
  
  
  | Extensions to use for the output files.  |
  `-----------------------------------------*/
  
 -# ifndef OUTPUT_EXT
 -#  define OUTPUT_EXT ".output"
 -# endif
 +#ifndef OUTPUT_EXT
 +# define OUTPUT_EXT ".output"
 +#endif
  
 -# ifndef TAB_EXT
 -#  define TAB_EXT ".tab"
 -# endif
 +#ifndef TAB_EXT
 +# define TAB_EXT ".tab"
 +#endif
  
 -# ifndef DEFAULT_TMPDIR
 -#  define DEFAULT_TMPDIR "/tmp"
 -# endif
 +#ifndef DEFAULT_TMPDIR
 +# define DEFAULT_TMPDIR "/tmp"
 +#endif
  
  
  
  | Free a linked list.  |
  `---------------------*/
  
 -# define LIST_FREE(Type, List)                        \
 -do {                                          \
 -  Type *_node, *_next;                                \
 -  for (_node = List; _node; _node = _next)    \
 -    {                                         \
 -      _next = _node->next;                    \
 -      free (_node);                           \
 -    }                                         \
 +#define LIST_FREE(Type, List)                   \
 +do {                                            \
 +  Type *_node, *_next;                          \
 +  for (_node = List; _node; _node = _next)      \
 +    {                                           \
 +      _next = _node->next;                      \
 +      free (_node);                             \
 +    }                                           \
  } while (0)
  
  
diff --combined tests/actions.at
index b49d94320ce90f0d98c5404fd6b32fd557afd0f7,bb2201dbea42663fc1d2fcf7b5705a8f9a7a552c..7f8250293582791abb48408a07bfdc36f0a5ecd0
@@@ -29,7 -29,7 +29,7 @@@ AT_SETUP([Mid-rule actions]
  # action.
  
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %{
  # include <stdio.h>
@@@ -93,7 -93,7 +93,7 @@@ AT_CLEANU
  AT_SETUP([Exotic Dollars])
  
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %{
  # include <stdio.h>
@@@ -298,11 -298,11 +298,11 @@@ input
        printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$));
      }
  | line input /* Right recursive to load the stack so that popping at
 -              END can be exercised.  */
 +                END can be exercised.  */
      {
        $$ = 2;
        printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n",
 -            $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
 +              $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2));
      }
  ;
  
@@@ -345,7 -345,7 +345,7 @@@ thing
  ;
  %%
  /* Alias to ARGV[1]. */
- const char *source = 0;
+ const char *source = YY_NULL;
  
  static int
  yylex (]AT_LEX_FORMALS[)
@@@ -603,7 -603,7 +603,7 @@@ m4_define([AT_CHECK_PRINTER_AND_DESTRUC
  
  $3
  _AT_CHECK_PRINTER_AND_DESTRUCTOR($[1], $[2], $[3], $[4],
 -[%error-verbose
 +[%define parse.error verbose
  %debug
  %verbose
  %locations
@@@ -634,7 -634,7 +634,7 @@@ AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-p
  AT_SETUP([Default tagless %printer and %destructor])
  
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %locations
  %initial-action {
@@@ -752,7 -752,7 +752,7 @@@ AT_CLEANU
  AT_SETUP([Default tagged and per-type %printer and %destructor])
  
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  
  %{
@@@ -896,7 -896,7 +896,7 @@@ m4_define([_AT_CHECK_DEFAULT_PRINTER_AN
    [m4_pushdef([kind], [*]) m4_pushdef([not_kind], [])])
  
  AT_DATA_GRAMMAR([[input]]$1[[.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %locations
  %initial-action {
@@@ -1363,37 -1363,37 +1363,37 @@@ AT_DATA([input.y]
  start: test2 test1 test0 testc;
  
  test2
 -: 'a' { semi;                 /* TEST:N:2 */ }
 -| 'b' { if (0) {no_semi}      /* TEST:N:2 */ }
 -| 'c' { if (0) {semi;}                /* TEST:N:2 */ }
 -| 'd' { semi;   no_semi               /* TEST:Y:2 */ }
 -| 'e' { semi(); no_semi()     /* TEST:Y:2 */ }
 -| 'f' { semi[]; no_semi[]     /* TEST:Y:2 */ }
 -| 'g' { semi++; no_semi++     /* TEST:Y:2 */ }
 -| 'h' { {no_semi} no_semi     /* TEST:Y:2 */ }
 -| 'i' { {semi;}   no_semi     /* TEST:Y:2 */ }
 +: 'a' { semi;                   /* TEST:N:2 */ }
 +| 'b' { if (0) {no_semi}        /* TEST:N:2 */ }
 +| 'c' { if (0) {semi;}          /* TEST:N:2 */ }
 +| 'd' { semi;   no_semi         /* TEST:Y:2 */ }
 +| 'e' { semi(); no_semi()       /* TEST:Y:2 */ }
 +| 'f' { semi[]; no_semi[]       /* TEST:Y:2 */ }
 +| 'g' { semi++; no_semi++       /* TEST:Y:2 */ }
 +| 'h' { {no_semi} no_semi       /* TEST:Y:2 */ }
 +| 'i' { {semi;}   no_semi       /* TEST:Y:2 */ }
  ;
  test1
 -  : 'a' { semi;                       // TEST:N:1 ;
 -} | 'b' { if (0) {no_semi}    // TEST:N:1 ;
 -} | 'c' { if (0) {semi;}      // TEST:N:1 ;
 -} | 'd' { semi;   no_semi     // TEST:Y:1 ;
 -} | 'e' { semi(); no_semi()   // TEST:Y:1 ;
 -} | 'f' { semi[]; no_semi[]   // TEST:Y:1 ;
 -} | 'g' { semi++; no_semi++   // TEST:Y:1 ;
 -} | 'h' { {no_semi} no_semi   // TEST:Y:1 ;
 -} | 'i' { {semi;}   no_semi   // TEST:Y:1 ;
 +  : 'a' { semi;                 // TEST:N:1 ;
 +} | 'b' { if (0) {no_semi}      // TEST:N:1 ;
 +} | 'c' { if (0) {semi;}        // TEST:N:1 ;
 +} | 'd' { semi;   no_semi       // TEST:Y:1 ;
 +} | 'e' { semi(); no_semi()     // TEST:Y:1 ;
 +} | 'f' { semi[]; no_semi[]     // TEST:Y:1 ;
 +} | 'g' { semi++; no_semi++     // TEST:Y:1 ;
 +} | 'h' { {no_semi} no_semi     // TEST:Y:1 ;
 +} | 'i' { {semi;}   no_semi     // TEST:Y:1 ;
  } ;
  test0
 -  : 'a' { semi;                       // TEST:N:1 {}
 -} | 'b' { if (0) {no_semi}    // TEST:N:1 {}
 -} | 'c' { if (0) {semi;}      // TEST:N:1 {}
 -} | 'd' { semi;   no_semi     // TEST:Y:1 {}
 -} | 'e' { semi(); no_semi()   // TEST:Y:1 {}
 -} | 'f' { semi[]; no_semi[]   // TEST:Y:1 {}
 -} | 'g' { semi++; no_semi++   // TEST:Y:1 {}
 -} | 'h' { {no_semi} no_semi   // TEST:Y:1 {}
 -} | 'i' { {semi;}   no_semi   // TEST:Y:1 {}
 +  : 'a' { semi;                 // TEST:N:1 {}
 +} | 'b' { if (0) {no_semi}      // TEST:N:1 {}
 +} | 'c' { if (0) {semi;}        // TEST:N:1 {}
 +} | 'd' { semi;   no_semi       // TEST:Y:1 {}
 +} | 'e' { semi(); no_semi()     // TEST:Y:1 {}
 +} | 'f' { semi[]; no_semi[]     // TEST:Y:1 {}
 +} | 'g' { semi++; no_semi++     // TEST:Y:1 {}
 +} | 'h' { {no_semi} no_semi     // TEST:Y:1 {}
 +} | 'i' { {semi;}   no_semi     // TEST:Y:1 {}
  } ;
  
  testc
diff --combined tests/atlocal.in
index 0b888d16c553c1e968865434e6737cb5af6f68cb,72a9bf75068a40640701bca284d9c2283aaae093..7e4f2e28b5c44dc0dc18e93fb531f173b12c3f64
@@@ -1,4 -1,4 +1,4 @@@
 -# @configure_input@                                   -*- shell-script -*-
 +# @configure_input@                                     -*- shell-script -*-
  # Configurable variable values for Bison test suite.
  
  # Copyright (C) 2000-2012 Free Software Foundation, Inc.
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
- # We need a C compiler.
+ # We need `config.h'.
+ CPPFLAGS="-I$abs_top_builddir/lib @CPPFLAGS@"
+ ## ------------------- ##
+ ## C/C++ Compilation.  ##
+ ## ------------------- ##
  : ${CC='@CC@'}
+ : ${CXX='@CXX@'}
+ # Is the compiler GCC?
+ GCC='@GCC@'
  
  # We want no optimization.
- CFLAGS='@O0CFLAGS@ @WARN_CFLAGS_TEST@ @WERROR_CFLAGS@'
+   O0CFLAGS=`echo '@CFLAGS@'   | sed 's/-O[0-9] *//'`
+ O0CXXFLAGS=`echo '@CXXFLAGS@' | sed 's/-O[0-9] *//'`
  
  # Sometimes a test group needs to ignore gcc warnings, so it locally
  # sets CFLAGS to this.
- NO_WERROR_CFLAGS='@O0CFLAGS@ @WARN_CFLAGS_TEST@'
- # We need `config.h'.
- CPPFLAGS="-I$abs_top_builddir/lib @CPPFLAGS@"
+   NO_WERROR_CFLAGS="$O0CFLAGS   @WARN_CFLAGS@   @WARN_CFLAGS_TEST@"
+ NO_WERROR_CXXFLAGS="$O0CXXFLAGS @WARN_CXXFLAGS@ @WARN_CXXFLAGS_TEST@"
  
- # Is the compiler GCC?
- GCC='@GCC@'
- # The C++ compiler.
- : ${CXX='@CXX@'}
+ # But most of the time, we want -Werror.
+   CFLAGS="$NO_WERROR_CFLAGS   @WERROR_CFLAGS@"
+ CXXFLAGS="$NO_WERROR_CXXFLAGS @WERROR_CXXFLAGS@"
  
  # If 'exit 77'; skip all C++ tests; otherwise ':'.
  BISON_CXX_WORKS='@BISON_CXX_WORKS@'
  
- # We want no optimization with C++, too.
- CXXFLAGS='@O0CXXFLAGS@ @WARN_CXXFLAGS_TEST@ @WERROR_CFLAGS@'
+ # Handle --compile-c-with-cxx here, once CXX and CXXFLAGS are known.
+ if "$at_arg_compile_c_with_cxx"; then
+   CC=$CXX
+   O0CFLAGS=$O0CXXFLAGS
+   NO_WERROR_CFLAGS=$NO_WERROR_CXXFLAGS
+   CFLAGS=$CXXFLAGS
+ fi
+ ## ------- ##
+ ## Other.  ##
+ ## ------- ##
  
  # Are special link options needed?
  LDFLAGS='@LDFLAGS@'
@@@ -62,10 -79,3 +79,10 @@@ CONF_JAVA='@CONF_JAVA@
  # Use simple quotes (lib/quote.c).
  LC_CTYPE=C
  export LC_CTYPE
 +
 +
 +# Handle --compile-c-with-cxx here, once CXX and CXXFLAGS are known.
 +if "$at_arg_compile_c_with_cxx"; then
 +  CC=$CXX
 +  CFLAGS=$CXXFLAGS
 +fi
diff --combined tests/calc.at
index 28e6c50e8a08d02b54d1cdae54f7e57a13d02476,c50400836a5ad684ce0443db4643ac877a0aec2f..477c92d3759f5fe90bb5784c645498db6c796156
@@@ -137,12 -137,12 +137,12 @@@ in
      {
        unget_char (]AT_LEX_PRE_ARGS[ c);
        ]AT_VAL[.ival = read_signed_integer (]AT_LEX_ARGS[);
 -      return NUM;
 +      return ]AT_TOKEN_PREFIX[NUM;
      }
  
    /* Return end-of-file.  */
    if (c == EOF)
 -    return CALC_EOF;
 +    return ]AT_TOKEN_PREFIX[CALC_EOF;
  
    /* Return single chars. */
    return c;
@@@ -234,27 -234,27 +234,27 @@@ static void yyerror (AT_YYERROR_ARG_LOC
  int yylex (]AT_LEX_FORMALS[);
  }
  
 -]AT_SKEL_CC_IF([AT_LOCATION_TYPE_IF([], [
 +]AT_SKEL_CC_IF([AT_LOCATION_IF([AT_LOCATION_TYPE_IF([], [
  /* The lalr1.cc skeleton, for backward compatibility, defines
     a constructor for position that initializes the filename.  The
     glr.cc skeleton does not (and in fact cannot: location/position
     are stored in a union, from which objects with constructors are
 -   excluded in C++. */
 +   excluded in C++). */
  %initial-action {
-   @$.initialize (0);
+   @$.initialize ();
  }
 -])])[
 +])])])[
  
  /* Bison Declarations */
  %token CALC_EOF 0 "end of input"
  %token <ival> NUM "number"
  %type  <ival> exp
  
 -%nonassoc '=' /* comparison          */
 +%nonassoc '='   /* comparison          */
  %left '-' '+'
  %left '*' '/'
 -%left NEG     /* negation--unary minus */
 -%right '^'    /* exponentiation        */
 +%precedence NEG /* negation--unary minus */
 +%right '^'      /* exponentiation        */
  
  /* Grammar follows */
  %%
@@@ -305,8 -305,9 +305,8 @@@ exp
  
  /* A C++ error reporting function.  */
  void
 -AT_NAME_PREFIX::parser::error (const location_type& l, const std::string& m)
 +AT_NAME_PREFIX::parser::error (AT_LOCATION_IF([const location_type& l, ])const std::string& m)
  {
 -  (void) l;
    std::cerr << AT_LOCATION_IF([l << ": " << ])m << std::endl;
  }
  
@@@ -333,10 -334,10 +333,10 @@@ AT_YYERROR_SEES_LOC_IF(
             AT_LOC_FIRST_LINE, AT_LOC_FIRST_COLUMN);
    if (AT_LOC_FIRST_LINE != AT_LOC_LAST_LINE)
      fprintf (stderr, "-%d.%d",
 -           AT_LOC_LAST_LINE,  AT_LOC_LAST_COLUMN - 1);
 +             AT_LOC_LAST_LINE,  AT_LOC_LAST_COLUMN - 1);
    else if (AT_LOC_FIRST_COLUMN != AT_LOC_LAST_COLUMN - 1)
      fprintf (stderr, "-%d",
 -           AT_LOC_LAST_COLUMN - 1);
 +             AT_LOC_LAST_COLUMN - 1);
    fprintf (stderr, ": ");])
    fprintf (stderr, "%s\n", s);
  }])[
@@@ -442,7 -443,7 +442,7 @@@ AT_PARSER_CHECK([./calc input], 0, [], 
  # If BISON-OPTIONS contains `%location', then make sure the ERROR-LOCATION
  # is correctly output on stderr.
  #
 -# If BISON-OPTIONS contains `%error-verbose', then make sure the
 +# If BISON-OPTIONS contains `%define parse.error verbose', then make sure the
  # IF-YYERROR-VERBOSE message is properly output after `syntax error, '
  # on STDERR.
  #
@@@ -484,7 -485,7 +484,7 @@@ AT_YYERROR_SEES_LOC_IF([]
  [[sed 's/^[-0-9.]*: //' expout >at-expout
  mv at-expout expout]])
  # 4. If error-verbose is not used, strip the`, unexpected....' part.
 -m4_bmatch([$1], [%error-verbose], [],
 +m4_bmatch([$1], [%define parse.error verbose], [],
  [[sed 's/syntax error, .*$/syntax error/' expout >at-expout
  mv at-expout expout]])
  # 5. Check
@@@ -614,22 -615,21 +614,22 @@@ AT_CHECK_CALC_LALR([%locations]
  AT_CHECK_CALC_LALR([%name-prefix="calc"]) dnl test deprecated `='
  AT_CHECK_CALC_LALR([%verbose])
  AT_CHECK_CALC_LALR([%yacc])
 -AT_CHECK_CALC_LALR([%error-verbose])
 +AT_CHECK_CALC_LALR([%define parse.error verbose])
  
  AT_CHECK_CALC_LALR([%define api.pure %locations])
  AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure %locations])
 -AT_CHECK_CALC_LALR([%error-verbose %locations])
 +AT_CHECK_CALC_LALR([%define parse.error verbose %locations])
  
 -AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR([%define parse.error verbose %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR([%define parse.error verbose %locations %defines %name-prefix "calc" %define api.tokens.prefix "TOK_" %verbose %yacc])
  
  AT_CHECK_CALC_LALR([%debug])
 -AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR([%define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
  
 -AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 -AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
  
 -AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
 +AT_CHECK_CALC_LALR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
  
  
  # ----------------------- #
@@@ -653,20 -653,19 +653,20 @@@ AT_CHECK_CALC_GLR([%locations]
  AT_CHECK_CALC_GLR([%name-prefix "calc"])
  AT_CHECK_CALC_GLR([%verbose])
  AT_CHECK_CALC_GLR([%yacc])
 -AT_CHECK_CALC_GLR([%error-verbose])
 +AT_CHECK_CALC_GLR([%define parse.error verbose])
  
  AT_CHECK_CALC_GLR([%define api.pure %locations])
 -AT_CHECK_CALC_GLR([%error-verbose %locations])
 +AT_CHECK_CALC_GLR([%define parse.error verbose %locations])
  
 -AT_CHECK_CALC_GLR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR([%define parse.error verbose %locations %defines %name-prefix "calc" %verbose %yacc])
  
  AT_CHECK_CALC_GLR([%debug])
 -AT_CHECK_CALC_GLR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %defines %name-prefix "calc" %define api.tokens.prefix "TOK_" %verbose %yacc])
  
 -AT_CHECK_CALC_GLR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
  
 -AT_CHECK_CALC_GLR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
 +AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
  
  
  # ----------------------------- #
@@@ -683,19 -682,16 +683,19 @@@ AT_CHECK_CALC([%skeleton "lalr1.cc" %de
  # Start a testing chunk which compiles `calc' grammar with
  # the C++ skeleton, and performs several tests over the parser.
  m4_define([AT_CHECK_CALC_LALR1_CC],
 -[AT_CHECK_CALC([%language "C++" %defines %locations] $@)])
 +[AT_CHECK_CALC([%language "C++" %defines] $@)])
  
  AT_CHECK_CALC_LALR1_CC([])
 -AT_CHECK_CALC_LALR1_CC([%define location_type Span])
 -AT_CHECK_CALC_LALR1_CC([%error-verbose %name-prefix "calc" %verbose %yacc])
 -AT_CHECK_CALC_LALR1_CC([%error-verbose %debug %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR1_CC([%locations])
 +AT_CHECK_CALC_LALR1_CC([%locations %define location_type Span])
 +AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %name-prefix "calc" %verbose %yacc])
  
 -AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc])
  
 -AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
 +AT_CHECK_CALC_LALR1_CC([%locations %pure-parser %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_LALR1_CC([%locations %pure-parser %define parse.error verbose %debug %name-prefix "calc" %define api.tokens.prefix "TOK_" %verbose %yacc])
 +
 +AT_CHECK_CALC_LALR1_CC([%locations %pure-parser %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
  
  
  
@@@ -717,12 -713,11 +717,12 @@@ m4_define([AT_CHECK_CALC_GLR_CC]
  
  AT_CHECK_CALC_GLR_CC([])
  AT_CHECK_CALC_GLR_CC([%define location_type Span])
 -AT_CHECK_CALC_GLR_CC([%error-verbose %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR_CC([%define parse.error verbose %name-prefix "calc" %verbose %yacc])
  
  AT_CHECK_CALC_GLR_CC([%debug])
 -AT_CHECK_CALC_GLR_CC([%error-verbose %debug %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %verbose %yacc])
  
 -AT_CHECK_CALC_GLR_CC([%pure-parser %error-verbose %debug %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR_CC([%pure-parser %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc])
 +AT_CHECK_CALC_GLR_CC([%pure-parser %define parse.error verbose %debug %name-prefix "calc" %define api.tokens.prefix "TOK_" %verbose %yacc])
  
 -AT_CHECK_CALC_GLR_CC([%pure-parser %error-verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
 +AT_CHECK_CALC_GLR_CC([%pure-parser %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
diff --combined tests/java.at
index b3e79e9c2aef8fa9a474f4294d0362f3898682ce,b9e9deeef744d4f509440ee04c68edb0ef1379bd..b6ea163610618df73a408b1926350c637140c996
@@@ -24,7 -24,7 +24,7 @@@ AT_BANNER([[Java Calculator.]]
  
  
  # _AT_DATA_JAVA_CALC_Y($1, $2, $3, [BISON-DIRECTIVES])
 -# ----------------------------------------------------------------------
 +# ----------------------------------------------------
  # Produce `calc.y'.  Don't call this macro directly, because it contains
  # some occurrences of `$1' etc. which will be interpreted by m4.  So
  # you should call it with $1, $2, and $3 as arguments, which is what
@@@ -148,7 -148,7 +148,7 @@@ AT_LOCATION_IF([
      ]AT_LOCATION_IF([[yypos = new Position (yypos.lineno (),
                                              yypos.token () + 1);]])[
      if (ttype == st.TT_EOF)
 -      return Calc.EOF;
 +      return EOF;
  
      else if (ttype == st.TT_EOL)
        {
      else if (ttype == st.TT_WORD)
        {
          yylval = new Integer (st.sval);
 -        return Calc.NUM;
 +        return NUM;
        }
  
      else
@@@ -215,7 -215,7 +215,7 @@@ class Position 
  
  
  # AT_DATA_CALC_Y([BISON-OPTIONS])
 -# -------------------------------------------------
 +# -------------------------------
  # Produce `calc.y'.
  m4_define([AT_DATA_JAVA_CALC_Y],
  [_AT_DATA_JAVA_CALC_Y($[1], $[2], $[3], [$1])
@@@ -259,7 -259,7 +259,7 @@@ AT_CHECK([cat stderr], 0, [expout]
  ])
  
  # _AT_CHECK_JAVA_CALC([BISON-DIRECTIVES], [BISON-CODE])
 -# -----------------------------------------------------------------------
 +# -----------------------------------------------------
  # Start a testing chunk which compiles `calc' grammar with
  # BISON-DIRECTIVES, and performs several tests over the parser.
  m4_define([_AT_CHECK_JAVA_CALC],
@@@ -351,7 -351,7 +351,7 @@@ AT_CLEANU
  
  
  # AT_CHECK_JAVA_CALC([BISON-DIRECTIVES])
 -# --------------------------------------------------------
 +# --------------------------------------
  # Start a testing chunk which compiles `calc' grammar with
  # BISON-DIRECTIVES, and performs several tests over the parser.
  # Run the test with and without %error-verbose.
@@@ -404,10 -404,9 +404,10 @@@ AT_DATA([[YYParser.y]], 
  %debug
  %error-verbose
  %token-table
 +%token END "end"
  $1
  %%
 -start: "end" {$2};
 +start: END {$2};
  %%
  class m4_default([$3], [Position]) {}
  ])
@@@ -454,14 -453,14 +454,14 @@@ m4_define([AT_CHECK_JAVA_MINIMAL_W_LEXE
  # Check that YYParser.java contains exactly COUNT lines matching ^LINE$
  # with grep.
  m4_define([AT_CHECK_JAVA_GREP],
 -      [AT_CHECK([grep -c '^$1$' YYParser.java], [], [m4_default([$2], [1])
 +        [AT_CHECK([grep -c '^$1$' YYParser.java], [], [m4_default([$2], [1])
  ])
  ])
  
  
 -# ----------------------------------- #
 -# Java parser class and package names #
 -# ----------------------------------- #
 +# ------------------------------------- #
 +# Java parser class and package names #
 +# ------------------------------------- #
  
  AT_SETUP([Java parser class and package names])
  
@@@ -471,9 -470,6 +471,9 @@@ AT_CHECK_JAVA_GREP([[class YYParser]]
  AT_CHECK_JAVA_MINIMAL([[%name-prefix "Prefix"]])
  AT_CHECK_JAVA_GREP([[class PrefixParser]])
  
 +AT_CHECK_JAVA_MINIMAL([[%define api.tokens.prefix "TOK_"]])
 +AT_CHECK_JAVA_GREP([[.*TOK_END.*]])
 +
  AT_CHECK_JAVA_MINIMAL([[%define parser_class_name "ParserClassName"]])
  AT_CHECK_JAVA_GREP([[class ParserClassName]])
  
@@@ -483,9 -479,9 +483,9 @@@ AT_CHECK_JAVA_GREP([[package user_java_
  AT_CLEANUP
  
  
 -# --------------------------- #
 -# Java parser class modifiers #
 -# --------------------------- #
 +# ----------------------------- #
 +# Java parser class modifiers #
 +# ----------------------------- #
  
  AT_SETUP([Java parser class modifiers])
  
@@@ -538,12 -534,6 +538,12 @@@ AT_CHECK_JAVA_MINIMAL([
  %define strictfp]])
  AT_CHECK_JAVA_GREP([[public final strictfp class YYParser]])
  
 +# FIXME: Can't do a Java compile because javacomp.sh is configured for 1.3
 +AT_CHECK_JAVA_MINIMAL([[
 +%define annotations "/*@Deprecated @SupressWarnings(\"unchecked\") @SupressWarnings({\"unchecked\", \"deprecation\"}) @SupressWarnings(value={\"unchecked\", \"deprecation\"})*/"
 +%define public]])
 +AT_CHECK_JAVA_GREP([[/\*@Deprecated @SupressWarnings("unchecked") @SupressWarnings({"unchecked", "deprecation"}) @SupressWarnings(value={"unchecked", "deprecation"})\*/ public class YYParser]])
 +
  AT_CLEANUP
  
  
@@@ -574,54 -564,54 +574,54 @@@ AT_CLEANU
  AT_SETUP([Java %parse-param and %lex-param])
  
  AT_CHECK_JAVA_MINIMAL([])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer) {]])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer) *]])
  
  AT_CHECK_JAVA_MINIMAL([[%parse-param {int parse_param1}]])
  AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer, *int parse_param1) {]])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param1 = parse_param1;]])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer, *int parse_param1) *]])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]])
  
  AT_CHECK_JAVA_MINIMAL([[
  %parse-param {int parse_param1}
  %parse-param {long parse_param2}]])
  AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
  AT_CHECK_JAVA_GREP([[ *protected final long parse_param2;]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) {]])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param1 = parse_param1;]])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param2 = parse_param2;]])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) *]])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param2 = parse_param2;]])
  
  AT_CHECK_JAVA_MINIMAL_W_LEXER([], [], [[return EOF;]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser () {]])
 -AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer) {]])
 +AT_CHECK_JAVA_GREP([[ *public YYParser () *]])
 +AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer) *]])
  
  AT_CHECK_JAVA_MINIMAL_W_LEXER([[%parse-param {int parse_param1}]],
 -      [], [[return EOF;]])
 +    [], [[return EOF;]])
  AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (int parse_param1) {]])
 -AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1) {]])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param1 = parse_param1;]], [2])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (int parse_param1) *]])
 +AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1) *]])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]], [2])
  
  AT_CHECK_JAVA_MINIMAL_W_LEXER([[
  %parse-param {int parse_param1}
  %parse-param {long parse_param2}]],
 -      [], [[return EOF;]])
 +    [], [[return EOF;]])
  AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
  AT_CHECK_JAVA_GREP([[ *protected final long parse_param2;]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (int parse_param1, *long parse_param2) {]])
 -AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) {]])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param1 = parse_param1;]], [2])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param2 = parse_param2;]], [2])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (int parse_param1, *long parse_param2) *]])
 +AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) *]])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]], [2])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param2 = parse_param2;]], [2])
  
  AT_CHECK_JAVA_MINIMAL_W_LEXER([[%lex-param {char lex_param1}]],
 -      [], [[return EOF;]], [[YYLexer (char lex_param1) {}]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1) {]])
 +    [], [[return EOF;]], [[YYLexer (char lex_param1) {}]])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1) *]])
  AT_CHECK_JAVA_GREP([[.* = new YYLexer *(lex_param1);]])
  
  AT_CHECK_JAVA_MINIMAL_W_LEXER([[
  %lex-param {char lex_param1}
  %lex-param {short lex_param2}]],
 -      [], [[return EOF;]], [[YYLexer (char lex_param1, short lex_param2) {}]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1, *short lex_param2) {]])
 +    [], [[return EOF;]], [[YYLexer (char lex_param1, short lex_param2) {}]])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1, *short lex_param2) *]])
  AT_CHECK_JAVA_GREP([[.* = new YYLexer *(lex_param1, *lex_param2);]])
  
  AT_CHECK_JAVA_MINIMAL_W_LEXER([[
  %parse-param {long parse_param2}
  %lex-param {char lex_param1}
  %lex-param {short lex_param2}]],
 -      [], [[return EOF;]], [[YYLexer (char lex_param1, short lex_param2) {}]])
 +    [], [[return EOF;]], [[YYLexer (char lex_param1, short lex_param2) {}]])
  AT_CHECK_JAVA_GREP([[ *protected final int parse_param1;]])
  AT_CHECK_JAVA_GREP([[ *protected final long parse_param2;]])
 -AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1, *short lex_param2, *int parse_param1, *long parse_param2) {]])
 +AT_CHECK_JAVA_GREP([[ *public YYParser (char lex_param1, *short lex_param2, *int parse_param1, *long parse_param2) *]])
  AT_CHECK_JAVA_GREP([[.* = new YYLexer *(lex_param1, *lex_param2);]])
 -AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) {]])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param1 = parse_param1;]], [2])
 -AT_CHECK_JAVA_GREP([[[         ]*this.parse_param2 = parse_param2;]], [2])
 +AT_CHECK_JAVA_GREP([[ *protected YYParser (Lexer yylexer, *int parse_param1, *long parse_param2) *]])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param1 = parse_param1;]], [2])
 +AT_CHECK_JAVA_GREP([[ *this.parse_param2 = parse_param2;]], [2])
  
  AT_CLEANUP
  
  
  AT_SETUP([Java throws specifications])
  
 -# %define throws      - 0 1 2
 -# %define lex-throws  - 0 1 2
 -# %code lexer           0 1
 +# %define throws        - 0 1 2
 +# %define lex-throws    - 0 1 2
 +# %code lexer             0 1
  
  m4_define([AT_JT_lex_throws_define], [m4_case(AT_JT_lex_throws,
 -      -1, [],
 -       0, [[%define lex_throws ""]],
 -       1, [[%define lex_throws "InterruptedException"]],
 -       2, [[%define lex_throws "InterruptedException, IllegalAccessException"]])])
 +        -1, [],
 +         0, [[%define lex_throws ""]],
 +         1, [[%define lex_throws "InterruptedException"]],
 +         2, [[%define lex_throws "InterruptedException, IllegalAccessException"]])])
  
  m4_define([AT_JT_yylex_throws], [m4_case(AT_JT_lex_throws,
 -      -1, [[ throws java.io.IOException]],
 -       0, [],
 -       1, [[ throws InterruptedException]],
 -       2, [[ throws InterruptedException, IllegalAccessException]])])
 +        -1, [[ throws java.io.IOException]],
 +         0, [],
 +         1, [[ throws InterruptedException]],
 +         2, [[ throws InterruptedException, IllegalAccessException]])])
  
  m4_define([AT_JT_yylex_action], [m4_case(AT_JT_lex_throws,
 -      -1, [[throw new java.io.IOException();]],
 -       0, [[return EOF;]],
 -       1, [[throw new InterruptedException();]],
 -       2, [[throw new IllegalAccessException();]])])
 +        -1, [[throw new java.io.IOException();]],
 +         0, [[return EOF;]],
 +         1, [[throw new InterruptedException();]],
 +         2, [[throw new IllegalAccessException();]])])
  
  
  m4_define([AT_JT_throws_define], [m4_case(AT_JT_throws,
 -      -1, [],
 -       0, [[%define throws ""]],
 -       1, [[%define throws "ClassNotFoundException"]],
 -       2, [[%define throws "ClassNotFoundException, InstantiationException"]])])
 +        -1, [],
 +         0, [[%define throws ""]],
 +         1, [[%define throws "ClassNotFoundException"]],
 +         2, [[%define throws "ClassNotFoundException, InstantiationException"]])])
  
  m4_define([AT_JT_yyaction_throws], [m4_case(AT_JT_throws,
 -      -1, [],
 -       0, [],
 -       1, [[ throws ClassNotFoundException]],
 -       2, [[ throws ClassNotFoundException, InstantiationException]])])
 +        -1, [],
 +         0, [],
 +         1, [[ throws ClassNotFoundException]],
 +         2, [[ throws ClassNotFoundException, InstantiationException]])])
  
  m4_define([AT_JT_parse_throws_2], [m4_case(AT_JT_throws,
 -      -1, [],
 -       0, [],
 -       1, [[, ClassNotFoundException]],
 -       2, [[, ClassNotFoundException, InstantiationException]])])
 +        -1, [],
 +         0, [],
 +         1, [[, ClassNotFoundException]],
 +         2, [[, ClassNotFoundException, InstantiationException]])])
  
  m4_define([AT_JT_parse_throws],
 -      [m4_if(m4_quote(AT_JT_yylex_throws), [],
 -              [AT_JT_yyaction_throws],
 -              [AT_JT_yylex_throws[]AT_JT_parse_throws_2])])
 +        [m4_if(m4_quote(AT_JT_yylex_throws), [],
 +                [AT_JT_yyaction_throws],
 +                [AT_JT_yylex_throws[]AT_JT_parse_throws_2])])
  
  m4_define([AT_JT_initial_action], [m4_case(AT_JT_throws,
 -      -1, [],
 -       0, [],
 -       1, [[%initial-action {if (true) throw new ClassNotFoundException();}]],
 -       2, [[%initial-action {if (true) throw new InstantiationException();}]])])
 +        -1, [],
 +         0, [],
 +         1, [[%initial-action {if (true) throw new ClassNotFoundException();}]],
 +         2, [[%initial-action {if (true) throw new InstantiationException();}]])])
  
  m4_define([AT_JT_parse_action], [m4_case(AT_JT_throws,
 -      -1, [],
 -       0, [],
 -       1, [[throw new ClassNotFoundException();]],
 -       2, [[throw new ClassNotFoundException();]])])
 +        -1, [],
 +         0, [],
 +         1, [[throw new ClassNotFoundException();]],
 +         2, [[throw new ClassNotFoundException();]])])
  
  m4_for([AT_JT_lexer], 0, 1, 1,
    [m4_for([AT_JT_lex_throws], -1, 2, 1,
      [m4_for([AT_JT_throws], -1, 2, 1,
        [m4_if(AT_JT_lexer, 0,
 -      [AT_CHECK_JAVA_MINIMAL([
 +        [AT_CHECK_JAVA_MINIMAL([
  AT_JT_throws_define
  AT_JT_lex_throws_define
  AT_JT_initial_action],
  [AT_JT_parse_action])],
 -      [AT_CHECK_JAVA_MINIMAL_W_LEXER([
 +        [AT_CHECK_JAVA_MINIMAL_W_LEXER([
  AT_JT_throws_define
  AT_JT_lex_throws_define
  AT_JT_initial_action],
@@@ -730,28 -720,6 +730,28 @@@ AT_CHECK_JAVA_GREP([[ *public boolean p
  AT_CLEANUP
  
  
 +# ------------------------------------- #
 +# Java constructor init and init_throws #
 +# ------------------------------------- #
 +
 +AT_SETUP([Java constructor init and init_throws])
 +
 +AT_CHECK_JAVA_MINIMAL([[
 +%define extends "Thread"
 +%code init { super("Test Thread"); if (true) throw new InterruptedException(); }
 +%define init_throws "InterruptedException"
 +%lex-param {int lex_param}]])
 +AT_CHECK([[grep -q 'super("Test Thread"); if (true) throw new InterruptedException();' YYParser.java]])
 +
 +AT_CHECK_JAVA_MINIMAL_W_LEXER([[
 +%define extends "Thread"
 +%code init { super("Test Thread"); if (true) throw new InterruptedException(); }
 +%define init_throws "InterruptedException"]], [], [[return EOF;]])
 +AT_CHECK([[grep -q 'super("Test Thread"); if (true) throw new InterruptedException();' YYParser.java]])
 +
 +AT_CLEANUP
 +
 +
  # --------------------------------------------- #
  # Java stype, position_class and location_class #
  # --------------------------------------------- #
@@@ -781,3 -749,69 +781,69 @@@ AT_CHECK([[$EGREP -v ' */?\*' YYParser.
  AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep 'Location']], [1], [ignore])
  
  AT_CLEANUP
+ # ----------------------------------------------- #
+ # Java syntax error handling without error token. #
+ # ----------------------------------------------- #
+ AT_SETUP([Java syntax error handling without error token])
+ AT_DATA([[YYParser.y]], [[%language "Java"
+ %lex-param { String s }
+ %code imports {
+   import java.io.IOException;
+ }
+ %code lexer {
+   String Input;
+   int Position;
+   public YYLexer (String s)
+   {
+     Input    = s;
+     Position = 0;
+   }
+   public void yyerror (String s)
+   {
+     System.err.println (s);
+   }
+   public Object getLVal ()
+   {
+     return null;
+   }
+   public int yylex () throws IOException
+   {
+     if (Position >= Input.length ())
+       return EOF;
+     else
+       return Input.charAt (Position++);
+   }
+ }
+ %code {
+   public static void main (String args []) throws IOException
+   {
+     YYParser p = new YYParser (args [0]);
+     p.parse ();
+   }
+ }
+ %%
+ input:
+   'a' 'a'
+ ;
+ ]])
+ AT_BISON_CHECK([[YYParser.y]])
+ AT_JAVA_COMPILE([[YYParser.java]])
+ AT_JAVA_PARSER_CHECK([[YYParser aa]], [[0]], [[]], [[]])
+ AT_JAVA_PARSER_CHECK([[YYParser ab]], [[0]], [[]], [[syntax error
+ ]])
+ AT_JAVA_PARSER_CHECK([[YYParser ba]], [[0]], [[]], [[syntax error
+ ]])
+ AT_CLEANUP
diff --combined tests/regression.at
index 9aaedde0e8353274c9b7316d273db3f43ac6b8e4,584c541b4d796815a58070dfae3de700cdcaeb51..41a2939d182ec0d7d001f47f04397992159b389f
@@@ -532,7 -532,7 +532,7 @@@ AT_SETUP([Web2c Report]
  AT_KEYWORDS([report])
  
  AT_DATA([input.y],
 -[[%token      undef_id_tok const_id_tok
 +[[%token        undef_id_tok const_id_tok
  
  %start CONST_DEC_PART
  \f
@@@ -542,12 -542,12 +542,12 @@@ CONST_DEC_PART
          ;
  
  CONST_DEC_LIST:
 -        CONST_DEC
 +          CONST_DEC
          | CONST_DEC_LIST CONST_DEC
          ;
  
  CONST_DEC:
 -        { } undef_id_tok '=' const_id_tok ';'
 +          { } undef_id_tok '=' const_id_tok ';'
          ;
  %%
  ]])
@@@ -753,6 -753,15 +753,6 @@@ AT_CHECK([[cat tables.c]], 0
         2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
         5,     6
  };
 -static const yytype_uint8 yyprhs[] =
 -{
 -       0,     0,     3,     5,     6,     9,    14
 -};
 -static const yytype_int8 yyrhs[] =
 -{
 -       8,     0,    -1,     9,    -1,    -1,    10,    11,    -1,     3,
 -       4,     5,     8,    -1,     6,     8,    -1
 -};
  static const yytype_uint8 yyrline[] =
  {
         0,     2,     2,     3,     3,     4,     5
  static const char *const yytname[] =
  {
    "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
-   "\"else\"", "$accept", "statement", "struct_stat", "if", "else", 0
+   "\"else\"", "$accept", "statement", "struct_stat", "if", "else", YY_NULL
  };
  static const yytype_uint16 yytoknum[] =
  {
         0,   256,   257,   258,   259,   260,   261
  };
 -static const yytype_uint8 yyr1[] =
 -{
 -       0,     7,     8,     9,     9,    10,    11
 -};
 -static const yytype_uint8 yyr2[] =
 +static const yytype_int8 yypact[] =
  {
 -       0,     2,     1,     0,     2,     4,     2
 +      -2,    -1,     4,    -8,     0,     2,    -8,    -2,    -8,    -2,
 +      -8,    -8
  };
  static const yytype_uint8 yydefact[] =
  {
         3,     0,     0,     2,     0,     0,     1,     3,     4,     3,
         6,     5
  };
 -static const yytype_int8 yydefgoto[] =
 -{
 -      -1,     2,     3,     4,     8
 -};
 -static const yytype_int8 yypact[] =
 -{
 -      -2,    -1,     4,    -8,     0,     2,    -8,    -2,    -8,    -2,
 -      -8,    -8
 -};
  static const yytype_int8 yypgoto[] =
  {
        -8,    -7,    -8,    -8,    -8
  };
 +static const yytype_int8 yydefgoto[] =
 +{
 +      -1,     2,     3,     4,     8
 +};
  static const yytype_uint8 yytable[] =
  {
        10,     1,    11,     5,     6,     0,     7,     9
@@@ -797,14 -814,6 +797,14 @@@ static const yytype_uint8 yystos[] 
         0,     3,     8,     9,    10,     4,     0,     6,    11,     5,
         8,     8
  };
 +static const yytype_uint8 yyr1[] =
 +{
 +       0,     7,     8,     9,     9,    10,    11
 +};
 +static const yytype_uint8 yyr2[] =
 +{
 +       0,     2,     1,     0,     2,     4,     2
 +};
  ]])
  
  AT_CLEANUP
@@@ -825,7 -834,7 +825,7 @@@ m4_define([_AT_DATA_DANCER_Y]
  [AT_DATA_GRAMMAR([dancer.y],
  [%{
  static int yylex (AT_LALR1_CC_IF([int *], [void]));
 -AT_LALR1_CC_IF([],
 +AT_LALR1_CC_IF([#include <cstdlib>],
  [#include <stdlib.h>
  #include <stdio.h>
  static void yyerror (const char *);])
@@@ -877,7 -886,7 +877,7 @@@ member: STRIN
  AT_LALR1_CC_IF(
  [/* A C++ error reporting function. */
  void
 -yy::parser::error (const location&, const std::string& m)
 +yy::parser::error (const std::string& m)
  {
    std::cerr << m << std::endl;
  }
@@@ -953,7 -962,7 +953,7 @@@ m4_define([_AT_DATA_EXPECT2_Y]
  [AT_DATA_GRAMMAR([expect2.y],
  [%{
  static int yylex (AT_LALR1_CC_IF([int *], [void]));
 -AT_LALR1_CC_IF([],
 +AT_LALR1_CC_IF([#include <cstdlib>],
  [#include <stdio.h>
  #include <stdlib.h>
  static void yyerror (const char *);])
@@@ -976,7 -985,7 +976,7 @@@ t: A | B
  AT_LALR1_CC_IF(
  [/* A C++ error reporting function. */
  void
 -yy::parser::error (const location&, const std::string& m)
 +yy::parser::error (const std::string& m)
  {
    std::cerr << m << std::endl;
  }
@@@ -1062,7 -1071,7 +1062,7 @@@ static int yylex (void)
  start:
    {
      printf ("Bison would once convert this action to a midrule because of the"
 -          " subsequent braced code.\n");
 +            " subsequent braced code.\n");
    }
    ;
  
@@@ -1253,9 -1262,8 +1253,9 @@@ AT_CLEANU
  
  AT_SETUP([[parse-gram.y: LALR = IELR]])
  
 -# Avoid differences in synclines by telling bison that the output files
 -# have the same name.
 +# Avoid tests/bison's dark magic by processing a local copy of the
 +# grammar.  Avoid differences in synclines by telling bison that the
 +# output files have the same name.
  [cp $abs_top_srcdir/src/parse-gram.y input.y]
  AT_BISON_CHECK([[-o input.c -Dlr.type=lalr input.y]])
  [mv input.c expout]
@@@ -1267,11 -1275,11 +1267,11 @@@ AT_CLEANU
  
  
  
 -## --------------------------------------- ##
 -## %error-verbose and YYSTACK_USE_ALLOCA.  ##
 -## --------------------------------------- ##
 +## -------------------------------------------- ##
 +## parse.error=verbose and YYSTACK_USE_ALLOCA.  ##
 +## -------------------------------------------- ##
  
 -AT_SETUP([[%error-verbose and YYSTACK_USE_ALLOCA]])
 +AT_SETUP([[parse.error=verbose and YYSTACK_USE_ALLOCA]])
  
  AT_DATA_GRAMMAR([input.y],
  [[%code {
    #define YYSTACK_USE_ALLOCA 1
  }
  
 -%error-verbose
 +%define parse.error verbose
  
  %%
  
@@@ -1347,9 -1355,9 +1347,9 @@@ AT_CLEANU
  
  
  
 -## ------------------------- ##
 -## %error-verbose overflow.  ##
 -## ------------------------- ##
 +## ------------------------------ ##
 +## parse.error=verbose overflow.  ##
 +## ------------------------------ ##
  
  # Imagine the case where YYSTACK_ALLOC_MAXIMUM = YYSIZE_MAXIMUM and an
  # invocation of yysyntax_error has caused yymsg_alloc to grow to exactly
  # size calculation would return YYSIZE_MAXIMUM to yyparse.  Then,
  # yyparse would invoke yyerror using the old contents of yymsg.
  
 -AT_SETUP([[%error-verbose overflow]])
 +AT_SETUP([[parse.error=verbose overflow]])
  
  AT_DATA_GRAMMAR([input.y],
  [[%code {
    #define YYMAXDEPTH 100
  }
  
 -%error-verbose
 +%define parse.error verbose
  
  %%
  
@@@ -1494,7 -1502,7 +1494,7 @@@ AT_DATA_GRAMMAR([input.y]
  }
  
  ]$1[
 -%error-verbose
 +%define parse.error verbose
  %token 'c'
  
  %%