]> git.saurik.com Git - bison.git/commitdiff
Merge branch 'origin/maint'
authorAkim Demaille <akim@lrde.epita.fr>
Fri, 14 Dec 2012 12:56:11 +0000 (13:56 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Fri, 14 Dec 2012 12:58:04 +0000 (13:58 +0100)
* origin/maint:
  maint: credit Wojciech Polak
  maint: post-release administrivia
  version 2.7
  yacc.c: scope reduction
  tests: C90 compliance
  fix C90 compliance
  glr.c: scope reduction
  gnulib: update

Conflicts:
NEWS
gnulib
src/scan-gram.l
src/system.h

1  2 
NEWS
THANKS
data/glr.c
data/yacc.c
src/ielr.c
src/scan-gram.l
src/system.h
tests/actions.at
tests/glr-regression.at

diff --combined NEWS
index 7df5d87ef102132899944518407a5e0c15563343,8da9cf9f855d2ca35b40ba1a556e37f07c53b81d..39c812e0ddcd5d0be245f896063cd7e183c0d087
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -2,255 -2,15 +2,252 @@@ GNU Bison NEW
  
  * Noteworthy changes in release ?.? (????-??-??) [?]
  
 +** Incompatible changes
 +
 +*** Obsolete features
 +
 +  Support for YYFAIL is removed (deprecated in Bison 2.4.2).
 +  Support for yystype and yyltype (instead of YYSTYPE and YYLTYPE)
 +  is removed (deprecated in Bison 1.875).
 +  Support for YYPARSE_PARAM is removed (deprecated in Bison 1.875).
 +
 +** Warnings
 +
 +*** Enhancements of the -Werror option
 +
 +  The -Werror=CATEGORY option is now recognized, and will treat specified
 +  warnings as errors. The warnings need not have been explicitly activated
 +  using the -W option, this is similar to what GCC 4.7 does.
 +
 +  For example, given the following command line, Bison will treat both
 +  warnings related to POSIX Yacc incompatibilities and S/R conflicts as
 +  errors (and only those):
 +
 +    $ bison -Werror=yacc,error=conflicts-sr input.y
 +
 +  If no categories are specified, -Werror will make all active warnings into
 +  errors. For example, the following line does the same the previous example:
 +
 +    $ bison -Werror -Wnone -Wyacc -Wconflicts-sr input.y
 +
 +  (By default -Wconflicts-sr,conflicts-rr,deprecated,other is enabled.)
 +
 +  Note that the categories in this -Werror option may not be prefixed with
 +  "no-". However, -Wno-error[=CATEGORY] is valid.
 +
 +  Note that -y enables -Werror=yacc. Therefore it is now possible to require
 +  Yacc-like behavior (e.g., always generate y.tab.c), but to report
 +  incompatibilities as warnings: "-y -Wno-error=yacc".
 +
 +*** The display of warnings is now richer
 +
 +  The option that controls a given warning is now displayed:
 +
 +    foo.y:4.6: warning: type clash on default action: <foo> != <bar> [-Wother]
 +
 +  In the case of warnings treated as errors, the prefix is changed from
 +  "warning: " to "error: ", and the suffix is displayed, in a manner similar
 +  to GCC, as [-Werror=CATEGORY].
 +
 +  For instance, where the previous version of Bison would report (and exit
 +  with failure):
 +
 +    bison: warnings being treated as errors
 +    input.y:1.1: warning: stray ',' treated as white space
 +
 +  it now reports:
 +
 +    input.y:1.1: error: stray ',' treated as white space [-Werror=other]
 +
 +*** Deprecated constructs
 +
 +  The new 'deprecated' warning category flags obsolete constructs whose
 +  support will be discontinued.  It is enabled by default.  These warnings
 +  used to be reported as 'other' warnings.
 +
 +*** Useless semantic types
 +
 +  Bison now warns about useless (uninhabited) semantic types.  Since
 +  semantic types are not declared to Bison (they are defined in the opaque
 +  %union structure), it is %printer/%destructor directives about useless
 +  types that trigger the warning:
 +
 +    %token <type1> term
 +    %type  <type2> nterm
 +    %printer    {} <type1> <type3>
 +    %destructor {} <type2> <type4>
 +    %%
 +    nterm: term { $$ = $1; };
 +
 +    3.28-34: warning: type <type3> is used, but is not associated to any symbol
 +    4.28-34: warning: type <type4> is used, but is not associated to any symbol
 +
 +*** Undefined but unused symbols
 +
 +  Bison used to raise an error for undefined symbols that are not used in
 +  the grammar.  This is now only a warning.
 +
 +    %printer    {} symbol1
 +    %destructor {} symbol2
 +    %type <type>   symbol3
 +    %%
 +    exp: "a";
 +
 +*** Useless destructors or printers
 +
 +  Bison now warns about useless destructors or printers.  In the following
 +  example, the printer for <type1>, and the destructor for <type2> are
 +  useless: all symbols of <type1> (token1) already have a printer, and all
 +  symbols of type <type2> (token2) already have a destructor.
 +
 +    %token <type1> token1
 +           <type2> token2
 +           <type3> token3
 +           <type4> token4
 +    %printer    {} token1 <type1> <type3>
 +    %destructor {} token2 <type2> <type4>
 +
 +*** Conflicts
 +
 +  The warnings and error messages about shift/reduce and reduce/reduce
 +  conflicts have been normalized.  For instance on the following foo.y file:
 +
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  compare the previous version of bison:
 +
 +    $ bison foo.y
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    $ bison -Werror foo.y
 +    bison: warnings being treated as errors
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +
 +  with the new behavior:
 +
 +    $ bison foo.y
 +    foo.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +    foo.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +    $ bison -Werror foo.y
 +    foo.y: error: 1 shift/reduce conflict [-Werror=conflicts-sr]
 +    foo.y: error: 2 reduce/reduce conflicts [-Werror=conflicts-rr]
 +
 +  When %expect or %expect-rr is used, such as with bar.y:
 +
 +    %expect 0
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  Former behavior:
 +
 +    $ bison bar.y
 +    bar.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    bar.y: expected 0 shift/reduce conflicts
 +    bar.y: expected 0 reduce/reduce conflicts
 +
 +  New one:
 +
 +    $ bison bar.y
 +    bar.y: error: shift/reduce conflicts: 1 found, 0 expected
 +    bar.y: error: reduce/reduce conflicts: 2 found, 0 expected
 +
 +** Additional yylex/yyparse arguments
 +
 +  The new directive %param declares additional arguments to both yylex and
 +  yyparse.  The %lex-param, %parse-param, and %param directives support one
 +  or more arguments.  Instead of
 +
 +    %lex-param   {arg1_type *arg1}
 +    %lex-param   {arg2_type *arg2}
 +    %parse-param {arg1_type *arg1}
 +    %parse-param {arg2_type *arg2}
 +
 +  one may now declare
 +
 +    %param {arg1_type *arg1} {arg2_type *arg2}
 +
 +** Java skeleton improvements
 +
 +  The constants for token names were moved to the Lexer interface.  Also, it
 +  is possible to add code to the parser's constructors using "%code init"
 +  and "%define init_throws".
 +
 +** C++ skeletons improvements
 +
 +*** The parser header is no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Using %defines is now optional.  Without it, the needed support classes
 +  are defined in the generated parser, instead of additional files (such as
 +  location.hh, position.hh and stack.hh).
 +
 +*** Locations are no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Both lalr1.cc and glr.cc no longer require %location.
 +
 +*** syntax_error exception (lalr1.cc)
 +
 +  The C++ parser features a syntax_error exception, which can be
 +  thrown from the scanner or from user rules to raise syntax errors.
 +  This facilitates reporting errors caught in sub-functions (e.g.,
 +  rejecting too large integral literals from a conversion function
 +  used by the scanner, or rejecting invalid combinations from a
 +  factory invoked by the user actions).
 +
 +** Variable api.token.prefix
 +
 +  The variable api.token.prefix changes the way tokens are identified in
 +  the generated files.  This is especially useful to avoid collisions
 +  with identifiers in the target language.  For instance
 +
 +    %token FILE for ERROR
 +    %define api.token.prefix "TOK_"
 +    %%
 +    start: FILE for ERROR;
 +
 +  will generate the definition of the symbols TOK_FILE, TOK_for, and
 +  TOK_ERROR in the generated sources.  In particular, the scanner must
 +  use these prefixed token names, although the grammar itself still
 +  uses the short names (as in the sample rule given above).
 +
 +** Renamed %define variables
 +
 +  The following variables have been renamed for consistency.  Backward
 +  compatibility is ensured, but upgrading is recommended.
 +
 +    lr.default-reductions      -> lr.default-reduction
 +    lr.keep-unreachable-states -> lr.keep-unreachable-state
 +    namespace                  -> api.namespace
 +
 +** Variable parse.error
 +
 +  This variable controls the verbosity of error messages.  The use of the
 +  %error-verbose directive is deprecated in favor of "%define parse.error
 +  verbose".
 +
 +** Semantic predicates
 +
 +  The new, experimental, semantic-predicate feature allows actions of the
 +  form "%?{ BOOLEAN-EXPRESSION }", which cause syntax errors (as for
 +  YYERROR) if the expression evaluates to 0, and are evaluated immediately
 +  in GLR parsers, rather than being deferred.  The result is that they allow
 +  the programmer to prune possible parses based on the values of run-time
 +  expressions.
 +
 +** The directive %expect-rr is now an error in non GLR mode
 +
 +  It used to be an error only if used in non GLR mode, _and_ if there are
 +  reduce/reduce conflicts.
  
- * Noteworthy changes in release ?.? (????-??-??) [?]
- ** %language is no longer an experimental feature.
-   The introduction of this feature, in 2.4, was four years ago. The --language
-   option and the %language directive are no longer experimental.
+ * Noteworthy changes in release 2.7 (2012-12-12) [stable]
  
  ** Bug fixes
  
    Warnings about uninitialized yylloc in yyparse have been fixed.
  
+   Restored C90 compliance (yet no report was ever made).
  ** Diagnostics are improved
  
  *** Changes in the format of error messages
  
  * Noteworthy changes in release 2.6.1 (2012-07-30) [stable]
  
 -  Bison no longer executes user-specified M4 code when processing a grammar.
 + Bison no longer executes user-specified M4 code when processing a grammar.
  
  ** Future Changes
  
  
  * Noteworthy changes in release 2.6 (2012-07-19) [stable]
  
 -** Future Changes
 +** Future changes
  
    The next major release of Bison will drop support for the following
    deprecated features.  Please report disagreements to bug-bison@gnu.org.
  
    These features are experimental in this version.  More user feedback
    will help to stabilize them.
+   Contributed by Alex Rozenman.
  
  ** IELR(1) and canonical LR(1):
  
  
    The current Java interface is experimental and may evolve.  More user
    feedback will help to stabilize it.
+   Contributed by Paolo Bonzini.
  
  ** %language
  
    Bison can now generate an XML report of the LALR(1) automaton using the new
    "--xml" option.  The current XML schema is experimental and may evolve.  More
    user feedback will help to stabilize it.
+   Contributed by Wojciech Polak.
  
  ** The grammar file may now specify the name of the parser header file using
    %defines.  For example:
@@@ -2287,8 -2050,8 +2287,8 @@@ along with this program.  If not, see <
   LocalWords:  namespaces strerror const autoconfiguration Dconst Autoconf's FDL
   LocalWords:  Automake TMPDIR LESSEQ ylwrap endif yydebug YYTOKEN YYLSP ival hh
   LocalWords:  extern YYTOKENTYPE TOKENTYPE yytokentype tokentype STYPE lval pdf
 - LocalWords:  lang yyoutput dvi html ps POSIX lvalp llocp calc yyo fval Wmaybe
 - LocalWords:  yyvsp pragmas noreturn java's
 + LocalWords:  lang yyoutput dvi html ps POSIX lvalp llocp Wother nterm arg init
 + LocalWords:  TOK calc yyo fval Wconflicts
  
  Local Variables:
  mode: outline
diff --combined THANKS
index dbe54791e383d85b72e1553b7a0aa5f02c8f3ca0,ed978d3760b10028ae7bac7079d3f9960f7b9f2f..ed15fa02e7071567797aecfbd6b3cd67fb5bedd5
--- 1/THANKS
--- 2/THANKS
+++ b/THANKS
@@@ -76,7 -76,6 +76,7 @@@ Matt Kraai                kraai@alumni.
  Matt Rosing               rosing@peakfive.com
  Michael Hayes             m.hayes@elec.canterbury.ac.nz
  Michael Raskin            7c6f434c@mail.ru
 +Michiel De Wilde          mdewilde.agilent@gmail.com
  Mickael Labau             labau_m@epita.fr
  Mike Castle               dalgoda@ix.netcom.com
  Neil Booth                NeilB@earthling.net
@@@ -97,7 -96,6 +97,7 @@@ Peter Fales               psfales@lucen
  Peter Hamorsky            hamo@upjs.sk
  Peter Simons              simons@cryp.to
  Piotr Gackiewicz          gacek@intertel.com.pl
 +Quentin Hocquet           hocquet@gostai.com
  Quoc Peyrot               chojin@lrde.epita.fr
  R Blake                   blakers@mac.com
  Raja R Harinath           harinath@cs.umn.edu
@@@ -127,6 -125,7 +127,7 @@@ Vin Shelton               acs@alumni.pr
  W.C.A. Wijngaards         wouter@NLnetLabs.nl
  Wayne Green               wayne@infosavvy.com
  Wei Song                  wsong83@gmail.com
+ Wojciech Polak            polak@gnu.org
  Wolfgang S. Kechel        wolfgang.kechel@prs.de
  Wolfram Wagner            ww@mpi-sb.mpg.de
  Wwp                       subscript@free.fr
diff --combined data/glr.c
index 1e82e5891ff472b1ce75c9cae3bf8b2cca979f02,02a76c211dece970df0c1e750c7c97179bb21490..6c03af3b0b749de590d7a42061e0c881aad00f2b
@@@ -52,7 -52,7 +52,7 @@@ m4_ifndef([b4_pure_flag]
  # This is not shared with yacc.c in c.m4 because  GLR relies on ISO C
  # formal argument declarations.
  m4_define([b4_user_formals],
 -[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])])
 +[m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
  
  
  # b4_lex_param
@@@ -71,7 -71,7 +71,7 @@@ m4_ifdef([b4_lex_param], [, ]b4_lex_par
  # a trailing comma.
  m4_define([b4_yyerror_args],
  [b4_pure_if([b4_locations_if([yylocp, ])])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_lyyerror_args
@@@ -79,7 -79,7 +79,7 @@@
  # Same as above, but on the lookahead, hence &yylloc instead of yylocp.
  m4_define([b4_lyyerror_args],
  [b4_pure_if([b4_locations_if([&yylloc, ])])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_pure_args
@@@ -126,15 -126,7 +126,15 @@@ m4_define([b4_locuser_args]
  # --------------------
  # Expansion of $<TYPE>$.
  m4_define([b4_lhs_value],
 -[((*yyvalp)[]m4_ifval([$1], [.$1]))])
 +[b4_symbol_value([(*yyvalp)], [$1])])
 +
 +
 +# b4_rhs_data(RULE-LENGTH, NUM)
 +# -----------------------------
 +# Expand to the semantic stack place that contains value and location
 +# of symbol number NUM in a rule of length RULE-LENGTH.
 +m4_define([b4_rhs_data],
 +[((yyGLRStackItem const *)yyvsp)@{YYFILL (b4_subtract([$2], [$1]))@}.yystate])
  
  
  # b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
  # Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
  # symbols on RHS.
  m4_define([b4_rhs_value],
 -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))])
 +[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yysval], [$3])])
  
  
  
@@@ -162,7 -154,7 +162,7 @@@ m4_define([b4_lhs_location]
  # Expansion of @NUM, where the current rule has RULE-LENGTH symbols
  # on RHS.
  m4_define([b4_rhs_location],
 -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)])
 +[(b4_rhs_data([$1], [$2]).yyloc)])
  
  
  ## -------------- ##
  # b4_shared_declarations
  # ----------------------
  # Declaration that might either go into the header (if --defines)
 -# or open coded in the parser body.
 -m4_define([b4_shared_declarations],
 +# or open coded in the parser body.  glr.cc has its own definition.
 +m4_if(b4_skeleton, ["glr.c"],
 +[m4_define([b4_shared_declarations],
  [b4_declare_yydebug[
  ]b4_percent_code_get([[requires]])[
 -]b4_token_enums(b4_tokens)[
 +]b4_token_enums[
  ]b4_declare_yylstype[
 -]b4_c_ansi_function_decl(b4_prefix[parse], [int], b4_parse_param)[
 +]b4_function_declare(b4_prefix[parse], [int], b4_parse_param)[
  ]b4_percent_code_get([[provides]])[]dnl
  ])
 -
 +])
  
  ## -------------- ##
  ## Output files.  ##
@@@ -212,7 -203,7 +212,7 @@@ b4_percent_code_get([[top]])
  #define yynerrs ]b4_prefix[nerrs]b4_locations_if([[
  #define yylloc  ]b4_prefix[lloc]])])[
  
 -/* Copy the first part of user declarations.  */
 +/* First part of user declarations.  */
  ]b4_user_pre_prologue[
  
  ]b4_null_define[
  # undef YYERROR_VERBOSE
  # define YYERROR_VERBOSE 1
  #else
 -# define YYERROR_VERBOSE ]b4_error_verbose_flag[
 +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
  #endif
  
  /* Default (constant) value used for initialization for null
@@@ -256,12 -247,22 +256,12 @@@ b4_percent_code_get[]dn
  #endif
  
  /* Suppress unused-variable warnings by "using" E.  */
 -#if ! defined lint || defined __GNUC__
 +#ifdef __GNUC__
  # define YYUSE(E) ((void) (E))
  #else
  # define YYUSE(E) /* empty */
  #endif
  
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
 -#else
 -]b4_c_function_def([YYID], [static int], [[int i], [i]])[
 -{
 -  return i;
 -}
 -#endif
 -
  #ifndef YYFREE
  # define YYFREE free
  #endif
  # include <setjmp.h>
  # define YYJMP_BUF jmp_buf
  # define YYSETJMP(Env) setjmp (Env)
- // Pacify clang.
+ /* Pacify clang.  */
  # define YYLONGJMP(Env, Val) (longjmp (Env, Val), YYASSERT (0))
  #endif
  
@@@ -339,6 -340,19 +339,6 @@@ static const ]b4_int_type_for([b4_trans
  };
  
  #if ]b4_api_PREFIX[DEBUG
 -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -   YYRHS.  */
 -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
 -{
 -  ]b4_prhs[
 -};
 -
 -/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
 -{
 -  ]b4_rhs[
 -};
 -
  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
  static const ]b4_int_type_for([b4_rline])[ yyrline[] =
  {
@@@ -355,10 -369,17 +355,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[] =
@@@ -372,11 -393,41 +372,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
@@@ -398,6 -449,18 +398,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[
 -};
 -
  /* Error token number */
  #define YYTERROR 1
  
  ]b4_yy_location_print_define[
  
  /* YYLEX -- calling `yylex' with the right arguments.  */
 -#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
 +#define YYLEX ]b4_function_call([yylex], [int], b4_lex_param)[
  
  ]b4_pure_if(
  [
@@@ -436,12 -499,9 +436,12 @@@ static const int YYEMPTY = -2
  
  typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
  
 -#define YYCHK(YYE)                                                           \
 -   do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; }       \
 -   while (YYID (0))
 +#define YYCHK(YYE)                              \
 +  do {                                          \
 +    YYRESULTTAG yychk_flag = YYE;               \
 +    if (yychk_flag != yyok)                     \
 +      return yychk_flag;                        \
 +  } while (0)
  
  #if ]b4_api_PREFIX[DEBUG
  
  # endif
  
  # define YYDPRINTF(Args)                        \
 -do {                                            \
 -  if (yydebug)                                  \
 -    YYFPRINTF Args;                             \
 -} while (YYID (0))
 -
 -]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[
 -
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)          \
 -do {                                                            \
 -  if (yydebug)                                                  \
 -    {                                                           \
 -      YYFPRINTF (stderr, "%s ", Title);                         \
 -      yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
 -      YYFPRINTF (stderr, "\n");                                 \
 -    }                                                           \
 -} while (YYID (0))
 +  do {                                          \
 +    if (yydebug)                                \
 +      YYFPRINTF Args;                           \
 +  } while (0)
 +
 +]b4_yy_symbol_print_define[
 +
 +# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                  \
 +  do {                                                                  \
 +    if (yydebug)                                                        \
 +      {                                                                 \
 +        YYFPRINTF (stderr, "%s ", Title);                               \
 +        yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[);        \
 +        YYFPRINTF (stderr, "\n");                                       \
 +      }                                                                 \
 +  } while (0)
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
     multiple parsers can coexist.  */
@@@ -502,7 -562,13 +502,7 @@@ int yydebug
  #define YYHEADROOM 2
  
  #ifndef YYSTACKEXPANDABLE
 -# if (! defined __cplusplus \
 -      || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 -          && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL))
  #  define YYSTACKEXPANDABLE 1
 -# else
 -#  define YYSTACKEXPANDABLE 0
 -# endif
  #endif
  
  #if YYSTACKEXPANDABLE
    do {                                                  \
      if (Yystack->yyspaceLeft < YYHEADROOM)              \
        yyexpandGLRStack (Yystack);                       \
 -  } while (YYID (0))
 +  } while (0)
  #else
  # define YY_RESERVE_GLRSTACK(Yystack)                   \
    do {                                                  \
      if (Yystack->yyspaceLeft < YYHEADROOM)              \
        yyMemoryExhausted (Yystack);                      \
 -  } while (YYID (0))
 +  } while (0)
  #endif
  
  
@@@ -599,7 -665,7 +599,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;
@@@ -620,7 -686,7 +620,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
@@@ -732,16 -798,9 +732,16 @@@ yyfillin (yyGLRStackItem *yyvsp, int yy
    yyGLRState *s = yyvsp[yylow0].yystate.yypred;
    for (i = yylow0-1; i >= yylow1; i -= 1)
      {
 -      YYASSERT (s->yyresolved);
 -      yyvsp[i].yystate.yyresolved = yytrue;
 -      yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;]b4_locations_if([[
 +#if ]b4_api_PREFIX[DEBUG
 +      yyvsp[i].yystate.yylrState = s->yylrState;
 +#endif
 +      yyvsp[i].yystate.yyresolved = s->yyresolved;
 +      if (s->yyresolved)
 +        yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;
 +      else
 +        /* The effect of using yysval or yyloc (in an immediate rule) is
 +         * undefined.  */
 +        yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULL;]b4_locations_if([[
        yyvsp[i].yystate.yyloc = s->yyloc;]])[
        s = yyvsp[i].yystate.yypred = s->yypred;
      }
@@@ -768,7 -827,7 +768,7 @@@ yyfill (yyGLRStackItem *yyvsp, int *yyl
   *  value ($$), and yylocp points to place for location information
   *  (@@$).  Returns yyok for normal return, yyaccept for YYACCEPT,
   *  yyerr for YYERROR, yyabort for YYABORT.  */
 -/*ARGSUSED*/ static YYRESULTTAG
 +static YYRESULTTAG
  yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
                yyGLRStack* yystackp,
                YYSTYPE* yyvalp]b4_locuser_formals[)
    yybool yynormal __attribute__ ((__unused__)) =
      (yystackp->yysplitPoint == YY_NULL);
    int yylow;
 -]b4_parse_param_use[]dnl
 +]b4_parse_param_use([yyvalp], [yylocp])dnl
  [# undef yyerrok
  # define yyerrok (yystackp->yyerrState = 0)
  # undef YYACCEPT
  # undef yyclearin
  # undef YYRECOVERING
  }
 -\f
  
 -/*ARGSUSED*/ static void
 +
 +static void
  yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
  {
    YYUSE (yy0);
  
    switch (yyn)
      {
 -      ]b4_mergers[
 +]b4_mergers[
        default: break;
      }
  }
  
                                /* Bison grammar-table manipulation.  */
  
 -]b4_yydestruct_generate([b4_c_ansi_function_def])[
 +]b4_yydestruct_define[
  
  /** Number of symbols composing the right hand side of rule #RULE.  */
  static inline int
@@@ -879,7 -938,7 +879,7 @@@ yydestroyGLRState (char const *yymsg, y
      }
  }
  
 -/** Left-hand-side symbol for rule #RULE.  */
 +/** Left-hand-side symbol for rule #YYRULE.  */
  static inline yySymbol
  yylhsNonterm (yyRuleNum yyrule)
  {
  #define yypact_value_is_default(Yystate) \
    ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[
  
 -/** True iff LR state STATE has only a default reduction (regardless
 +/** True iff LR state YYSTATE has only a default reduction (regardless
   *  of token).  */
  static inline yybool
  yyisDefaultedState (yyStateNum yystate)
    return yypact_value_is_default (yypact[yystate]);
  }
  
 -/** The default reduction for STATE, assuming it has one.  */
 +/** The default reduction for YYSTATE, assuming it has one.  */
  static inline yyRuleNum
  yydefaultAction (yyStateNum yystate)
  {
   *    R < 0:  Reduce on rule -R.
   *    R = 0:  Error.
   *    R > 0:  Shift to state R.
 - *  Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of
 - *  conflicting reductions.
 + *  Set *YYCONFLICTS to a pointer into yyconfl to a 0-terminated list
 + *  of conflicting reductions.
   */
  static inline void
  yygetLRActions (yyStateNum yystate, int yytoken,
  static inline yyStateNum
  yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
  {
 -  int yyr;
 -  yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
 +  int yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
    if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
      return yytable[yyr];
    else
@@@ -962,10 -1022,9 +962,10 @@@ yyisErrorAction (int yyaction
  
                                  /* GLRStates */
  
 -/** Return a fresh GLRStackItem.  Callers should call
 - * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
 - * headroom.  */
 +/** Return a fresh GLRStackItem in YYSTACKP.  The item is an LR state
 + *  if YYISSTATE, and otherwise a semantic option.  Callers should call
 + *  YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
 + *  headroom.  */
  
  static inline yyGLRStackItem*
  yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState)
  }
  
  /** Add a new semantic action that will execute the action for rule
 - *  RULENUM on the semantic values in RHS to the list of
 - *  alternative actions for STATE.  Assumes that RHS comes from
 - *  stack #K of *STACKP. */
 + *  YYRULE on the semantic values in YYRHS to the list of
 + *  alternative actions for YYSTATE.  Assumes that YYRHS comes from
 + *  stack #YYK of *YYSTACKP. */
  static void
  yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate,
 -                     yyGLRState* rhs, yyRuleNum yyrule)
 +                     yyGLRState* yyrhs, yyRuleNum yyrule)
  {
    yySemanticOption* yynewOption =
      &yynewGLRStackItem (yystackp, yyfalse)->yyoption;
 -  yynewOption->yystate = rhs;
 +  yynewOption->yystate = yyrhs;
    yynewOption->yyrule = yyrule;
    if (yystackp->yytops.yylookaheadNeeds[yyk])
      {
  
                                  /* GLRStacks */
  
 -/** Initialize SET to a singleton set containing an empty stack.  */
 +/** Initialize YYSET to a singleton set containing an empty stack.  */
  static yybool
  yyinitStateSet (yyGLRStateSet* yyset)
  {
@@@ -1031,8 -1090,8 +1031,8 @@@ static void yyfreeStateSet (yyGLRStateS
    YYFREE (yyset->yylookaheadNeeds);
  }
  
 -/** Initialize STACK to a single empty stack, with total maximum
 - *  capacity for all stacks of SIZE.  */
 +/** Initialize *YYSTACKP to a single empty stack, with total maximum
 + *  capacity for all stacks of YYSIZE.  */
  static yybool
  yyinitGLRStack (yyGLRStack* yystackp, size_t yysize)
  {
  # define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \
    &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE
  
 -/** If STACK is expandable, extend it.  WARNING: Pointers into the
 +/** If *YYSTACKP is expandable, extend it.  WARNING: Pointers into the
      stack from outside should be considered invalid after this call.
      We always expand when there are 1 or fewer items left AFTER an
      allocation, so that we can avoid having external pointers exist
@@@ -1124,9 -1183,9 +1124,9 @@@ yyfreeGLRStack (yyGLRStack* yystackp
    yyfreeStateSet (&yystackp->yytops);
  }
  
 -/** Assuming that S is a GLRState somewhere on STACK, update the
 - *  splitpoint of STACK, if needed, so that it is at least as deep as
 - *  S.  */
 +/** Assuming that YYS is a GLRState somewhere on *YYSTACKP, update the
 + *  splitpoint of *YYSTACKP, if needed, so that it is at least as deep as
 + *  YYS.  */
  static inline void
  yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys)
  {
      yystackp->yysplitPoint = yys;
  }
  
 -/** Invalidate stack #K in STACK.  */
 +/** Invalidate stack #YYK in *YYSTACKP.  */
  static inline void
  yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
  {
    yystackp->yytops.yystates[yyk] = YY_NULL;
  }
  
 -/** Undelete the last stack that was marked as deleted.  Can only be
 -    done once after a deletion, and only when all other stacks have
 +/** Undelete the last stack in *YYSTACKP that was marked as deleted.  Can
 +    only be done once after a deletion, and only when all other stacks have
      been deleted.  */
  static void
  yyundeleteLastStack (yyGLRStack* yystackp)
@@@ -1193,9 -1252,8 +1193,9 @@@ yyremoveDeletes (yyGLRStack* yystackp
      }
  }
  
 -/** Shift to a new state on stack #K of STACK, corresponding to LR state
 - * LRSTATE, at input position POSN, with (resolved) semantic value SVAL.  */
 +/** Shift to a new state on stack #YYK of *YYSTACKP, corresponding to LR
 + * state YYLRSTATE, at input position YYPOSN, with (resolved) semantic
 + * value *YYVALP and source location *YYLOCP.  */
  static inline void
  yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
              size_t yyposn,
    YY_RESERVE_GLRSTACK (yystackp);
  }
  
 -/** Shift stack #K of YYSTACK, to a new state corresponding to LR
 +/** Shift stack #YYK of *YYSTACKP, to a new state corresponding to LR
   *  state YYLRSTATE, at input position YYPOSN, with the (unresolved)
   *  semantic value of YYRHS under the action for YYRULE.  */
  static inline void
  yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
 -                 size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
 +                 size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule)
  {
    yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
  
    yystackp->yytops.yystates[yyk] = yynewState;
  
    /* Invokes YY_RESERVE_GLRSTACK.  */
 -  yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule);
 +  yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule);
  }
  
 -/** Pop the symbols consumed by reduction #RULE from the top of stack
 - *  #K of STACK, and perform the appropriate semantic action on their
 +#if !]b4_api_PREFIX[DEBUG
 +# define YY_REDUCE_PRINT(Args)
 +#else
 +# define YY_REDUCE_PRINT(Args)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print Args;               \
 +} while (0)
 +
 +/*----------------------------------------------------------------------.
 +| Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. |
 +`----------------------------------------------------------------------*/
 +
 +static inline void
 +yy_reduce_print (int yynormal, yyGLRStackItem* yyvsp, size_t yyk,
 +                 yyRuleNum yyrule]b4_user_formals[)
 +{
 +  int yynrhs = yyrhsLength (yyrule);]b4_locations_if([
 +  int yylow = 1;])[
 +  int yyi;
 +  YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
 +             (unsigned long int) yyk, yyrule - 1,
 +             (unsigned long int) yyrline[yyrule]);
 +  if (! yynormal)
 +    yyfillin (yyvsp, 1, -yynrhs);
 +  /* The symbols being reduced.  */
 +  for (yyi = 0; yyi < yynrhs; yyi++)
 +    {
 +      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 +      yy_symbol_print (stderr,
 +                       yystos[yyvsp[yyi - yynrhs + 1].yystate.yylrState],
 +                       &yyvsp[yyi - yynrhs + 1].yystate.yysemantics.yysval
 +                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 +                       b4_user_args[);
 +      if (!yyvsp[yyi - yynrhs + 1].yystate.yyresolved)
 +        YYFPRINTF (stderr, " (unresolved)");
 +      YYFPRINTF (stderr, "\n");
 +    }
 +}
 +#endif
 +
 +/** Pop the symbols consumed by reduction #YYRULE from the top of stack
 + *  #YYK of *YYSTACKP, and perform the appropriate semantic action on their
   *  semantic values.  Assumes that all ambiguities in semantic values
 - *  have been previously resolved.  Set *VALP to the resulting value,
 - *  and *LOCP to the computed location (if any).  Return value is as
 + *  have been previously resolved.  Set *YYVALP to the resulting value,
 + *  and *YYLOCP to the computed location (if any).  Return value is as
   *  for userAction.  */
  static inline YYRESULTTAG
  yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
    if (yystackp->yysplitPoint == YY_NULL)
      {
        /* Standard special case: single stack.  */
 -      yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
 +      yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
        YYASSERT (yyk == 0);
        yystackp->yynextFree -= yynrhs;
        yystackp->yyspaceLeft += yynrhs;
        yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate;
 -      return yyuserAction (yyrule, yynrhs, rhs, yystackp,
 +      YY_REDUCE_PRINT ((1, yyrhs, yyk, yyrule]b4_user_args[));
 +      return yyuserAction (yyrule, yynrhs, yyrhs, yystackp,
                             yyvalp]b4_locuser_args[);
      }
    else
      {
 -      /* At present, doAction is never called in nondeterministic
 -       * mode, so this branch is never taken.  It is here in
 -       * anticipation of a future feature that will allow immediate
 -       * evaluation of selected actions in nondeterministic mode.  */
        int yyi;
        yyGLRState* yys;
        yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
          }
        yyupdateSplit (yystackp, yys);
        yystackp->yytops.yystates[yyk] = yys;
 +      YY_REDUCE_PRINT ((0, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule]b4_user_args[));
        return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
                             yystackp, yyvalp]b4_locuser_args[);
      }
  }
  
 -#if !]b4_api_PREFIX[DEBUG
 -# define YY_REDUCE_PRINT(Args)
 -#else
 -# define YY_REDUCE_PRINT(Args)          \
 -do {                                    \
 -  if (yydebug)                          \
 -    yy_reduce_print Args;               \
 -} while (YYID (0))
 -
 -/*----------------------------------------------------------.
 -| Report that the RULE is going to be reduced on stack #K.  |
 -`----------------------------------------------------------*/
 -
 -/*ARGSUSED*/ static inline void
 -yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
 -                 YYSTYPE* yyvalp]b4_locuser_formals[)
 -{
 -  int yynrhs = yyrhsLength (yyrule);
 -  yybool yynormal __attribute__ ((__unused__)) =
 -    (yystackp->yysplitPoint == YY_NULL);
 -  yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
 -  int yylow = 1;
 -  int yyi;
 -  YYUSE (yyvalp);]b4_locations_if([
 -  YYUSE (yylocp);])[
 -]b4_parse_param_use[]dnl
 -[  YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
 -             (unsigned long int) yyk, yyrule - 1,
 -             (unsigned long int) yyrline[yyrule]);
 -  /* The symbols being reduced.  */
 -  for (yyi = 0; yyi < yynrhs; yyi++)
 -    {
 -      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 -      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
 -                       &]b4_rhs_value(yynrhs, yyi + 1)[
 -                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 -                       b4_user_args[);
 -      YYFPRINTF (stderr, "\n");
 -    }
 -}
 -#endif
 -
 -/** Pop items off stack #K of STACK according to grammar rule RULE,
 +/** Pop items off stack #YYK of *YYSTACKP according to grammar rule YYRULE,
   *  and push back on the resulting nonterminal symbol.  Perform the
 - *  semantic action associated with RULE and store its value with the
 - *  newly pushed state, if FORCEEVAL or if STACK is currently
 + *  semantic action associated with YYRULE and store its value with the
 + *  newly pushed state, if YYFORCEEVAL or if *YYSTACKP is currently
   *  unambiguous.  Otherwise, store the deferred semantic action with
   *  the new state.  If the new state would have an identical input
   *  position, LR state, and predecessor to an existing state on the stack,
 - *  it is identified with that existing state, eliminating stack #K from
 - *  the STACK.  In this case, the (necessarily deferred) semantic value is
 + *  it is identified with that existing state, eliminating stack #YYK from
 + *  *YYSTACKP.  In this case, the semantic value is
   *  added to the options for the existing state's semantic value.
   */
  static inline YYRESULTTAG
@@@ -1341,18 -1402,11 +1341,18 @@@ yyglrReduce (yyGLRStack* yystackp, size
  
    if (yyforceEval || yystackp->yysplitPoint == YY_NULL)
      {
 +      YYRESULTTAG yyflag;
        YYSTYPE yysval;]b4_locations_if([
        YYLTYPE yyloc;])[
  
 -      YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[));
 -      YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[));
 +      yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[);
 +      if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULL)
 +        {
 +          YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n",
 +                     (unsigned long int) yyk, yyrule - 1));
 +        }
 +      if (yyflag != yyok)
 +        return yyflag;
        YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc);
        yyglrShift (yystackp, yyk,
                    yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState,
        yyupdateSplit (yystackp, yys);
        yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule));
        YYDPRINTF ((stderr,
 -                  "Reduced stack %lu by rule #%d; action deferred.  Now in state %d.\n",
 +                  "Reduced stack %lu by rule #%d; action deferred.  "
 +                  "Now in state %d.\n",
                    (unsigned long int) yyk, yyrule - 1, yynewLRState));
        for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
          if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL)
@@@ -1447,7 -1500,7 +1447,7 @@@ yysplitStack (yyGLRStack* yystackp, siz
    return yystackp->yytops.yysize-1;
  }
  
 -/** True iff Y0 and Y1 represent identical options at the top level.
 +/** True iff YYY0 and YYY1 represent identical options at the top level.
   *  That is, they represent the same rule applied to RHS symbols
   *  that produce the same terminal symbols.  */
  static yybool
@@@ -1469,8 -1522,8 +1469,8 @@@ yyidenticalOptions (yySemanticOption* y
      return yyfalse;
  }
  
 -/** Assuming identicalOptions (Y0,Y1), destructively merge the
 - *  alternative semantic values for the RHS-symbols of Y1 and Y0.  */
 +/** Assuming identicalOptions (YYY0,YYY1), destructively merge the
 + *  alternative semantic values for the RHS-symbols of YYY1 and YYY0.  */
  static void
  yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1)
  {
          {
            yySemanticOption** yyz0p = &yys0->yysemantics.yyfirstVal;
            yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal;
 -          while (YYID (yytrue))
 +          while (yytrue)
              {
                if (yyz1 == *yyz0p || yyz1 == YY_NULL)
                  break;
@@@ -1549,11 -1602,11 +1549,11 @@@ static YYRESULTTAG yyresolveValue (yyGL
                                     yyGLRStack* yystackp]b4_user_formals[);
  
  
 -/** Resolve the previous N states starting at and including state S.  If result
 - *  != yyok, some states may have been left unresolved possibly with empty
 - *  semantic option chains.  Regardless of whether result = yyok, each state
 - *  has been left with consistent data so that yydestroyGLRState can be invoked
 - *  if necessary.  */
 +/** Resolve the previous YYN states starting at and including state YYS
 + *  on *YYSTACKP. If result != yyok, some states may have been left
 + *  unresolved possibly with empty semantic option chains.  Regardless
 + *  of whether result = yyok, each state has been left with consistent
 + *  data so that yydestroyGLRState can be invoked if necessary.  */
  static YYRESULTTAG
  yyresolveStates (yyGLRState* yys, int yyn,
                   yyGLRStack* yystackp]b4_user_formals[)
    return yyok;
  }
  
 -/** Resolve the states for the RHS of OPT, perform its user action, and return
 - *  the semantic value and location.  Regardless of whether result = yyok, all
 - *  RHS states have been destroyed (assuming the user action destroys all RHS
 +/** Resolve the states for the RHS of YYOPT on *YYSTACKP, perform its
 + *  user action, and return the semantic value and location in *YYVALP
 + *  and *YYLOCP.  Regardless of whether result = yyok, all RHS states
 + *  have been destroyed (assuming the user action destroys all RHS
   *  semantic values if invoked).  */
  static YYRESULTTAG
  yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp,
@@@ -1645,11 -1697,11 +1645,11 @@@ yyreportTree (yySemanticOption* yyx, in
          {
            if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn)
              YYFPRINTF (stderr, "%*s%s <empty>\n", yyindent+2, "",
 -                       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]));
 +                       yytokenName (yystos[yystates[yyi]->yylrState]));
            else
              YYFPRINTF (stderr, "%*s%s <tokens %lu .. %lu>\n", yyindent+2, "",
 -                       yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]),
 -                       (unsigned long int) (yystates[yyi - 1]->yyposn + 1),
 +                       yytokenName (yystos[yystates[yyi]->yylrState]),
 +                       (unsigned long int) (yystates[yyi-1]->yyposn + 1),
                         (unsigned long int) yystates[yyi]->yyposn);
          }
        else
  }
  #endif
  
 -/*ARGSUSED*/ static YYRESULTTAG
 +static YYRESULTTAG
  yyreportAmbiguity (yySemanticOption* yyx0,
                     yySemanticOption* yyx1]b4_pure_formals[)
  {
    return yyabort;
  }]b4_locations_if([[
  
 -/** Starting at and including state S1, resolve the location for each of the
 - *  previous N1 states that is unresolved.  The first semantic option of a state
 - *  is always chosen.  */
 +/** Resolve the locations for each of the YYN1 states in *YYSTACKP,
 + *  ending at YYS1.  Has no effect on previously resolved states.
 + *  The first semantic option of a state is always chosen.  */
  static void
  yyresolveLocations (yyGLRState* yys1, int yyn1,
                      yyGLRStack *yystackp]b4_user_formals[)
      }
  }]])[
  
 -/** Resolve the ambiguity represented in state S, perform the indicated
 - *  actions, and set the semantic value of S.  If result != yyok, the chain of
 - *  semantic options in S has been cleared instead or it has been left
 - *  unmodified except that redundant options may have been removed.  Regardless
 - *  of whether result = yyok, S has been left with consistent data so that
 +/** Resolve the ambiguity represented in state YYS in *YYSTACKP,
 + *  perform the indicated actions, and set the semantic value of YYS.
 + *  If result != yyok, the chain of semantic options in YYS has been
 + *  cleared instead or it has been left unmodified except that
 + *  redundant options may have been removed.  Regardless of whether
 + *  result = yyok, YYS has been left with consistent data so that
   *  yydestroyGLRState can be invoked if necessary.  */
  static YYRESULTTAG
  yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
@@@ -1877,6 -1928,10 +1877,6 @@@ static YYRESULTTA
  yyprocessOneStack (yyGLRStack* yystackp, size_t yyk,
                     size_t yyposn]b4_pure_formals[)
  {
 -  int yyaction;
 -  const short int* yyconflicts;
 -  yyRuleNum yyrule;
 -
    while (yystackp->yytops.yystates[yyk] != YY_NULL)
      {
        yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
  
        if (yyisDefaultedState (yystate))
          {
 -          yyrule = yydefaultAction (yystate);
 +          YYRESULTTAG yyflag;
 +          yyRuleNum yyrule = yydefaultAction (yystate);
            if (yyrule == 0)
              {
                YYDPRINTF ((stderr, "Stack %lu dies.\n",
                yymarkStackDeleted (yystackp, yyk);
                return yyok;
              }
 -          YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[));
 +          yyflag = yyglrReduce (yystackp, yyk, yyrule, yyimmediate[yyrule]]b4_user_args[);
 +          if (yyflag == yyerr)
 +            {
 +              YYDPRINTF ((stderr,
 +                          "Stack %lu dies "
 +                          "(predicate failure or explicit user error).\n",
 +                          (unsigned long int) yyk));
 +              yymarkStackDeleted (yystackp, yyk);
 +              return yyok;
 +            }
 +          if (yyflag != yyok)
 +            return yyflag;
          }
        else
          {
            yySymbol yytoken;
 +          int yyaction;
 +          const short int* yyconflicts;
 +
            yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
            if (yychar == YYEMPTY)
              {
  
            while (*yyconflicts != 0)
              {
 +              YYRESULTTAG yyflag;
                size_t yynewStack = yysplitStack (yystackp, yyk);
                YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n",
                            (unsigned long int) yynewStack,
                            (unsigned long int) yyk));
 -              YYCHK (yyglrReduce (yystackp, yynewStack,
 -                                  *yyconflicts, yyfalse]b4_user_args[));
 -              YYCHK (yyprocessOneStack (yystackp, yynewStack,
 -                                        yyposn]b4_pure_args[));
 +              yyflag = yyglrReduce (yystackp, yynewStack,
 +                                    *yyconflicts,
 +                                    yyimmediate[*yyconflicts]]b4_user_args[);
 +              if (yyflag == yyok)
 +                YYCHK (yyprocessOneStack (yystackp, yynewStack,
 +                                          yyposn]b4_pure_args[));
 +              else if (yyflag == yyerr)
 +                {
 +                  YYDPRINTF ((stderr, "Stack %lu dies.\n",
 +                              (unsigned long int) yynewStack));
 +                  yymarkStackDeleted (yystackp, yynewStack);
 +                }
 +              else
 +                return yyflag;
                yyconflicts += 1;
              }
  
                break;
              }
            else
 -            YYCHK (yyglrReduce (yystackp, yyk, -yyaction,
 -                                yyfalse]b4_user_args[));
 +            {
 +              YYRESULTTAG yyflag = yyglrReduce (yystackp, yyk, -yyaction,
 +                                                yyimmediate[-yyaction]]b4_user_args[);
 +              if (yyflag == yyerr)
 +                {
 +                  YYDPRINTF ((stderr,
 +                              "Stack %lu dies "
 +                              "(predicate failure or explicit user error).\n",
 +                              (unsigned long int) yyk));
 +                  yymarkStackDeleted (yystackp, yyk);
 +                  break;
 +                }
 +              else if (yyflag != yyok)
 +                return yyflag;
 +            }
          }
      }
    return yyok;
  }
  
 -/*ARGSUSED*/ static void
 +static void
  yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
  {
    if (yystackp->yyerrState != 0)
  #if ! YYERROR_VERBOSE
    yyerror (]b4_lyyerror_args[YY_("syntax error"));
  #else
+   {
    yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
    size_t yysize0 = yytnamerr (YY_NULL, yytokenName (yytoken));
    size_t yysize = yysize0;
-   size_t yysize1;
    yybool yysize_overflow = yyfalse;
    char* yymsg = YY_NULL;
    enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
                      break;
                    }
                  yyarg[yycount++] = yytokenName (yyx);
-                 yysize1 = yysize + yytnamerr (YY_NULL, yytokenName (yyx));
-                 yysize_overflow |= yysize1 < yysize;
-                 yysize = yysize1;
+                 {
+                   size_t yysz = yysize + yytnamerr (YY_NULL, yytokenName (yyx));
+                   yysize_overflow |= yysz < yysize;
+                   yysize = yysz;
+                 }
                }
          }
      }
  #undef YYCASE_
      }
  
-   yysize1 = yysize + strlen (yyformat);
-   yysize_overflow |= yysize1 < yysize;
-   yysize = yysize1;
+   {
+     size_t yysz = yysize + strlen (yyformat);
+     yysize_overflow |= yysz < yysize;
+     yysize = yysz;
+   }
  
    if (!yysize_overflow)
      yymsg = (char *) YYMALLOC (yysize);
        yyerror (]b4_lyyerror_args[YY_("syntax error"));
        yyMemoryExhausted (yystackp);
      }
+   }
  #endif /* YYERROR_VERBOSE */
    yynerrs += 1;
  }
  /* Recover from a syntax error on *YYSTACKP, assuming that *YYSTACKP->YYTOKENP,
     yylval, and yylloc are the syntactic category, semantic value, and location
     of the lookahead.  */
 -/*ARGSUSED*/ static void
 +static void
  yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
  {
    size_t yyk;
    if (yystackp->yyerrState == 3)
      /* We just shifted the error token and (perhaps) took some
         reductions.  Skip tokens until we can proceed.  */
 -    while (YYID (yytrue))
 +    while (yytrue)
        {
          yySymbol yytoken;
          if (yychar == YYEOF)
      default:                                                                 \
        goto yybuglab;                                                         \
      }                                                                        \
 -  } while (YYID (0))
 -
 +  } while (0)
  
  /*----------.
  | yyparse.  |
  `----------*/
  
 -]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[
 +]b4_function_define([yyparse], [int], b4_parse_param)[
  {
    int yyresult;
    yyGLRStack yystack;
    yylloc = yyloc_default;])[
  ]m4_ifdef([b4_initial_action], [
  b4_dollar_pushdef([yylval], [], [yylloc])dnl
 -/* User initialization code.  */
 -b4_user_initial_action
 +  /* User initialization code.  */
 +  b4_user_initial_action
  b4_dollar_popdef])[]dnl
  [
    if (! yyinitGLRStack (yystackp, YYINITDEPTH))
    yyglrShift (&yystack, 0, 0, 0, &yylval]b4_locations_if([, &yylloc])[);
    yyposn = 0;
  
 -  while (YYID (yytrue))
 +  while (yytrue)
      {
        /* For efficiency, we have two loops, the first of which is
           specialized to deterministic operation (single stack, no
           potential ambiguity).  */
        /* Standard mode */
 -      while (YYID (yytrue))
 +      while (yytrue)
          {
            yyRuleNum yyrule;
            int yyaction;
              }
          }
  
 -      while (YYID (yytrue))
 +      while (yytrue)
          {
            yySymbol yytoken_to_shift;
            size_t yys;
        yyfreeGLRStack (&yystack);
      }
  
 -  /* Make sure YYID is used.  */
 -  return YYID (yyresult);
 +  return yyresult;
  }
  
  /* DEBUGGING ONLY */
diff --combined data/yacc.c
index 9bd80280bd7d26cdbe06c46b56d706b10f76b456,b34549f10a280c346740a907983f523e9a3dcc26..7a2587abc8a49e76e83d9c82c1f9116ac58f625a
@@@ -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
@@@ -97,7 -95,7 +97,7 @@@ m4_define([b4_yyerror_arg_loc_if]
  # Arguments passed to yyerror: user args plus yylloc.
  m4_define([b4_yyerror_args],
  [b4_yyerror_arg_loc_if([&yylloc, ])dnl
 -m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
 +m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
  
  
  # b4_lex_param
@@@ -129,7 -127,7 +129,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])])
  
  
  
@@@ -169,7 -167,7 +169,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])@})])
  
  
  ## -------------- ##
@@@ -276,19 -274,19 +276,19 @@@ enum { YYPUSH_MORE = 4 }
  
  typedef struct ]b4_prefix[pstate ]b4_prefix[pstate;
  
 -]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param)
 -])b4_c_function_decl([b4_prefix[push_parse]], [[int]],
 +]b4_pull_if([b4_function_declare([b4_prefix[parse]], [[int]], b4_parse_param)
 +])b4_function_declare([b4_prefix[push_parse]], [[int]],
    [[b4_prefix[pstate *ps]], [[ps]]]b4_pure_if([,
    [[[int pushed_char]], [[pushed_char]]],
    [[b4_api_PREFIX[STYPE const *pushed_val]], [[pushed_val]]]b4_locations_if([,
    [[b4_api_PREFIX[LTYPE *pushed_loc]], [[pushed_loc]]]])])m4_ifset([b4_parse_param], [,
    b4_parse_param]))
 -b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]],
 +b4_pull_if([b4_function_declare([b4_prefix[pull_parse]], [[int]],
    [[b4_prefix[pstate *ps]], [[ps]]]m4_ifset([b4_parse_param], [,
    b4_parse_param]))])
 -b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
 +b4_function_declare([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
                      [[[void]], []])
 -b4_c_function_decl([b4_prefix[pstate_delete]], [[void]],
 +b4_function_declare([b4_prefix[pstate_delete]], [[void]],
                     [[b4_prefix[pstate *ps]], [[ps]]])dnl
  ])
  
  # -------------------
  # When not the push parser.
  m4_define([b4_declare_yyparse_],
 -[[#ifdef YYPARSE_PARAM
 -]b4_c_function_decl(b4_prefix[parse], [int],
 -                    [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
 -#else /* ! YYPARSE_PARAM */
 -]b4_c_function_decl(b4_prefix[parse], [int], b4_parse_param)[
 -#endif /* ! YYPARSE_PARAM */]dnl
 -])
 +[b4_function_declare(b4_prefix[parse], [int], b4_parse_param)])
  
  
  # b4_declare_yyparse
@@@ -315,19 -319,21 +315,19 @@@ m4_define([b4_shared_declarations]
  [b4_cpp_guard_open([b4_spec_defines_file])[
  ]b4_declare_yydebug[
  ]b4_percent_code_get([[requires]])[
 -]b4_token_enums_defines(b4_tokens)[
 +]b4_token_enums_defines[
  ]b4_declare_yylstype[
  ]b4_declare_yyparse[
  ]b4_percent_code_get([[provides]])[
  ]b4_cpp_guard_close([b4_spec_defines_file])[]dnl
  ])
  
 -
  ## -------------- ##
  ## Output files.  ##
  ## -------------- ##
  
  b4_output_begin([b4_parser_file_name])
 -b4_copyright([Bison implementation for Yacc-like parsers in C],
 -             [1984, 1989-1990, 2000-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.  */
@@@ -371,7 -377,7 +371,7 @@@ m4_if(b4_api_prefix, [yy], []
  # undef YYERROR_VERBOSE
  # define YYERROR_VERBOSE 1
  #else
 -# define YYERROR_VERBOSE ]b4_error_verbose_flag[
 +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
  #endif
  
  ]m4_ifval(m4_quote(b4_spec_defines_file),
@@@ -396,8 -402,10 +396,8 @@@ typedef unsigned char yytype_uint8
  
  #ifdef YYTYPE_INT8
  typedef YYTYPE_INT8 yytype_int8;
 -#elif ]b4_c_modern[
 -typedef signed char yytype_int8;
  #else
 -typedef short int yytype_int8;
 +typedef signed char yytype_int8;
  #endif
  
  #ifdef YYTYPE_UINT16
@@@ -417,7 -425,7 +417,7 @@@ typedef short int yytype_int16
  #  define YYSIZE_T __SIZE_TYPE__
  # elif defined size_t
  #  define YYSIZE_T size_t
 -# elif ! defined YYSIZE_T && ]b4_c_modern[
 +# elif ! defined YYSIZE_T
  #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
  #  define YYSIZE_T size_t
  # else
  #endif
  
  /* Suppress unused-variable warnings by "using" E.  */
 -#if ! defined lint || defined __GNUC__
 +#ifdef __GNUC__
  # define YYUSE(E) ((void) (E))
  #else
  # define YYUSE(E) /* empty */
  #endif
  
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
 -#else
 -]b4_c_function_def([YYID], [static int], [[int yyi], [yyi]])[
 -{
 -  return yyi;
 -}
 -#endif
 -
  #if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[
  
  /* The parser invokes alloca or malloc; define the necessary symbols.  */]dnl
@@@ -464,7 -482,7 +464,7 @@@ b4_push_if([], [b4_lac_if([], [
  #    define alloca _alloca
  #   else
  #    define YYSTACK_ALLOC alloca
 -#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
  #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
        /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
  #     ifndef EXIT_SUCCESS
  
  # ifdef YYSTACK_ALLOC
     /* Pacify GCC's `empty if-body' warning.  */
 -#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 +#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
  #  ifndef YYSTACK_ALLOC_MAXIMUM
      /* The OS might guarantee only one guard page at the bottom of the stack,
         and a page size can be as small as 4096 bytes.  So we cannot safely
  #  endif
  #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
         && ! ((defined YYMALLOC || defined malloc) \
 -           && (defined YYFREE || defined free)))
 +             && (defined YYFREE || defined free)))
  #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
  #   ifndef EXIT_SUCCESS
  #    define EXIT_SUCCESS 0
  #  endif
  #  ifndef YYMALLOC
  #   define YYMALLOC malloc
 -#   if ! defined malloc && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#   if ! defined malloc && ! defined EXIT_SUCCESS
  void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
  #   endif
  #  endif
  #  ifndef YYFREE
  #   define YYFREE free
 -#   if ! defined free && ! defined EXIT_SUCCESS && ]b4_c_modern[
 +#   if ! defined free && ! defined EXIT_SUCCESS
  void free (void *); /* INFRINGES ON USER NAME SPACE */
  #   endif
  #  endif
  
  #if (! defined yyoverflow \
       && (! defined __cplusplus \
 -       || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 -           && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)))
 +         || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \
 +             && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)))
  
  /* A type that is properly aligned for any stack member.  */
  union yyalloc
     elements in the stack, and YYPTR gives the new location of the
     stack.  Advance YYPTR to a properly aligned location for the next
     stack.  */
 -# define YYSTACK_RELOCATE(Stack_alloc, Stack)                         \
 -    do                                                                        \
 -      {                                                                       \
 -      YYSIZE_T yynewbytes;                                            \
 -      YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
 -      Stack = &yyptr->Stack_alloc;                                    \
 -      yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 -      yyptr += yynewbytes / sizeof (*yyptr);                          \
 -      }                                                                       \
 -    while (YYID (0))
 +# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
 +    do                                                                  \
 +      {                                                                 \
 +        YYSIZE_T yynewbytes;                                            \
 +        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
 +        Stack = &yyptr->Stack_alloc;                                    \
 +        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 +        yyptr += yynewbytes / sizeof (*yyptr);                          \
 +      }                                                                 \
 +    while (0)
  
  #endif
  
            for (yyi = 0; yyi < (Count); yyi++)   \
              (Dst)[yyi] = (Src)[yyi];            \
          }                                       \
 -      while (YYID (0))
 +      while (0)
  #  endif
  # endif
  #endif /* !YYCOPY_NEEDED */
  #define YYNNTS  ]b4_nterms_number[
  /* YYNRULES -- Number of rules.  */
  #define YYNRULES  ]b4_rules_number[
 -/* YYNRULES -- Number of states.  */
 +/* YYNSTATES -- Number of states.  */
  #define YYNSTATES  ]b4_states_number[
  
 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
 +   by yylex, with out-of-bounds checking.  */
  #define YYUNDEFTOK  ]b4_undef_token_number[
  #define YYMAXUTOK   ]b4_user_token_number_max[
  
 -#define YYTRANSLATE(YYX)                                              \
 +#define YYTRANSLATE(YYX)                                                \
    ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
  
 -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
 +   as returned by yylex, without out-of-bounds checking.  */
  static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
  {
    ]b4_translate[
  };
  
  #if ]b4_api_PREFIX[DEBUG
 -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
 -   YYRHS.  */
 -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] =
 -{
 -  ]b4_prhs[
 -};
 -
 -/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] =
 -{
 -  ]b4_rhs[
 -};
 -
 -/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 -static const ]b4_int_type_for([b4_rline])[ yyrline[] =
 -{
 -  ]b4_rline[
 -};
 +]b4_integral_parser_table_define([rline], [b4_rline],
 +     [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
  #endif
  
  #if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
@@@ -626,35 -658,105 +626,35 @@@ static const char *const yytname[] 
  #endif
  
  # ifdef YYPRINT
 -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
 -   token YYLEX-NUM.  */
 +/* YYTOKNUM[NUM] -- (External) token number corresponding to the
 +   (internal) symbol number NUM (which must be that of a token).  */
  static const ]b4_int_type_for([b4_toknum])[ yytoknum[] =
  {
    ]b4_toknum[
  };
  # endif
  
 -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 -static const ]b4_int_type_for([b4_r1])[ yyr1[] =
 -{
 -  ]b4_r1[
 -};
 -
 -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 -static const ]b4_int_type_for([b4_r2])[ yyr2[] =
 -{
 -  ]b4_r2[
 -};
 -
 -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
 -   Performed when YYTABLE doesn't specify something else to do.  Zero
 -   means the default is an error.  */
 -static const ]b4_int_type_for([b4_defact])[ yydefact[] =
 -{
 -  ]b4_defact[
 -};
 -
 -/* YYDEFGOTO[NTERM-NUM].  */
 -static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] =
 -{
 -  ]b4_defgoto[
 -};
 -
 -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
 -   STATE-NUM.  */
  #define YYPACT_NINF ]b4_pact_ninf[
 -static const ]b4_int_type_for([b4_pact])[ yypact[] =
 -{
 -  ]b4_pact[
 -};
 -
 -/* YYPGOTO[NTERM-NUM].  */
 -static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] =
 -{
 -  ]b4_pgoto[
 -};
 -
 -/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
 -   positive, shift that token.  If negative, reduce the rule which
 -   number is the opposite.  If YYTABLE_NINF, syntax error.  */
 -#define YYTABLE_NINF ]b4_table_ninf[
 -static const ]b4_int_type_for([b4_table])[ yytable[] =
 -{
 -  ]b4_table[
 -};
  
  #define yypact_value_is_default(Yystate) \
    ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[
  
 +#define YYTABLE_NINF ]b4_table_ninf[
 +
  #define yytable_value_is_error(Yytable_value) \
    ]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf])[
  
 -static const ]b4_int_type_for([b4_check])[ yycheck[] =
 -{
 -  ]b4_check[
 -};
 +]b4_parser_tables_define[
  
 -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
 -   symbol of state STATE-NUM.  */
 -static const ]b4_int_type_for([b4_stos])[ yystos[] =
 -{
 -  ]b4_stos[
 -};
 +#define yyerrok         (yyerrstatus = 0)
 +#define yyclearin       (yychar = YYEMPTY)
 +#define YYEMPTY         (-2)
 +#define YYEOF           0
 +
 +#define YYACCEPT        goto yyacceptlab
 +#define YYABORT         goto yyabortlab
 +#define YYERROR         goto yyerrorlab
  
 -#define yyerrok               (yyerrstatus = 0)
 -#define yyclearin     (yychar = YYEMPTY)
 -#define YYEMPTY               (-2)
 -#define YYEOF         0
 -
 -#define YYACCEPT      goto yyacceptlab
 -#define YYABORT               goto yyabortlab
 -#define YYERROR               goto yyerrorlab
 -
 -
 -/* Like YYERROR except do call yyerror.  This remains here temporarily
 -   to ease the transition to the new meaning of YYERROR, for GCC.
 -   Once GCC version 2 has supplanted version 1, this can go.  However,
 -   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
 -   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
 -   discussed.  */
 -
 -#define YYFAIL                goto yyerrlab
 -#if defined YYFAIL
 -  /* This is here to suppress warnings from the GCC cpp's
 -     -Wunused-macros.  Normally we don't worry about that warning, but
 -     some users do, and we want to make it easy for users to remove
 -     YYFAIL uses, which will produce warnings from Bison 2.5.  */
 -#endif
  
  #define YYRECOVERING()  (!!yyerrstatus)
  
    else                                                          \
      {                                                           \
        yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
 -      YYERROR;                                                        \
 -    }                                                         \
 -while (YYID (0))
 +      YYERROR;                                                  \
 +    }                                                           \
 +while (0)
  
  /* Error token number */
 -#define YYTERROR      1
 -#define YYERRCODE     256
 +#define YYTERROR        1
 +#define YYERRCODE       256
  
  ]b4_locations_if([[
  ]b4_yylloc_default_define[
  #ifdef YYLEX_PARAM
  # define YYLEX yylex (]b4_pure_if([&yylval[]b4_locations_if([, &yylloc]), ])[YYLEX_PARAM)
  #else
 -# define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[
 +# define YYLEX ]b4_function_call([yylex], [int], b4_lex_param)[
  #endif
  
  /* Enable debugging if requested.  */
  #  define YYFPRINTF fprintf
  # endif
  
 -# define YYDPRINTF(Args)                      \
 -do {                                          \
 -  if (yydebug)                                        \
 -    YYFPRINTF Args;                           \
 -} while (YYID (0))
 -
 -# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                          \
 -do {                                                                    \
 -  if (yydebug)                                                                  \
 -    {                                                                   \
 -      YYFPRINTF (stderr, "%s ", Title);                                         \
 -      yy_symbol_print (stderr,                                                  \
 -                Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
 -      YYFPRINTF (stderr, "\n");                                                 \
 -    }                                                                   \
 -} while (YYID (0))
 -
 -]b4_yy_symbol_print_generate([b4_c_function_def])[
 +# define YYDPRINTF(Args)                        \
 +do {                                            \
 +  if (yydebug)                                  \
 +    YYFPRINTF Args;                             \
 +} while (0)
 +
 +# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
 +do {                                                                      \
 +  if (yydebug)                                                            \
 +    {                                                                     \
 +      YYFPRINTF (stderr, "%s ", Title);                                   \
 +      yy_symbol_print (stderr,                                            \
 +                  Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
 +      YYFPRINTF (stderr, "\n");                                           \
 +    }                                                                     \
 +} while (0)
 +
 +]b4_yy_symbol_print_define[
  
  /*------------------------------------------------------------------.
  | yy_stack_print -- Print the state stack from its BOTTOM up to its |
  | TOP (included).                                                   |
  `------------------------------------------------------------------*/
  
 -]b4_c_function_def([yy_stack_print], [static void],
 -                 [[yytype_int16 *yybottom], [yybottom]],
 -                 [[yytype_int16 *yytop],    [yytop]])[
 +]b4_function_define([yy_stack_print], [static void],
 +                   [[yytype_int16 *yybottom], [yybottom]],
 +                   [[yytype_int16 *yytop],    [yytop]])[
  {
    YYFPRINTF (stderr, "Stack now");
    for (; yybottom <= yytop; yybottom++)
    YYFPRINTF (stderr, "\n");
  }
  
 -# define YY_STACK_PRINT(Bottom, Top)                          \
 -do {                                                          \
 -  if (yydebug)                                                        \
 -    yy_stack_print ((Bottom), (Top));                         \
 -} while (YYID (0))
 +# define YY_STACK_PRINT(Bottom, Top)                            \
 +do {                                                            \
 +  if (yydebug)                                                  \
 +    yy_stack_print ((Bottom), (Top));                           \
 +} while (0)
  
  
  /*------------------------------------------------.
  | Report that the YYRULE is going to be reduced.  |
  `------------------------------------------------*/
  
 -]b4_c_function_def([yy_reduce_print], [static void],
 -                 [[YYSTYPE *yyvsp], [yyvsp]],
 +]b4_function_define([yy_reduce_print], [static void],
 +                   [[yytype_int16 *yyssp], [yyssp]],
 +                   [[YYSTYPE *yyvsp], [yyvsp]],
      b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
 -                 ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
 -                 b4_parse_param]))[
 +                   ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
 +                   b4_parse_param]))[
  {
 +  unsigned long int yylno = yyrline[yyrule];
    int yynrhs = yyr2[yyrule];
    int yyi;
 -  unsigned long int yylno = yyrline[yyrule];
    YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
 -           yyrule - 1, yylno);
 +             yyrule - 1, yylno);
    /* The symbols being reduced.  */
    for (yyi = 0; yyi < yynrhs; yyi++)
      {
        YYFPRINTF (stderr, "   $%d = ", yyi + 1);
 -      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
 -                     &]b4_rhs_value(yynrhs, yyi + 1)[
 -                     ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 -                     b4_user_args[);
 +      yy_symbol_print (stderr,
 +                       yystos[yyssp[yyi + 1 - yynrhs]],
 +                       &]b4_rhs_value(yynrhs, yyi + 1)[
 +                       ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
 +                       b4_user_args[);
        YYFPRINTF (stderr, "\n");
      }
  }
  
 -# define YY_REDUCE_PRINT(Rule)                \
 -do {                                  \
 -  if (yydebug)                                \
 -    yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
 -} while (YYID (0))
 +# define YY_REDUCE_PRINT(Rule)          \
 +do {                                    \
 +  if (yydebug)                          \
 +    yy_reduce_print (yyssp, yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
 +} while (0)
  
  /* Nonzero means print parse trace.  It is left uninitialized so that
     multiple parsers can coexist.  */
@@@ -792,7 -892,7 +792,7 @@@ int yydebug
  
  
  /* YYINITDEPTH -- initial size of the parser's stacks.  */
 -#ifndef       YYINITDEPTH
 +#ifndef YYINITDEPTH
  # define YYINITDEPTH ]b4_stack_depth_init[
  #endif
  
@@@ -912,7 -1012,7 +912,7 @@@ do 
            goto yyerrlab;                                         \
        }                                                          \
      }                                                            \
 -} while (YYID (0))
 +} while (0)
  
  /* Discard any previous initial lookahead context because of Event,
     which may be a lookahead change or an invalidation of the currently
@@@ -935,7 -1035,7 +935,7 @@@ do 
                     Event "\n");                                          \
        yy_lac_established = 0;                                            \
      }                                                                    \
 -} while (YYID (0))
 +} while (0)
  #else
  # define YY_LAC_DISCARD(Event) yy_lac_established = 0
  #endif
@@@ -1051,7 -1151,7 +1051,7 @@@ yy_lac (yytype_int16 *yyesa, yytype_int
  #   define yystrlen strlen
  #  else
  /* Return the length of YYSTR.  */
 -]b4_c_function_def([yystrlen], [static YYSIZE_T],
 +]b4_function_define([yystrlen], [static YYSIZE_T],
     [[const char *yystr], [yystr]])[
  {
    YYSIZE_T yylen;
  #  else
  /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
     YYDEST.  */
 -]b4_c_function_def([yystpcpy], [static char *],
 +]b4_function_define([yystpcpy], [static char *],
     [[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[
  {
    char *yyd = yydest;
@@@ -1099,27 -1199,27 +1099,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: ;
      }
  
@@@ -1147,7 -1247,6 +1147,6 @@@ yysyntax_error (YYSIZE_T *yymsg_alloc, 
  {
    YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
    YYSIZE_T yysize = yysize0;
-   YYSIZE_T yysize1;
    enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
    /* Internationalized format string. */
    const char *yyformat = YY_NULL;
    int yycount = 0;
  
    /* There are many possibilities here to consider:
 -     - Assume YYFAIL is not used.  It's too flawed to consider.  See
 -       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
 -       for details.  YYERROR is fine as it does not invoke this
 -       function.
       - If this state is a consistent state with a default action, then
         the only way this function was invoked is if the default action
         is an error action.  In that case, don't check for expected
                      break;
                    }
                  yyarg[yycount++] = yytname[yyx];
-                 yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
-                 if (! (yysize <= yysize1
-                        && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                   return 2;
-                 yysize = yysize1;
+                 {
+                   YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+                   if (! (yysize <= yysize1
+                          && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                     return 2;
+                   yysize = yysize1;
+                 }
                }
          }]b4_lac_if([[
  # if ]b4_api_PREFIX[DEBUG
  # undef YYCASE_
      }
  
-   yysize1 = yysize + yystrlen (yyformat);
-   if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-     return 2;
-   yysize = yysize1;
+   {
+     YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+     if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+       return 2;
+     yysize = yysize1;
+   }
  
    if (*yymsg_alloc < yysize)
      {
  }
  #endif /* YYERROR_VERBOSE */
  
 -]b4_yydestruct_generate([b4_c_function_def])[
 +]b4_yydestruct_define[
  
  ]b4_pure_if([], [
  
@@@ -1303,13 -1410,13 +1306,13 @@@ struct yypstat
  
  static char yypstate_allocated = 0;]])b4_pull_if([
  
 -b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[
 +b4_function_define([[yyparse]], [[int]], b4_parse_param)[
  {
    return yypull_parse (YY_NULL]m4_ifset([b4_parse_param],
 -                                  [[, ]b4_c_args(b4_parse_param)])[);
 +                                  [[, ]b4_args(b4_parse_param)])[);
  }
  
 -]b4_c_function_def([[yypull_parse]], [[int]],
 +]b4_function_define([[yypull_parse]], [[int]],
    [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
    b4_parse_param]))[
  {
    do {
      yychar = YYLEX;
      yystatus =
 -      yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[);
 +      yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])[);
    } while (yystatus == YYPUSH_MORE);
    if (!yyps)
      yypstate_delete (yyps_local);
  }]])[
  
  /* Initialize the parser data structure.  */
 -]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
 +]b4_function_define([[yypstate_new]], [[yypstate *]])[
  {
    yypstate *yyps;]b4_pure_if([], [[
    if (yypstate_allocated)
    return yyps;
  }
  
 -]b4_c_function_def([[yypstate_delete]], [[void]],
 +]b4_function_define([[yypstate_delete]], [[void]],
                     [[[yypstate *yyps]], [[yyps]]])[
  {
  #ifndef yyoverflow
  | yypush_parse.  |
  `---------------*/
  
 -]b4_c_function_def([[yypush_parse]], [[int]],
 +]b4_function_define([[yypush_parse]], [[int]],
    [[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
    [[[int yypushed_char]], [[yypushed_char]]],
    [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
  | yyparse.  |
  `----------*/
  
 -#ifdef YYPARSE_PARAM
 -]b4_c_function_def([yyparse], [int],
 -                   [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
 -#else /* ! YYPARSE_PARAM */
 -]b4_c_function_def([yyparse], [int], b4_parse_param)[
 -#endif]])[
 +]b4_function_define([yyparse], [int], b4_parse_param)])[
  {]b4_pure_if([b4_declare_scanner_communication_variables
  ])b4_push_if([b4_pure_if([], [[
    int yypushed_char = yychar;
@@@ -1490,26 -1602,26 +1493,26 @@@ b4_locations_if([[  yylsp[0] = ]b4_push
  
  #ifdef yyoverflow
        {
 -      /* Give user a chance to reallocate the stack.  Use copies of
 -         these so that the &'s don't force the real ones into
 -         memory.  */
 -      YYSTYPE *yyvs1 = yyvs;
 -      yytype_int16 *yyss1 = yyss;]b4_locations_if([
 -      YYLTYPE *yyls1 = yyls;])[
 -
 -      /* Each stack pointer address is followed by the size of the
 -         data in use in that stack, in bytes.  This used to be a
 -         conditional around just the two extra args, but that might
 -         be undefined if yyoverflow is a macro.  */
 -      yyoverflow (YY_("memory exhausted"),
 -                  &yyss1, yysize * sizeof (*yyssp),
 -                  &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 -                  &yyls1, yysize * sizeof (*yylsp),])[
 -                  &yystacksize);
 +        /* Give user a chance to reallocate the stack.  Use copies of
 +           these so that the &'s don't force the real ones into
 +           memory.  */
 +        YYSTYPE *yyvs1 = yyvs;
 +        yytype_int16 *yyss1 = yyss;]b4_locations_if([
 +        YYLTYPE *yyls1 = yyls;])[
 +
 +        /* Each stack pointer address is followed by the size of the
 +           data in use in that stack, in bytes.  This used to be a
 +           conditional around just the two extra args, but that might
 +           be undefined if yyoverflow is a macro.  */
 +        yyoverflow (YY_("memory exhausted"),
 +                    &yyss1, yysize * sizeof (*yyssp),
 +                    &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
 +                    &yyls1, yysize * sizeof (*yylsp),])[
 +                    &yystacksize);
  ]b4_locations_if([
 -      yyls = yyls1;])[
 -      yyss = yyss1;
 -      yyvs = yyvs1;
 +        yyls = yyls1;])[
 +        yyss = yyss1;
 +        yyvs = yyvs1;
        }
  #else /* no yyoverflow */
  # ifndef YYSTACK_RELOCATE
  # else
        /* Extend the stack our own way.  */
        if (YYMAXDEPTH <= yystacksize)
 -      goto yyexhaustedlab;
 +        goto yyexhaustedlab;
        yystacksize *= 2;
        if (YYMAXDEPTH < yystacksize)
 -      yystacksize = YYMAXDEPTH;
 +        yystacksize = YYMAXDEPTH;
  
        {
 -      yytype_int16 *yyss1 = yyss;
 -      union yyalloc *yyptr =
 -        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 -      if (! yyptr)
 -        goto yyexhaustedlab;
 -      YYSTACK_RELOCATE (yyss_alloc, yyss);
 -      YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 -      YYSTACK_RELOCATE (yyls_alloc, yyls);])[
 +        yytype_int16 *yyss1 = yyss;
 +        union yyalloc *yyptr =
 +          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 +        if (! yyptr)
 +          goto yyexhaustedlab;
 +        YYSTACK_RELOCATE (yyss_alloc, yyss);
 +        YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
 +        YYSTACK_RELOCATE (yyls_alloc, yyls);])[
  #  undef YYSTACK_RELOCATE
 -      if (yyss1 != yyssa)
 -        YYSTACK_FREE (yyss1);
 +        if (yyss1 != yyssa)
 +          YYSTACK_FREE (yyss1);
        }
  # endif
  #endif /* no yyoverflow */
        yylsp = yyls + yysize - 1;])[
  
        YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 -                (unsigned long int) yystacksize));
 +                  (unsigned long int) yystacksize));
  
        if (yyss + yystacksize - 1 <= yyssp)
 -      YYABORT;
 +        YYABORT;
      }
  
    YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@@ -1728,9 -1840,9 +1731,9 @@@ yyreduce
    goto yynewstate;
  
  
 -/*------------------------------------.
 -| yyerrlab -- here on detecting error |
 -`------------------------------------*/
 +/*--------------------------------------.
 +| yyerrlab -- here on detecting error |
 +`--------------------------------------*/
  yyerrlab:
    /* Make sure we have latest lookahead translation.  See comments at
       user semantic actions for why this is necessary.  */
    if (yyerrstatus == 3)
      {
        /* If just tried and failed to reuse lookahead token after an
 -       error, discard it.  */
 +         error, discard it.  */
  
        if (yychar <= YYEOF)
 -      {
 -        /* Return failure if at end of input.  */
 -        if (yychar == YYEOF)
 -          YYABORT;
 -      }
 +        {
 +          /* Return failure if at end of input.  */
 +          if (yychar == YYEOF)
 +            YYABORT;
 +        }
        else
 -      {
 -        yydestruct ("Error: discarding",
 -                    yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
 -        yychar = YYEMPTY;
 -      }
 +        {
 +          yydestruct ("Error: discarding",
 +                      yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
 +          yychar = YYEMPTY;
 +        }
      }
  
    /* Else will try to reuse lookahead token after shifting the error
@@@ -1830,29 -1942,29 +1833,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);
@@@ -1919,7 -2031,7 +1922,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
@@@ -1935,15 -2047,19 +1938,15 @@@ yypushreturn:]])
    if (yymsg != yymsgbuf)
      YYSTACK_FREE (yymsg);
  #endif
 -  /* Make sure YYID is used.  */
 -  return YYID (yyresult);
 +  return yyresult;
  }
 -
 -
  ]b4_epilogue[]dnl
  b4_output_end()
  
  b4_defines_if(
  [b4_output_begin([b4_spec_defines_file])[
 -]b4_copyright([Bison interface for Yacc-like parsers in C],
 -              [1984, 1989-1990, 2000-2012])[
 +]b4_copyright([Bison interface for Yacc-like parsers in C])[
  
  ]b4_shared_declarations[
  ]b4_output_end()
 -])
 +])# b4_defines_if
diff --combined src/ielr.c
index 39e9cb6695c858eeb2ec8cbe6f3a585c8792cf3b,e6aa6f5ccac34ba86fd14c39dff87c4b8acabccb..997ba13a5882b2563054b0ddf01e8dfb440bc1f1
@@@ -758,8 -758,8 +758,8 @@@ ielr_compute_state (bitsetv follow_kern
                      if (!bitset_empty_p (lookaheads[i]))
                        break;
                    }
-                 // bitset_equal_p uses the size of the first argument, so
-                 // lookaheads[i] must be the second argument.
+                 /* bitset_equal_p uses the size of the first argument,
+                    so lookaheads[i] must be the second argument.  */
                  else if (!bitset_equal_p ((*this_isocorep)->lookaheads[i],
                                            lookaheads[i]))
                    break;
@@@ -1095,11 -1095,11 +1095,11 @@@ ielr (void
    /* Examine user options.  */
    {
      char *type = muscle_percent_define_get ("lr.type");
 -    if (0 == strcmp (type, "lalr"))
 +    if (STREQ (type, "lalr"))
        lr_type = LR_TYPE__LALR;
 -    else if (0 == strcmp (type, "ielr"))
 +    else if (STREQ (type, "ielr"))
        lr_type = LR_TYPE__IELR;
 -    else if (0 == strcmp (type, "canonical-lr"))
 +    else if (STREQ (type, "canonical-lr"))
        lr_type = LR_TYPE__CANONICAL_LR;
      else
        aver (false);
    free (to_state);
    if (lr_type == LR_TYPE__CANONICAL_LR)
      {
-       // Reduction lookaheads are computed in ielr_split_states above but are
-       // timed as part of phase 4.
+       /* Reduction lookaheads are computed in ielr_split_states above
+          but are timed as part of phase 4. */
        set_goto_map ();
      }
    else
diff --combined src/scan-gram.l
index e6f42ea934c57a539f659d869100855821032739,9083dce3e1a57f5379ad225b1b259a962bf21370..d02b26bb618983734e4327ac88ed68762a1ec557
@@@ -17,7 -17,7 +17,7 @@@
     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
  
 -%option debug nodefault noinput nounput noyywrap never-interactive
 +%option debug nodefault noinput noyywrap never-interactive
  %option prefix="gram_" outfile="lex.yy.c"
  
  %{
  #define gram_wrap() 1
  
  #define FLEX_PREFIX(Id) gram_ ## Id
 -#include "flex-scanner.h"
 +#include <src/flex-scanner.h>
  
 -#include "complain.h"
 -#include "files.h"
 -#include "gram.h"
 -#include "quotearg.h"
 -#include "reader.h"
 -#include "uniqstr.h"
 +#include <src/complain.h>
 +#include <src/files.h>
 +#include <src/getargs.h>
 +#include <src/gram.h>
 +#include <quotearg.h>
 +#include <src/reader.h>
 +#include <src/uniqstr.h>
  
  #include <c-ctype.h>
  #include <mbswidth.h>
  #include <quote.h>
  
 -#include "scan-gram.h"
 +#include <src/scan-gram.h>
  
  #define YY_DECL GRAM_LEX_DECL
  
 -#define YY_USER_INIT                                  \
 -   code_start = scanner_cursor = loc->start;          \
 +#define YY_USER_INIT                                    \
 +   code_start = scanner_cursor = loc->start;            \
  
  /* Location of scanner cursor.  */
  static boundary scanner_cursor;
  static size_t no_cr_read (FILE *, char *, size_t);
  #define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size))
  
 +#define RETURN_PERCENT_PARAM(Value)                     \
 +  RETURN_VALUE(PERCENT_PARAM, param, param_ ## Value)
 +
 +#define RETURN_PERCENT_FLAG(Value)                              \
 +  RETURN_VALUE(PERCENT_FLAG, uniqstr, uniqstr_new (Value))
 +
 +#define RETURN_VALUE(Token, Field, Value)       \
 +  do {                                          \
 +    val->Field = Value;                         \
 +    return Token;                               \
 +  } while (0)
 +
  #define ROLLBACK_CURRENT_TOKEN                                  \
    do {                                                          \
 -    scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);   \
 +    scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);     \
      yyless (0);                                                 \
    } while (0)
  
 +#define DEPRECATED(Msg)                                         \
 +  do {                                                          \
 +    size_t i;                                                   \
 +    complain (loc, Wdeprecated,                                 \
 +              _("deprecated directive: %s, use %s"),            \
 +              quote (yytext), quote_n (1, Msg));                \
 +    scanner_cursor.column -= mbsnwidth (Msg, strlen (Msg), 0);  \
 +    for (i = strlen (Msg); i != 0; --i)                         \
 +      unput (Msg[i - 1]);                                       \
 +  } while (0)
 +
  /* A string representing the most recently saved token.  */
  static char *last_string;
  
@@@ -114,15 -90,12 +114,15 @@@ static void unexpected_newline (boundar
   /* A identifier was just read in directives/rules.  Special state
      to capture the sequence 'identifier :'. */
  %x SC_AFTER_IDENTIFIER
 + /* A complex tag, with nested angles brackets. */
 +%x SC_TAG
  
 - /* Three types of user code:
 + /* Four types of user code:
      - prologue (code between '%{' '%}' in the first section, before %%);
      - actions, printers, union, etc, (between braced in the middle section);
 -    - epilogue (everything after the second %%). */
 -%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE
 +    - epilogue (everything after the second %%).
 +    - predicate (code between '%?{' and '{' in middle section); */
 +%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE SC_PREDICATE
   /* C and C++ comments in code. */
  %x SC_COMMENT SC_LINE_COMMENT
   /* Strings and characters in code. */
   /* Bracketed identifiers support. */
  %x SC_BRACKETED_ID SC_RETURN_BRACKETED_ID
  
 -letter           [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
 +letter    [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
  notletter [^.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]{-}[%\{]
 -id      {letter}({letter}|[-0-9])*
 -int     [0-9]+
 +id        {letter}({letter}|[-0-9])*
 +int       [0-9]+
  
  /* POSIX says that a tag must be both an id and a C union member, but
     historically almost any character is allowed in a tag.  We disallow
 -   NUL and newline, as this simplifies our implementation.  */
 -tag    [^\0\n>]+
 +   NUL, as this simplifies our implementation.  We disallow angle
 +   bracket to match them in nested pairs: several languages use them
 +   for generics/template types.  */
 +tag      [^\0<>]+
  
  /* Zero or more instances of backslash-newline.  Following GCC, allow
     white space between the backslash and the newline.  */
 -splice         (\\[ \f\t\v]*\n)*
 +splice   (\\[ \f\t\v]*\n)*
 +
 +/* An equal sign, with optional leading whitespaces. This is used in some
 +   deprecated constructs. */
 +eqopt    ([[:space:]]*=)?
  
  %%
  %{
 -  /* Nesting level of the current code in braces.  */
 -  int braces_level PACIFY_CC (= 0);
 +  /* Nesting level.  Either for nested braces, or nested angle brackets
 +     (but not mixed).  */
 +  int nesting PACIFY_CC (= 0);
  
    /* Parent context state, when applicable.  */
    int context_state PACIFY_CC (= 0);
  <INITIAL,SC_AFTER_IDENTIFIER,SC_BRACKETED_ID,SC_RETURN_BRACKETED_ID>
  {
    /* Comments and white space.  */
 -  ","          warn_at (*loc, _("stray ',' treated as white space"));
 +  "," {
 +     complain (loc, Wother, _("stray ',' treated as white space"));
 +  }
    [ \f\n\t\v]  |
    "//".*       continue;
    "/*" {
    `----------------------------*/
  
    /* For directives that are also command line options, the regex must be
 -      "%..."
 +        "%..."
       after "[-_]"s are removed, and the directive must match the --long
       option name, with a single string argument.  Otherwise, add exceptions
       to ../build-aux/cross-options.pl.  */
  {
    "%binary"                         return PERCENT_NONASSOC;
    "%code"                           return PERCENT_CODE;
 -  "%debug"                          return PERCENT_DEBUG;
 -  "%default"[-_]"prec"              return PERCENT_DEFAULT_PREC;
 +  "%debug"                          RETURN_PERCENT_FLAG("parse.trace");
 +  "%default-prec"                   return PERCENT_DEFAULT_PREC;
    "%define"                         return PERCENT_DEFINE;
    "%defines"                        return PERCENT_DEFINES;
    "%destructor"                     return PERCENT_DESTRUCTOR;
    "%dprec"                          return PERCENT_DPREC;
 -  "%error"[-_]"verbose"             return PERCENT_ERROR_VERBOSE;
 +  "%error-verbose"                  return PERCENT_ERROR_VERBOSE;
    "%expect"                         return PERCENT_EXPECT;
 -  "%expect"[-_]"rr"                 return PERCENT_EXPECT_RR;
 +  "%expect-rr"                      return PERCENT_EXPECT_RR;
    "%file-prefix"                    return PERCENT_FILE_PREFIX;
 -  "%fixed"[-_]"output"[-_]"files"   return PERCENT_YACC;
 +  "%fixed-output-files"             return PERCENT_YACC;
    "%initial-action"                 return PERCENT_INITIAL_ACTION;
    "%glr-parser"                     return PERCENT_GLR_PARSER;
    "%language"                       return PERCENT_LANGUAGE;
    "%left"                           return PERCENT_LEFT;
 -  "%lex-param"                      return PERCENT_LEX_PARAM;
 -  "%locations"                      return PERCENT_LOCATIONS;
 +  "%lex-param"                      RETURN_PERCENT_PARAM(lex);
 +  "%locations"                      RETURN_PERCENT_FLAG("locations");
    "%merge"                          return PERCENT_MERGE;
 -  "%name"[-_]"prefix"               return PERCENT_NAME_PREFIX;
 -  "%no"[-_]"default"[-_]"prec"      return PERCENT_NO_DEFAULT_PREC;
 -  "%no"[-_]"lines"                  return PERCENT_NO_LINES;
 +  "%name-prefix"                    return PERCENT_NAME_PREFIX;
 +  "%no-default-prec"                return PERCENT_NO_DEFAULT_PREC;
 +  "%no-lines"                       return PERCENT_NO_LINES;
    "%nonassoc"                       return PERCENT_NONASSOC;
    "%nondeterministic-parser"        return PERCENT_NONDETERMINISTIC_PARSER;
    "%nterm"                          return PERCENT_NTERM;
    "%output"                         return PERCENT_OUTPUT;
 -  "%parse-param"                    return PERCENT_PARSE_PARAM;
 +  "%param"                          RETURN_PERCENT_PARAM(both);
 +  "%parse-param"                    RETURN_PERCENT_PARAM(parse);
    "%prec"                           return PERCENT_PREC;
 +  "%precedence"                     return PERCENT_PRECEDENCE;
    "%printer"                        return PERCENT_PRINTER;
 -  "%pure"[-_]"parser"               return PERCENT_PURE_PARSER;
 +  "%pure-parser"                    RETURN_PERCENT_FLAG("api.pure");
    "%require"                        return PERCENT_REQUIRE;
    "%right"                          return PERCENT_RIGHT;
    "%skeleton"                       return PERCENT_SKELETON;
    "%start"                          return PERCENT_START;
    "%term"                           return PERCENT_TOKEN;
    "%token"                          return PERCENT_TOKEN;
 -  "%token"[-_]"table"               return PERCENT_TOKEN_TABLE;
 +  "%token-table"                    return PERCENT_TOKEN_TABLE;
    "%type"                           return PERCENT_TYPE;
    "%union"                          return PERCENT_UNION;
    "%verbose"                        return PERCENT_VERBOSE;
    "%yacc"                           return PERCENT_YACC;
  
 +  /* deprecated */
 +  "%default"[-_]"prec"              DEPRECATED("%default-prec");
 +  "%error"[-_]"verbose"             DEPRECATED("%define parse.error verbose");
 +  "%expect"[-_]"rr"                 DEPRECATED("%expect-rr");
 +  "%file-prefix"{eqopt}             DEPRECATED("%file-prefix");
 +  "%fixed"[-_]"output"[-_]"files"   DEPRECATED("%fixed-output-files");
 +  "%name"[-_]"prefix"{eqopt}        DEPRECATED("%name-prefix");
 +  "%no"[-_]"default"[-_]"prec"      DEPRECATED("%no-default-prec");
 +  "%no"[-_]"lines"                  DEPRECATED("%no-lines");
 +  "%output"{eqopt}                  DEPRECATED("%output");
 +  "%pure"[-_]"parser"               DEPRECATED("%pure-parser");
 +  "%token"[-_]"table"               DEPRECATED("%token-table");
 +
    "%"{id}|"%"{notletter}([[:graph:]])+ {
 -    complain_at (*loc, _("invalid directive: %s"), quote (yytext));
 +    complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
    }
  
    "="                     return EQUAL;
    "|"                     return PIPE;
    ";"                     return SEMICOLON;
 -  "<*>"                   return TYPE_TAG_ANY;
 -  "<>"                    return TYPE_TAG_NONE;
  
    {id} {
      val->uniqstr = uniqstr_new (yytext);
    /* Identifiers may not start with a digit.  Yet, don't silently
       accept "1FOO" as "1 FOO".  */
    {int}{id} {
 -    complain_at (*loc, _("invalid identifier: %s"), quote (yytext));
 +    complain (loc, complaint, _("invalid identifier: %s"), quote (yytext));
    }
  
    /* Characters.  */
 -  "'"       token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
 +  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER;
  
    /* Strings. */
 -  "\""              token_start = loc->start; BEGIN SC_ESCAPED_STRING;
 +  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING;
  
    /* Prologue. */
    "%{"        code_start = loc->start; BEGIN SC_PROLOGUE;
    /* Code in between braces.  */
    "{" {
      STRING_GROW;
 -    braces_level = 0;
 +    nesting = 0;
      code_start = loc->start;
      BEGIN SC_BRACED_CODE;
    }
  
 +  /* Semantic predicate. */
 +  "%?"[ \f\n\t\v]*"{" {
 +    nesting = 0;
 +    code_start = loc->start;
 +    BEGIN SC_PREDICATE;
 +  }
 +
    /* A type. */
 +  "<*>"       return TAG_ANY;
 +  "<>"        return TAG_NONE;
    "<"{tag}">" {
      obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2);
      STRING_FINISH;
      val->uniqstr = uniqstr_new (last_string);
      STRING_FREE;
 -    return TYPE;
 +    return TAG;
 +  }
 +  "<"         {
 +    nesting = 0;
 +    token_start = loc->start;
 +    BEGIN SC_TAG;
    }
  
    "%%" {
    }
  
    [^\[%A-Za-z0-9_<>{}\"\'*;|=/, \f\n\t\v]+|. {
 -    complain_at (*loc, "%s: %s",
 -                 ngettext ("invalid character", "invalid characters", yyleng),
 -                 quote_mem (yytext, yyleng));
 +    complain (loc, complaint, "%s: %s",
 +              ngettext ("invalid character", "invalid characters", yyleng),
 +              quote_mem (yytext, yyleng));
    }
  
    <<EOF>> {
  }
  
  
 +  /*--------------------------------------------------------------.
 +  | Supporting \0 complexifies our implementation for no expected |
 +  | added value.                                                  |
 +  `--------------------------------------------------------------*/
 +
 +<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_TAG>
 +{
 +  \0        complain (loc, complaint, _("invalid null character"));
 +}
 +
 +
    /*-----------------------------------------------------------------.
    | Scanning after an identifier, checking whether a colon is next.  |
    `-----------------------------------------------------------------*/
    "[" {
      if (bracketed_id_str)
        {
 -      ROLLBACK_CURRENT_TOKEN;
 -      BEGIN SC_RETURN_BRACKETED_ID;
 -      *loc = id_loc;
 -      return ID;
 +        ROLLBACK_CURRENT_TOKEN;
 +        BEGIN SC_RETURN_BRACKETED_ID;
 +        *loc = id_loc;
 +        return ID;
        }
      else
        {
 -      bracketed_id_start = loc->start;
 -      bracketed_id_context_state = YY_START;
 -      BEGIN SC_BRACKETED_ID;
 +        bracketed_id_start = loc->start;
 +        bracketed_id_context_state = YY_START;
 +        BEGIN SC_BRACKETED_ID;
        }
    }
    ":" {
    {id} {
      if (bracketed_id_str)
        {
 -      complain_at (*loc, _("unexpected identifier in bracketed name: %s"),
 -                   quote (yytext));
 +        complain (loc, complaint,
 +                  _("unexpected identifier in bracketed name: %s"),
 +                  quote (yytext));
        }
      else
        {
 -      bracketed_id_str = uniqstr_new (yytext);
 -      bracketed_id_loc = *loc;
 +        bracketed_id_str = uniqstr_new (yytext);
 +        bracketed_id_loc = *loc;
        }
    }
    "]" {
      BEGIN bracketed_id_context_state;
      if (bracketed_id_str)
        {
 -      if (INITIAL == bracketed_id_context_state)
 -        {
 -          val->uniqstr = bracketed_id_str;
 -          bracketed_id_str = 0;
 -          *loc = bracketed_id_loc;
 -          return BRACKETED_ID;
 -        }
 +        if (INITIAL == bracketed_id_context_state)
 +          {
 +            val->uniqstr = bracketed_id_str;
 +            bracketed_id_str = 0;
 +            *loc = bracketed_id_loc;
 +            return BRACKETED_ID;
 +          }
        }
      else
 -      complain_at (*loc, _("an identifier expected"));
 +      complain (loc, complaint, _("an identifier expected"));
    }
  
    [^\].A-Za-z0-9_/ \f\n\t\v]+|. {
 -    complain_at (*loc, "%s: %s",
 -                 ngettext ("invalid character in bracketed name",
 -                           "invalid characters in bracketed name", yyleng),
 -                 quote_mem (yytext, yyleng));
 +    complain (loc, complaint, "%s: %s",
 +              ngettext ("invalid character in bracketed name",
 +                        "invalid characters in bracketed name", yyleng),
 +              quote_mem (yytext, yyleng));
    }
  
    <<EOF>> {
  <SC_YACC_COMMENT>
  {
    "*/"     BEGIN context_state;
 -  .|\n           continue;
 +  .|\n     continue;
    <<EOF>>  unexpected_eof (token_start, "*/"); BEGIN context_state;
  }
  
  <SC_COMMENT>
  {
    "*"{splice}"/"  STRING_GROW; BEGIN context_state;
 -  <<EOF>>       unexpected_eof (token_start, "*/"); BEGIN context_state;
 +  <<EOF>>         unexpected_eof (token_start, "*/"); BEGIN context_state;
  }
  
  
  
  <SC_LINE_COMMENT>
  {
 -  "\n"                 STRING_GROW; BEGIN context_state;
 -  {splice}     STRING_GROW;
 -  <<EOF>>      BEGIN context_state;
 +  "\n"           STRING_GROW; BEGIN context_state;
 +  {splice}       STRING_GROW;
 +  <<EOF>>        BEGIN context_state;
  }
  
  
  
    /*----------------------------------------------------------.
    | Scanning a Bison character literal, decoding its escapes. |
 -  | The initial quote is already eaten.                             |
 +  | The initial quote is already eaten.                       |
    `----------------------------------------------------------*/
  
  <SC_ESCAPED_CHARACTER>
        /* FIXME: Eventually, make these errors.  */
        if (last_string[0] == '\0')
          {
 -          warn_at (*loc, _("empty character literal"));
 +          complain (loc, Wother, _("empty character literal"));
            /* '\0' seems dangerous even if we are about to complain.  */
            val->character = '\'';
          }
        else if (last_string[1] != '\0')
 -        warn_at (*loc, _("extra characters in character literal"));
 +        complain (loc, Wother,
 +                  _("extra characters in character literal"));
      }
      if (yytext[0] == '\n')
        unexpected_newline (token_start, "'");
        /* FIXME: Eventually, make these errors.  */
        if (last_string[0] == '\0')
          {
 -          warn_at (*loc, _("empty character literal"));
 +          complain (loc, Wother, _("empty character literal"));
            /* '\0' seems dangerous even if we are about to complain.  */
            val->character = '\'';
          }
        else if (last_string[1] != '\0')
 -        warn_at (*loc, _("extra characters in character literal"));
 +        complain (loc, Wother,
 +                  _("extra characters in character literal"));
      }
      unexpected_eof (token_start, "'");
      STRING_FREE;
    }
  }
  
 -<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING>
 +  /*-----------------------------------------------------------.
 +  | Scanning a Bison nested tag.  The initial angle bracket is |
 +  | already eaten.                                             |
 +  `-----------------------------------------------------------*/
 +
 +<SC_TAG>
  {
 -  \0      complain_at (*loc, _("invalid null character"));
 -}
 +  ">" {
 +    --nesting;
 +    if (nesting < 0)
 +      {
 +        STRING_FINISH;
 +        loc->start = token_start;
 +        val->uniqstr = uniqstr_new (last_string);
 +        STRING_FREE;
 +        BEGIN INITIAL;
 +        return TAG;
 +      }
 +    STRING_GROW;
 +  }
  
 +  [^<>]+ STRING_GROW;
 +  "<"+   STRING_GROW; nesting += yyleng;
 +
 +  <<EOF>> {
 +    unexpected_eof (token_start, ">");
 +    STRING_FINISH;
 +    loc->start = token_start;
 +    val->uniqstr = uniqstr_new (last_string);
 +    STRING_FREE;
 +    BEGIN INITIAL;
 +    return TAG;
 +  }
 +}
  
    /*----------------------------.
    | Decode escaped characters.  |
    \\[0-7]{1,3} {
      unsigned long int c = strtoul (yytext + 1, NULL, 8);
      if (!c || UCHAR_MAX < c)
 -      complain_at (*loc, _("invalid number after \\-escape: %s"),
 +      complain (loc, complaint, _("invalid number after \\-escape: %s"),
                     yytext+1);
      else
        obstack_1grow (&obstack_for_string, c);
      verify (UCHAR_MAX < ULONG_MAX);
      unsigned long int c = strtoul (yytext + 2, NULL, 16);
      if (!c || UCHAR_MAX < c)
 -      complain_at (*loc, _("invalid number after \\-escape: %s"),
 +      complain (loc, complaint, _("invalid number after \\-escape: %s"),
                     yytext+1);
      else
        obstack_1grow (&obstack_for_string, c);
    }
  
 -  \\a obstack_1grow (&obstack_for_string, '\a');
 -  \\b obstack_1grow (&obstack_for_string, '\b');
 -  \\f obstack_1grow (&obstack_for_string, '\f');
 -  \\n obstack_1grow (&obstack_for_string, '\n');
 -  \\r obstack_1grow (&obstack_for_string, '\r');
 -  \\t obstack_1grow (&obstack_for_string, '\t');
 -  \\v obstack_1grow (&obstack_for_string, '\v');
 +  \\a   obstack_1grow (&obstack_for_string, '\a');
 +  \\b   obstack_1grow (&obstack_for_string, '\b');
 +  \\f   obstack_1grow (&obstack_for_string, '\f');
 +  \\n   obstack_1grow (&obstack_for_string, '\n');
 +  \\r   obstack_1grow (&obstack_for_string, '\r');
 +  \\t   obstack_1grow (&obstack_for_string, '\t');
 +  \\v   obstack_1grow (&obstack_for_string, '\v');
  
    /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
    \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]);
    \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
      int c = convert_ucn_to_byte (yytext);
      if (c <= 0)
 -      complain_at (*loc, _("invalid number after \\-escape: %s"),
 +      complain (loc, complaint, _("invalid number after \\-escape: %s"),
                     yytext+1);
      else
        obstack_1grow (&obstack_for_string, c);
    }
 -  \\(.|\n)    {
 +  \\(.|\n)      {
      char const *p = yytext + 1;
      /* Quote only if escaping won't make the character visible.  */
      if (c_isspace ((unsigned char) *p) && c_isprint ((unsigned char) *p))
        p = quote (p);
      else
        p = quotearg_style_mem (escape_quoting_style, p, 1);
 -    complain_at (*loc, _("invalid character after \\-escape: %s"), p);
 +    complain (loc, complaint, _("invalid character after \\-escape: %s"),
 +                 p);
    }
  }
  
  
  <SC_CHARACTER,SC_STRING>
  {
 -  {splice}|\\{splice}[^\n\[\]]        STRING_GROW;
 +  {splice}|\\{splice}[^\n\[\]]  STRING_GROW;
  }
  
  <SC_CHARACTER>
  {
 -  "'"         STRING_GROW; BEGIN context_state;
 -  \n          unexpected_newline (token_start, "'"); BEGIN context_state;
 -  <<EOF>>     unexpected_eof (token_start, "'"); BEGIN context_state;
 +  "'"           STRING_GROW; BEGIN context_state;
 +  \n            unexpected_newline (token_start, "'"); BEGIN context_state;
 +  <<EOF>>       unexpected_eof (token_start, "'"); BEGIN context_state;
  }
  
  <SC_STRING>
  {
 -  "\""                STRING_GROW; BEGIN context_state;
 -  \n          unexpected_newline (token_start, "\""); BEGIN context_state;
 -  <<EOF>>     unexpected_eof (token_start, "\""); BEGIN context_state;
 +  "\""          STRING_GROW; BEGIN context_state;
 +  \n            unexpected_newline (token_start, "\""); BEGIN context_state;
 +  <<EOF>>       unexpected_eof (token_start, "\""); BEGIN context_state;
  }
  
  
    | Strings, comments etc. can be found in user code.  |
    `---------------------------------------------------*/
  
 -<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>
 +<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_PREDICATE>
  {
    "'" {
      STRING_GROW;
  
  
    /*-----------------------------------------------------------.
 -  | Scanning some code in braces (actions). The initial "{" is |
 -  | already eaten.                                             |
 +  | Scanning some code in braces (actions, predicates). The    |
 +  | initial "{" is already eaten.                              |
    `-----------------------------------------------------------*/
  
 -<SC_BRACED_CODE>
 +<SC_BRACED_CODE,SC_PREDICATE>
  {
 -  "{"|"<"{splice}"%"  STRING_GROW; braces_level++;
 -  "%"{splice}">"      STRING_GROW; braces_level--;
 -  "}" {
 -    obstack_1grow (&obstack_for_string, '}');
 -
 -    --braces_level;
 -    if (braces_level < 0)
 -      {
 -      STRING_FINISH;
 -      loc->start = code_start;
 -      val->code = last_string;
 -      BEGIN INITIAL;
 -      return BRACED_CODE;
 -      }
 -  }
 +  "{"|"<"{splice}"%"  STRING_GROW; nesting++;
 +  "%"{splice}">"      STRING_GROW; nesting--;
  
    /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly
       (as '<' '<%').  */
    "<"{splice}"<"  STRING_GROW;
  
    <<EOF>> {
 +    int token = (YY_START == SC_BRACED_CODE) ? BRACED_CODE : BRACED_PREDICATE;
      unexpected_eof (code_start, "}");
      STRING_FINISH;
      loc->start = code_start;
      val->code = last_string;
      BEGIN INITIAL;
 -    return BRACED_CODE;
 +    return token;
    }
  }
  
 +<SC_BRACED_CODE>
 +{
 +  "}" {
 +    obstack_1grow (&obstack_for_string, '}');
 +
 +    --nesting;
 +    if (nesting < 0)
 +      {
 +        STRING_FINISH;
 +        loc->start = code_start;
 +        val->code = last_string;
 +        BEGIN INITIAL;
 +        return BRACED_CODE;
 +      }
 +  }
 +}
 +
 +<SC_PREDICATE>
 +{
 +  "}" {
 +    --nesting;
 +    if (nesting < 0)
 +      {
 +        STRING_FINISH;
 +        loc->start = code_start;
 +        val->code = last_string;
 +        BEGIN INITIAL;
 +        return BRACED_PREDICATE;
 +      }
 +    else
 +      obstack_1grow (&obstack_for_string, '}');
 +  }
 +}
  
    /*--------------------------------------------------------------.
    | Scanning some prologue: from "%{" (already scanned) to "%}".  |
    | By default, grow the string obstack with the input.  |
    `-----------------------------------------------------*/
  
 -<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>.    |
 -<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>\n STRING_GROW;
 +<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>. |
 +  <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE>\n    STRING_GROW;
  
  %%
  
@@@ -860,35 -732,35 +860,35 @@@ no_cr_read (FILE *fp, char *buf, size_
      {
        char *w = memchr (buf, '\r', bytes_read);
        if (w)
 -      {
 -        char const *r = ++w;
 -        char const *lim = buf + bytes_read;
 -
 -        for (;;)
 -          {
 -            /* Found an '\r'.  Treat it like '\n', but ignore any
 -               '\n' that immediately follows.  */
 -            w[-1] = '\n';
 -            if (r == lim)
 -              {
 -                int ch = getc (fp);
 -                if (ch != '\n' && ungetc (ch, fp) != ch)
 -                  break;
 -              }
 -            else if (*r == '\n')
 -              r++;
 -
 -            /* Copy until the next '\r'.  */
 -            do
 -              {
 -                if (r == lim)
 -                  return w - buf;
 -              }
 -            while ((*w++ = *r++) != '\r');
 -          }
 -
 -        return w - buf;
 -      }
 +        {
 +          char const *r = ++w;
 +          char const *lim = buf + bytes_read;
 +
 +          for (;;)
 +            {
 +              /* Found an '\r'.  Treat it like '\n', but ignore any
 +                 '\n' that immediately follows.  */
 +              w[-1] = '\n';
 +              if (r == lim)
 +                {
 +                  int ch = getc (fp);
 +                  if (ch != '\n' && ungetc (ch, fp) != ch)
 +                    break;
 +                }
 +              else if (*r == '\n')
 +                r++;
 +
 +              /* Copy until the next '\r'.  */
 +              do
 +                {
 +                  if (r == lim)
 +                    return w - buf;
 +                }
 +              while ((*w++ = *r++) != '\r');
 +            }
 +
 +          return w - buf;
 +        }
      }
  
    return bytes_read;
@@@ -908,8 -780,7 +908,8 @@@ scan_integer (char const *number, int b
  
    if (INT_MAX < num)
      {
 -      complain_at (loc, _("integer out of range: %s"), quote (number));
 +      complain (&loc, complaint, _("integer out of range: %s"),
 +                   quote (number));
        num = INT_MAX;
      }
  
  /*------------------------------------------------------------------.
  | Convert universal character name UCN to a single-byte character,  |
  | and return that character.  Return -1 if UCN does not correspond  |
 -| to a single-byte character.                                     |
 +| to a single-byte character.                                       |
  `------------------------------------------------------------------*/
  
  static int
@@@ -948,22 -819,22 +948,22 @@@ convert_ucn_to_byte (char const *ucn
         about.  */
      static signed char const table[] =
        {
 -      '\0',   -1,   -1,   -1,   -1,   -1,   -1, '\a',
 -      '\b', '\t', '\n', '\v', '\f', '\r',   -1,   -1,
 -        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 -        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 -       ' ',  '!',  '"',  '#',  '$',  '%',  '&', '\'',
 -       '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
 -       '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
 -       '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
 -       '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
 -       'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
 -       'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
 -       'X',  'Y',  'Z',  '[', '\\',  ']',  '^',  '_',
 -       '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
 -       'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
 -       'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
 -       'x',  'y',  'z',  '{',  '|',  '}',  '~'
 +        '\0',   -1,   -1,   -1,   -1,   -1,   -1, '\a',
 +        '\b', '\t', '\n', '\v', '\f', '\r',   -1,   -1,
 +          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 +          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
 +         ' ',  '!',  '"',  '#',  '$',  '%',  '&', '\'',
 +         '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
 +         '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
 +         '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
 +         '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
 +         'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
 +         'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
 +         'X',  'Y',  'Z',  '[', '\\',  ']',  '^',  '_',
 +         '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
 +         'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
 +         'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
 +         'x',  'y',  'z',  '{',  '|',  '}',  '~'
        };
  
      code = code < sizeof table ? table[code] : -1;
@@@ -985,14 -856,14 +985,14 @@@ handle_syncline (char *args, location l
    unsigned long int lineno = strtoul (args, &file, 10);
    if (INT_MAX <= lineno)
      {
 -      warn_at (loc, _("line number overflow"));
 +      complain (&loc, Wother, _("line number overflow"));
        lineno = INT_MAX;
      }
  
 -  file = mbschr (file, '"');
 +  file = strchr (file, '"');
    if (file)
      {
 -      *mbschr (file + 1, '"') = '\0';
 +      *strchr (file + 1, '"') = '\0';
        current_file = uniqstr_new (file + 1);
      }
    boundary_set (&scanner_cursor, current_file, lineno, 1);
  
  /*----------------------------------------------------------------.
  | For a token or comment starting at START, report message MSGID, |
 -| which should say that an end marker was found before                  |
 -| the expected TOKEN_END.                                       |
 +| which should say that an end marker was found before            |
 +| the expected TOKEN_END.                                         |
  `----------------------------------------------------------------*/
  
  static void
@@@ -1012,10 -883,10 +1012,10 @@@ unexpected_end (boundary start, char co
    loc.start = start;
    loc.end = scanner_cursor;
    token_end = quote (token_end);
-   // Instead of '\'', display "'".
+   /* Instead of '\'', display "'".  */
 -  if (!strcmp (token_end, "'\\''"))
 +  if (STREQ (token_end, "'\\''"))
      token_end = "\"'\"";
 -  complain_at (loc, _(msgid), token_end);
 +  complain (&loc, complaint, _(msgid), token_end);
  }
  
  
diff --combined src/system.h
index 987ebe2adb2c5368424fd0f8c14503006276912e,35ff876476ae07e0b4dc1fd70b100846b4fa07cf..01cce6dcf9b14feecedfa10997d0dfe8ee1fac4c
     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
 +#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 ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
 +#define STREQ(L, R)  (strcmp(L, R) == 0)
 +#define STRNEQ(L, R) (!STREQ(L, R))
  
 -# include <limits.h>
 -# include <stddef.h>
 -# include <stdlib.h>
 -# include <string.h>
 -# include <unistd.h>
 -# include <inttypes.h>
 +/* 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)
 +
 +#include <unistd.h>
 +#include <inttypes.h>
  
  #define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
  #define STREQ(L, R)  (strcmp(L, R) == 0)
  #define STRNEQ(L, R) (!STREQ(L, R))
  
 -# ifndef UINTPTR_MAX
 +#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.
+ /* 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))
 -#   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
  
  
  /*------.
  | 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>
 +
 +/* String-grow: append Str to Obs.  */
  
 -# define obstack_sgrow(Obs, Str)                \
 +#define obstack_sgrow(Obs, Str) \
    obstack_grow (Obs, Str, strlen (Str))
  
  /* Output Str escaped for our postprocessing (i.e., escape M4 special
  
  # define obstack_escape(Obs, Str)                       \
    do {                                                  \
 -    char const *p;                                      \
 -    for (p = Str; *p; p++)                              \
 -      switch (*p)                                       \
 +    char const *p__;                                    \
 +    for (p__ = Str; *p__; p__++)                        \
 +      switch (*p__)                                     \
          {                                               \
          case '$': obstack_sgrow (Obs, "$]["); break;    \
          case '@': obstack_sgrow (Obs, "@@" ); break;    \
          case '[': obstack_sgrow (Obs, "@{" ); break;    \
          case ']': obstack_sgrow (Obs, "@}" ); break;    \
 -        default:  obstack_1grow (Obs, *p   ); break;    \
 +        default:  obstack_1grow (Obs, *p__ ); break;    \
          }                                               \
    } 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
  
  
  
  | Free a linked list.  |
  `---------------------*/
  
 -# define LIST_FREE(Type, List)                  \
 -  do {                                          \
 -    Type *_node, *_next;                        \
 -    for (_node = List; _node; _node = _next)    \
 -      {                                         \
 -        _next = _node->next;                    \
 -        free (_node);                           \
 -      }                                         \
 -  } while (0)
 +#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 f62c43dd9b2b6213e860619af188249d4b8d6cb6,97c08c297c68047f4247ea4b73f3517e1225d78e..84e840fad428f1bcbc52b2b25a42bdf53e813c12
@@@ -1,4 -1,4 +1,4 @@@
 -# Executing Actions.                               -*- Autotest -*-
 +e# Executing Actions.                               -*- Autotest -*-
  
  # Copyright (C) 2001-2012 Free Software Foundation, Inc.
  
@@@ -30,7 -30,7 +30,7 @@@ AT_SETUP([Mid-rule actions]
  
  AT_BISON_OPTION_PUSHDEFS
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %{
  ]AT_YYERROR_DECLARE[
@@@ -90,7 -90,7 +90,7 @@@ AT_DATA_GRAMMAR([[input.y]]
  %code
  {
  # include <stdio.h>
- # include <stdlib.h> // getenv
+ # include <stdlib.h> /* getenv */
  ]AT_YYERROR_DECLARE[
  ]AT_YYLEX_DECLARE[
  }
@@@ -195,7 -195,7 +195,7 @@@ AT_DATA_GRAMMAR([[input.y]]
  %code
  {
  # include <stdio.h>
- # include <stdlib.h> // getenv
+ # include <stdlib.h> /* getenv */
  ]AT_YYERROR_DECLARE[
  ]AT_YYLEX_DECLARE[
  }
@@@ -223,6 -223,7 +223,7 @@@ main (void
  
    TEST(7, 2, 0, 2);
    TEST(8, 0, 8, 0);
+   return 0;
  }
  ]])
  
@@@ -257,7 -258,7 +258,7 @@@ AT_SETUP([Exotic Dollars]
  
  AT_BISON_OPTION_PUSHDEFS
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %{
  ]AT_YYERROR_DECLARE[
@@@ -313,7 -314,7 +314,7 @@@ AT_PARSER_CHECK([./input], 0
  AT_DATA_GRAMMAR([[input.y]],
  [[
  %{
 -#include <stdio.h>
 +# include <stdio.h>
  ]AT_YYERROR_DECLARE[
  ]AT_YYLEX_DECLARE[
    typedef struct { int val; } stype;
@@@ -481,7 -482,7 +482,7 @@@ line
        $$ = -1;
        V(line,  $$, @$, ": ");
        V('(',   $1, @1, " ");
 -      fprintf (stderr, "error (@%d-%d) ", RANGE (@2));
 +      fprintf (stderr, "error (@%d-%d) ", RANGE(@2));
        V(')',   $3, @3, "\n");
      }
  ;
@@@ -737,7 -738,7 +738,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
@@@ -748,13 -749,13 +749,13 @@@ AT_CLEANU
  
  
  AT_CHECK_PRINTER_AND_DESTRUCTOR([])
 -AT_CHECK_PRINTER_AND_DESTRUCTOR([], [ with union])
 +AT_CHECK_PRINTER_AND_DESTRUCTOR([], [with union])
  
  AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"])
 -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [ with union])
 +AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [with union])
  
  AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser])
 -AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union])
 +AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union])
  
  
  
  AT_SETUP([Default tagless %printer and %destructor])
  AT_BISON_OPTION_PUSHDEFS([%locations])
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %locations
  
@@@ -818,10 -819,7 +819,10 @@@ main (void
  }
  ]])
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:23.3-5: warning: useless %destructor for type <*> [-Wother]
 +input.y:23.3-5: warning: useless %printer for type <*> [-Wother]
 +]])
  AT_COMPILE([input])
  AT_PARSER_CHECK([./input], 1,
  [[<> destructor for 'd' @ 4.
@@@ -869,7 -867,7 +870,7 @@@ AT_CLEANU
  AT_SETUP([Default tagged and per-type %printer and %destructor])
  AT_BISON_OPTION_PUSHDEFS
  AT_DATA_GRAMMAR([[input.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  
  %{
@@@ -933,10 -931,7 +934,10 @@@ main (void
  }
  ]])
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother]
 +input.y:22.3-4: warning: useless %printer for type <> [-Wother]
 +]])
  AT_COMPILE([input])
  AT_PARSER_CHECK([./input], 1,
  [[<*>/<field2>/e destructor.
@@@ -995,16 -990,16 +996,16 @@@ AT_CLEANU
  
  AT_SETUP([Default %printer and %destructor for user-defined end token])
  
 -# _AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(TYPED)
 -# -------------------------------------------------------------
 -m4_define([_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN],
 +# AT_TEST(TYPED)
 +# --------------
 +m4_pushdef([AT_TEST],
  [m4_if($1, 0,
    [m4_pushdef([kind], []) m4_pushdef([not_kind], [*])],
    [m4_pushdef([kind], [*]) m4_pushdef([not_kind], [])])
  
  AT_BISON_OPTION_PUSHDEFS([%locations])
  AT_DATA_GRAMMAR([[input]]$1[[.y]],
 -[[%error-verbose
 +[[%define parse.error verbose
  %debug
  %locations
  
@@@ -1065,17 -1060,8 +1066,17 @@@ main (void
  ]])
  AT_BISON_OPTION_POPDEFS
  
 -AT_BISON_CHECK([-o input$1.c input$1.y])
 +AT_BISON_CHECK([-o input$1.c input$1.y], [], [],
 +[m4_if([$1], [0],
 +[[input0.y:23.3-5: warning: useless %destructor for type <*> [-Wother]
 +input0.y:23.3-5: warning: useless %printer for type <*> [-Wother]
 +]],
 +[[input1.y:23.3-4: warning: useless %destructor for type <> [-Wother]
 +input1.y:23.3-4: warning: useless %printer for type <> [-Wother]
 +]])])
 +
  AT_COMPILE([input$1])
 +
  AT_PARSER_CHECK([./input$1], 0,
  [[<]]kind[[> for 'E' @ 1.
  <]]kind[[> for 'S' @ 1.
@@@ -1098,10 -1084,8 +1099,10 @@@ m4_popdef([kind]
  m4_popdef([not_kind])
  ])
  
 -_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(0)
 -_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(1)
 +AT_TEST(0)
 +AT_TEST(1)
 +
 +m4_popdef([AT_TEST])
  
  AT_CLEANUP
  
@@@ -1161,10 -1145,7 +1162,10 @@@ main (void
  ]])
  AT_BISON_OPTION_POPDEFS
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:21.6-8: warning: useless %destructor for type <*> [-Wother]
 +input.y:21.6-8: warning: useless %printer for type <*> [-Wother]
 +]])
  AT_COMPILE([input])
  AT_PARSER_CHECK([./input], [1], [],
  [[Starting parse
@@@ -1263,10 -1244,7 +1264,10 @@@ main (void
  ]])
  AT_BISON_OPTION_POPDEFS
  
 -AT_BISON_CHECK([-o input.c input.y])
 +AT_BISON_CHECK([-o input.c input.y], [], [],
 +[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother]
 +input.y:22.3-4: warning: useless %printer for type <> [-Wother]
 +]])
  AT_COMPILE([input])
  
  AT_CLEANUP
@@@ -1323,23 -1301,15 +1324,23 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([-o input.c input.y], 0,,
 -[[input.y:33.3-23: warning: unset value: $$
 -input.y:32.3-23: warning: unused value: $3
 +[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother]
 +input.y:24.70-72: warning: useless %printer for type <*> [-Wother]
 +input.y:33.3-23: warning: unset value: $$ [-Wother]
 +input.y:32.3-23: warning: unused value: $3 [-Wother]
  ]])
  
  AT_BISON_CHECK([-fcaret -o input.c input.y], 0,,
 -[[input.y:33.3-23: warning: unset value: $$
 +[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother]
 + %printer { fprintf (yyoutput, "<*> printer should not be called"); } <*>
 +                                                                      ^^^
 +input.y:24.70-72: warning: useless %printer for type <*> [-Wother]
 + %printer { fprintf (yyoutput, "<*> printer should not be called"); } <*>
 +                                                                      ^^^
 +input.y:33.3-23: warning: unset value: $$ [-Wother]
     {           @$ = 4; } // Only used.
     ^^^^^^^^^^^^^^^^^^^^^
 -input.y:32.3-23: warning: unused value: $3
 +input.y:32.3-23: warning: unused value: $3 [-Wother]
     { USE ($$); @$ = 3; } // Only set.
     ^^^^^^^^^^^^^^^^^^^^^
  ]])
@@@ -1442,9 -1412,8 +1443,9 @@@ AT_CHECK_ACTION_LOCATIONS([[%printer]]
  ## Qualified $$ in actions.  ##
  ## ------------------------- ##
  
 -# Check that we can used qualified $$ (v.g., $<type>$) not only in
 -# rule actions, but also where $$ is valid: %printer and %destructor.
 +# Check that we can use qualified $$ (v.g., $<type>$) not only in rule
 +# actions, but also where $$ is valid: %destructor/%printer and
 +# %initial-action.
  #
  # FIXME: Not actually checking %destructor, but it's the same code as
  # %printer...
  m4_pushdef([AT_TEST],
  [AT_SETUP([[Qualified $$ in actions: $1]])
  
 -AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1"])
 +AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"])
  
  AT_DATA_GRAMMAR([[input.y]],
  [[%skeleton "$1"
 -%defines   // FIXME: Mandated by lalr1.cc in Bison 2.6.
 -%locations // FIXME: Mandated by lalr1.cc in Bison 2.6.
  %debug
  %code requires
  {
@@@ -1536,7 -1507,10 +1537,7 @@@ AT_FULL_COMPILE([[input]]
  AT_PARSER_CHECK([./input], 0, [], [stderr])
  # Don't be too picky on the traces, GLR is not exactly the same.  Keep
  # only the lines from the printer.
 -#
 -# Don't care about locations.  FIXME: remove their removal when Bison
 -# supports C++ without locations.
 -AT_CHECK([[sed -ne 's/([-0-9.]*: /(/;/ival:/p' stderr]], 0,
 +AT_CHECK([[sed -ne '/ival:/p' stderr]], 0,
  [[Reading a token: Next token is token UNTYPED (ival: 10, fval: 0.1)
  Shifting token UNTYPED (ival: 10, fval: 0.1)
  Reading a token: Next token is token INT (ival: 20, fval: 0.2)
@@@ -1574,37 -1548,37 +1575,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
@@@ -1621,41 -1595,41 +1622,41 @@@ string;"
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o input.c input.y]], [0], [],
 -[[input.y:8.48: warning: a ';' might be needed at the end of action code
 +[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:8.48:     future versions of Bison will not add the ';'
 -input.y:9.48: warning: a ';' might be needed at the end of action code
 +input.y:9.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:9.48:     future versions of Bison will not add the ';'
 -input.y:10.48: warning: a ';' might be needed at the end of action code
 +input.y:10.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:10.48:     future versions of Bison will not add the ';'
 -input.y:11.48: warning: a ';' might be needed at the end of action code
 +input.y:11.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:11.48:     future versions of Bison will not add the ';'
 -input.y:12.48: warning: a ';' might be needed at the end of action code
 +input.y:12.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:12.48:     future versions of Bison will not add the ';'
 -input.y:13.48: warning: a ';' might be needed at the end of action code
 +input.y:13.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:13.48:     future versions of Bison will not add the ';'
 -input.y:20.1: warning: a ';' might be needed at the end of action code
 +input.y:20.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:20.1:     future versions of Bison will not add the ';'
 -input.y:21.1: warning: a ';' might be needed at the end of action code
 +input.y:21.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:21.1:     future versions of Bison will not add the ';'
 -input.y:22.1: warning: a ';' might be needed at the end of action code
 +input.y:22.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:22.1:     future versions of Bison will not add the ';'
 -input.y:23.1: warning: a ';' might be needed at the end of action code
 +input.y:23.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:23.1:     future versions of Bison will not add the ';'
 -input.y:24.1: warning: a ';' might be needed at the end of action code
 +input.y:24.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:24.1:     future versions of Bison will not add the ';'
 -input.y:25.1: warning: a ';' might be needed at the end of action code
 +input.y:25.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:25.1:     future versions of Bison will not add the ';'
 -input.y:31.1: warning: a ';' might be needed at the end of action code
 +input.y:31.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:31.1:     future versions of Bison will not add the ';'
 -input.y:32.1: warning: a ';' might be needed at the end of action code
 +input.y:32.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:32.1:     future versions of Bison will not add the ';'
 -input.y:33.1: warning: a ';' might be needed at the end of action code
 +input.y:33.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:33.1:     future versions of Bison will not add the ';'
 -input.y:34.1: warning: a ';' might be needed at the end of action code
 +input.y:34.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:34.1:     future versions of Bison will not add the ';'
 -input.y:35.1: warning: a ';' might be needed at the end of action code
 +input.y:35.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:35.1:     future versions of Bison will not add the ';'
 -input.y:36.1: warning: a ';' might be needed at the end of action code
 +input.y:36.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
  input.y:36.1:     future versions of Bison will not add the ';'
  ]])
  
diff --combined tests/glr-regression.at
index 1ab922386305597a8e4a53a5f36a0f53e43a8a71,e08904b6a91b003f740910b502ec4f1aab38c08e..41fc7bc73a3872cd7d6ec975ba1d2b34773139a9
@@@ -88,8 -88,8 +88,8 @@@ yylex (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr1.c glr-regr1.y]], 0, [],
 -[glr-regr1.y: conflicts: 1 shift/reduce
 -])
 +[[glr-regr1.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +]])
  AT_COMPILE([glr-regr1])
  AT_PARSER_CHECK([[./glr-regr1 BPBPB]], 0,
  [[E -> 'B'
@@@ -195,10 -195,11 +195,11 @@@ yylex (void
  int
  main (int argc, char **argv)
  {
+   int res;
    input = stdin;
    if (argc == 2 && !(input = fopen (argv[1], "r")))
      return 3;
-   int res = yyparse ();
+   res = yyparse ();
    if (argc == 2 && fclose (input))
      return 4;
    return res;
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr2a.c glr-regr2a.y]], 0, [],
 -[glr-regr2a.y: conflicts: 2 shift/reduce
 -])
 +[[glr-regr2a.y: warning: 2 shift/reduce conflicts [-Wconflicts-sr]
 +]])
  AT_COMPILE([glr-regr2a])
  
  AT_DATA([input1.txt],
@@@ -327,10 -328,11 +328,11 @@@ int yylex (void
  int
  main(int argc, char* argv[])
  {
+   int res;
    input = stdin;
    if (argc == 2 && !(input = fopen (argv[1], "r")))
      return 3;
-   int res = yyparse ();
+   res = yyparse ();
    if (argc == 2 && fclose (input))
      return 4;
    return res;
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr3.c glr-regr3.y]], 0, [],
 -[glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce
 -])
 +[[glr-regr3.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +glr-regr3.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr3])
  
  AT_DATA([input.txt],
@@@ -435,8 -436,8 +437,8 @@@ merge (YYSTYPE s1, YYSTYPE s2
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr4.c glr-regr4.y]], 0, [],
 -[glr-regr4.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr4.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr4])
  
  AT_PARSER_CHECK([[./glr-regr4]], 0,
@@@ -495,8 -496,8 +497,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr5.c glr-regr5.y]], 0, [],
 -[glr-regr5.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr5.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr5])
  
  AT_PARSER_CHECK([[./glr-regr5]], 0, [],
@@@ -547,8 -548,8 +549,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr6.c glr-regr6.y]], 0, [],
 -[glr-regr6.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr6.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr6])
  
  AT_PARSER_CHECK([[./glr-regr6]], 0,
@@@ -636,8 -637,8 +638,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr7.c glr-regr7.y]], 0, [],
 -[glr-regr7.y: conflicts: 2 reduce/reduce
 -])
 +[[glr-regr7.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr7])
  
  AT_PARSER_CHECK([[./glr-regr7]], 2, [],
@@@ -730,8 -731,8 +732,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr8.c glr-regr8.y]], 0, [],
 -[glr-regr8.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr8.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr8])
  
  AT_PARSER_CHECK([[./glr-regr8]], 0,
@@@ -810,8 -811,8 +812,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr9.c glr-regr9.y]], 0, [],
 -[glr-regr9.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr9.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr9])
  
  AT_PARSER_CHECK([[./glr-regr9]], 0, [],
@@@ -866,8 -867,8 +868,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr10.c glr-regr10.y]], 0, [],
 -[glr-regr10.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr10.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr10])
  
  AT_PARSER_CHECK([[./glr-regr10]], 0, [], [])
@@@ -924,8 -925,8 +926,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr11.c glr-regr11.y]], 0, [],
 -[glr-regr11.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr11.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr11])
  
  AT_PARSER_CHECK([[./glr-regr11]], 0, [], [])
@@@ -1045,9 -1046,8 +1047,9 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr12.c glr-regr12.y]], 0, [],
 -[glr-regr12.y: conflicts: 1 shift/reduce, 1 reduce/reduce
 -])
 +[[glr-regr12.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +glr-regr12.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr12])
  
  AT_PARSER_CHECK([[./glr-regr12]], 0, [], [])
@@@ -1376,8 -1376,8 +1378,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr14.c glr-regr14.y]], 0, [],
 -[glr-regr14.y: conflicts: 3 reduce/reduce
 -])
 +[[glr-regr14.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr14])
  
  AT_PARSER_CHECK([[./glr-regr14]], 0,
@@@ -1469,8 -1469,8 +1471,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr15.c glr-regr15.y]], 0, [],
 -[glr-regr15.y: conflicts: 2 reduce/reduce
 -])
 +[[glr-regr15.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr15])
  
  AT_PARSER_CHECK([[./glr-regr15]], 0, [],
@@@ -1529,8 -1529,8 +1531,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr16.c glr-regr16.y]], 0, [],
 -[glr-regr16.y: conflicts: 1 reduce/reduce
 -])
 +[[glr-regr16.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr16])
  
  AT_PARSER_CHECK([[./glr-regr16]], 0, [],
@@@ -1607,8 -1607,8 +1609,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr17.c glr-regr17.y]], 0, [],
 -[glr-regr17.y: conflicts: 3 reduce/reduce
 -])
 +[[glr-regr17.y: warning: 3 reduce/reduce conflicts [-Wconflicts-rr]
 +]])
  AT_COMPILE([glr-regr17])
  
  AT_PARSER_CHECK([[./glr-regr17]], 0, [],
@@@ -1662,11 -1662,11 +1664,11 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
 -[glr-regr18.y:26.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
 +[[glr-regr18.y:26.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
  glr-regr18.y:25.18-24:     previous declaration
  glr-regr18.y:27.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
  glr-regr18.y:26.18-24:     previous declaration
 -])
 +]])
  
  AT_CLEANUP
  
@@@ -1710,8 -1710,8 +1712,8 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([[-o input.c input.y]], 0, [],
 -[input.y: conflicts: 1 reduce/reduce
 -])
 +[[input.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +]])
  AT_COMPILE([input])
  
  AT_PARSER_CHECK([[./input]], 1, [],