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

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

diff --cc Makefile.am
Simple merge
diff --cc NEWS
index 406521b9a9dfd0ca61761d156f5fa873b1c33623,42c79408e9d4b17cebc6e97beaca21fc9fb3d98b..d7d89d2a86589bb9dcb73364dcd55da9ce306a25
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -2,573 -2,14 +2,583 @@@ GNU Bison NEW
  
  * Noteworthy changes in release ?.? (????-??-??) [?]
  
 +** WARNING: Future backward-incompatibilities!
 +
 +  Like other GNU packages, Bison will start using some of the C99 features
 +  for its own code, especially the definition of variables after statements.
 +  The generated C parsers still aim at C90.
 +
 +** Backward incompatible changes
 +
 +*** Obsolete features
 +
 +  Support for YYFAIL is removed (deprecated in Bison 2.4.2): use YYERROR.
 +
 +  Support for yystype and yyltype is removed (deprecated in Bison 1.875):
 +  use YYSTYPE and YYLTYPE.
 +
 +  Support for YYLEX_PARAM and YYPARSE_PARAM is removed (deprecated in Bison
 +  1.875): use %lex-param, %parse-param, or %param.
 +
 +  Missing semicolons at the end of actions are no longer added (as announced
 +  in the release 2.5).
 +
 +*** Use of YACC='bison -y'
 +
 +  TL;DR: With Autoconf <= 2.69, pass -Wno-yacc to (AM_)YFLAGS if you use
 +  Bison extensions.
 +
 +  Traditional Yacc generates 'y.tab.c' whatever the name of the input file.
 +  Therefore Makefiles written for Yacc expect 'y.tab.c' (and possibly
 +  'y.tab.h' and 'y.outout') to be generated from 'foo.y'.
 +
 +  To this end, for ages, AC_PROG_YACC, Autoconf's macro to look for an
 +  implementation of Yacc, was using Bison as 'bison -y'.  While it does
 +  ensure compatible output file names, it also enables warnings for
 +  incompatibilities with POSIX Yacc.  In other words, 'bison -y' triggers
 +  warnings for Bison extensions.
 +
 +  Autoconf 2.70+ fixes this incompatibility by using YACC='bison -o y.tab.c'
 +  (which also generates 'y.tab.h' and 'y.output' when needed).
 +  Alternatively, disable Yacc warnings by passing '-Wno-yacc' to your Yacc
 +  flags (YFLAGS, or AM_YFLAGS with Automake).
 +
 +** Bug fixes
 +
 +*** The epilogue is no longer affected by internal #defines (glr.c)
 +
 +  The glr.c skeleton uses defines such as #define yylval (yystackp->yyval) in
 +  generated code.  These weren't properly undefined before the inclusion of
 +  the user epilogue, so functions such as the following were butchered by the
 +  preprocessor expansion:
 +
 +    int yylex (YYSTYPE *yylval);
 +
 +  This is fixed: yylval, yynerrs, yychar, and yylloc are now valid
 +  identifiers for user-provided variables.
 +
 +*** stdio.h is no longer needed when locations are enabled (yacc.c)
 +
 +  Changes in Bison 2.7 introduced a dependency on FILE and fprintf when
 +  locations are enabled.  This is fixed.
 +
 +** Diagnostics reported by Bison
 +
 +  Most of these features were contributed by Théophile Ranquet and Victor
 +  Santet.
 +
 +*** Carets
 +
 +  Version 2.7 introduced caret errors, for a prettier output.  These are now
 +  activated by default.  The old format can still be used by invoking Bison
 +  with -fno-caret (or -fnone).
 +
 +  Some error messages that reproduced excerpts of the grammar are now using
 +  the caret information only.  For instance on:
 +
 +    %%
 +    exp: 'a' | 'a';
 +
 +  Bison 2.7 reports:
 +
 +    in.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +    in.y:2.12-14: warning: rule useless in parser due to conflicts: exp: 'a' [-Wother]
 +
 +  Now bison reports:
 +
 +    in.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +    in.y:2.12-14: warning: rule useless in parser due to conflicts [-Wother]
 +     exp: 'a' | 'a';
 +                ^^^
 +
 +  and "bison -fno-caret" reports:
 +
 +    in.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
 +    in.y:2.12-14: warning: rule useless in parser due to conflicts [-Wother]
 +
 +*** Enhancements of the -Werror option
 +
 +  The -Werror=CATEGORY option is now recognized, and will treat specified
 +  warnings as errors. The warnings need not have been explicitly activated
 +  using the -W option, this is similar to what GCC 4.7 does.
 +
 +  For example, given the following command line, Bison will treat both
 +  warnings related to POSIX Yacc incompatibilities and S/R conflicts as
 +  errors (and only those):
 +
 +    $ bison -Werror=yacc,error=conflicts-sr input.y
 +
 +  If no categories are specified, -Werror will make all active warnings into
 +  errors. For example, the following line does the same the previous example:
 +
 +    $ bison -Werror -Wnone -Wyacc -Wconflicts-sr input.y
 +
 +  (By default -Wconflicts-sr,conflicts-rr,deprecated,other is enabled.)
 +
 +  Note that the categories in this -Werror option may not be prefixed with
 +  "no-". However, -Wno-error[=CATEGORY] is valid.
 +
 +  Note that -y enables -Werror=yacc. Therefore it is now possible to require
 +  Yacc-like behavior (e.g., always generate y.tab.c), but to report
 +  incompatibilities as warnings: "-y -Wno-error=yacc".
 +
 +*** The display of warnings is now richer
 +
 +  The option that controls a given warning is now displayed:
 +
 +    foo.y:4.6: warning: type clash on default action: <foo> != <bar> [-Wother]
 +
 +  In the case of warnings treated as errors, the prefix is changed from
 +  "warning: " to "error: ", and the suffix is displayed, in a manner similar
 +  to GCC, as [-Werror=CATEGORY].
 +
 +  For instance, where the previous version of Bison would report (and exit
 +  with failure):
 +
 +    bison: warnings being treated as errors
 +    input.y:1.1: warning: stray ',' treated as white space
 +
 +  it now reports:
 +
 +    input.y:1.1: error: stray ',' treated as white space [-Werror=other]
 +
 +*** Deprecated constructs
 +
 +  The new 'deprecated' warning category flags obsolete constructs whose
 +  support will be discontinued.  It is enabled by default.  These warnings
 +  used to be reported as 'other' warnings.
 +
 +*** Useless semantic types
 +
 +  Bison now warns about useless (uninhabited) semantic types.  Since
 +  semantic types are not declared to Bison (they are defined in the opaque
 +  %union structure), it is %printer/%destructor directives about useless
 +  types that trigger the warning:
 +
 +    %token <type1> term
 +    %type  <type2> nterm
 +    %printer    {} <type1> <type3>
 +    %destructor {} <type2> <type4>
 +    %%
 +    nterm: term { $$ = $1; };
 +
 +    3.28-34: warning: type <type3> is used, but is not associated to any symbol
 +    4.28-34: warning: type <type4> is used, but is not associated to any symbol
 +
 +*** Undefined but unused symbols
 +
 +  Bison used to raise an error for undefined symbols that are not used in
 +  the grammar.  This is now only a warning.
 +
 +    %printer    {} symbol1
 +    %destructor {} symbol2
 +    %type <type>   symbol3
 +    %%
 +    exp: "a";
 +
 +*** Useless destructors or printers
 +
 +  Bison now warns about useless destructors or printers.  In the following
 +  example, the printer for <type1>, and the destructor for <type2> are
 +  useless: all symbols of <type1> (token1) already have a printer, and all
 +  symbols of type <type2> (token2) already have a destructor.
 +
 +    %token <type1> token1
 +           <type2> token2
 +           <type3> token3
 +           <type4> token4
 +    %printer    {} token1 <type1> <type3>
 +    %destructor {} token2 <type2> <type4>
 +
 +*** Conflicts
 +
 +  The warnings and error messages about shift/reduce and reduce/reduce
 +  conflicts have been normalized.  For instance on the following foo.y file:
 +
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  compare the previous version of bison:
 +
 +    $ bison foo.y
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    $ bison -Werror foo.y
 +    bison: warnings being treated as errors
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +
 +  with the new behavior:
 +
 +    $ bison foo.y
 +    foo.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +    foo.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +    $ bison -Werror foo.y
 +    foo.y: error: 1 shift/reduce conflict [-Werror=conflicts-sr]
 +    foo.y: error: 2 reduce/reduce conflicts [-Werror=conflicts-rr]
 +
 +  When %expect or %expect-rr is used, such as with bar.y:
 +
 +    %expect 0
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  Former behavior:
 +
 +    $ bison bar.y
 +    bar.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    bar.y: expected 0 shift/reduce conflicts
 +    bar.y: expected 0 reduce/reduce conflicts
 +
 +  New one:
 +
 +    $ bison bar.y
 +    bar.y: error: shift/reduce conflicts: 1 found, 0 expected
 +    bar.y: error: reduce/reduce conflicts: 2 found, 0 expected
 +
 +** Incompatibilities with POSIX Yacc
 +
 +  The 'yacc' category is no longer part of '-Wall', enable it explicitly
 +  with '-Wyacc'.
 +
 +** Additional yylex/yyparse arguments
 +
 +  The new directive %param declares additional arguments to both yylex and
 +  yyparse.  The %lex-param, %parse-param, and %param directives support one
 +  or more arguments.  Instead of
 +
 +    %lex-param   {arg1_type *arg1}
 +    %lex-param   {arg2_type *arg2}
 +    %parse-param {arg1_type *arg1}
 +    %parse-param {arg2_type *arg2}
 +
 +  one may now declare
 +
 +    %param {arg1_type *arg1} {arg2_type *arg2}
 +
 +** Variable api.token.prefix
 +
 +  The variable api.token.prefix changes the way tokens are identified in
 +  the generated files.  This is especially useful to avoid collisions
 +  with identifiers in the target language.  For instance
 +
 +    %token FILE for ERROR
 +    %define api.token.prefix "TOK_"
 +    %%
 +    start: FILE for ERROR;
 +
 +  will generate the definition of the symbols TOK_FILE, TOK_for, and
 +  TOK_ERROR in the generated sources.  In particular, the scanner must
 +  use these prefixed token names, although the grammar itself still
 +  uses the short names (as in the sample rule given above).
 +
 +** Variable api.value.type
 +
 +  This new %define variable supersedes the #define macro YYSTYPE.  The use
 +  of YYSTYPE is discouraged.  In particular, #defining YYSTYPE *and* either
 +  using %union or %defining api.value.type results in undefined behavior.
 +
 +  Either define api.value.type, or use "%union":
 +
 +    %union
 +    {
 +      int ival;
 +      char *sval;
 +    }
 +    %token <ival> INT "integer"
 +    %token <sval> STRING "string"
 +    %printer { fprintf (yyo, "%d", $$); } <ival>
 +    %destructor { free ($$); } <sval>
 +
 +    /* In yylex().  */
 +    yylval.ival = 42; return INT;
 +    yylval.sval = "42"; return STRING;
 +
 +  The %define variable api.value.type supports several special values.  The
 +  keyword value 'union' means that the user provides genuine types, not
 +  union member names such as "ival" and "sval" above (WARNING: will fail if
 +  -y/--yacc/%yacc is enabled).
 +
 +    %define api.value.type union
 +    %token <int> INT "integer"
 +    %token <char *> STRING "string"
 +    %printer { fprintf (yyo, "%d", $$); } <int>
 +    %destructor { free ($$); } <char *>
 +
 +    /* In yylex().  */
 +    yylval.INT = 42; return INT;
 +    yylval.STRING = "42"; return STRING;
 +
 +  The keyword value variant is somewhat equivalent, but for C++ special
 +  provision is made to allow classes to be used (more about this below).
 +
 +    %define api.value.type variant
 +    %token <int> INT "integer"
 +    %token <std::string> STRING "string"
 +
 +  Values between braces denote user defined types.  This is where YYSTYPE
 +  used to be used.
 +
 +    %code requires
 +    {
 +      struct my_value
 +      {
 +        enum
 +        {
 +          is_int, is_string
 +        } kind;
 +        union
 +        {
 +          int ival;
 +          char *sval;
 +        } u;
 +      };
 +    }
 +    %define api.value.type {struct my_value}
 +    %token <u.ival> INT "integer"
 +    %token <u.sval> STRING "string"
 +    %printer { fprintf (yyo, "%d", $$); } <u.ival>
 +    %destructor { free ($$); } <u.sval>
 +
 +    /* In yylex().  */
 +    yylval.u.ival = 42; return INT;
 +    yylval.u.sval = "42"; return STRING;
 +
 +** Variable parse.error
 +
 +  This variable controls the verbosity of error messages.  The use of the
 +  %error-verbose directive is deprecated in favor of "%define parse.error
 +  verbose".
 +
 +** Renamed %define variables
 +
 +  The following variables have been renamed for consistency.  Backward
 +  compatibility is ensured, but upgrading is recommended.
 +
 +    lr.default-reductions      -> lr.default-reduction
 +    lr.keep-unreachable-states -> lr.keep-unreachable-state
 +    namespace                  -> api.namespace
 +    stype                      -> api.value.type
 +
 +** Semantic predicates
 +
 +  Contributed by Paul Hilfinger.
 +
 +  The new, experimental, semantic-predicate feature allows actions of the
 +  form "%?{ BOOLEAN-EXPRESSION }", which cause syntax errors (as for
 +  YYERROR) if the expression evaluates to 0, and are evaluated immediately
 +  in GLR parsers, rather than being deferred.  The result is that they allow
 +  the programmer to prune possible parses based on the values of run-time
 +  expressions.
 +
 +** The directive %expect-rr is now an error in non GLR mode
 +
 +  It used to be an error only if used in non GLR mode, _and_ if there are
 +  reduce/reduce conflicts.
 +
 +** Tokens are numbered in their order of appearance
 +
 +  Contributed by Valentin Tolmer.
 +
 +  With '%token A B', A had a number less than the one of B.  However,
 +  precedence declarations used to generate a reversed order.  This is now
 +  fixed, and introducing tokens with any of %token, %left, %right,
 +  %precedence, or %nonassoc yields the same result.
 +
 +  When mixing declarations of tokens with a litteral character (e.g., 'a')
 +  or with an identifier (e.g., B) in a precedence declaration, Bison
 +  numbered the litteral characters first.  For example
 +
 +    %right A B 'c' 'd'
 +
 +  would lead to the tokens declared in this order: 'c' 'd' A B.  Again, the
 +  input order is now preserved.
 +
 +  These changes were made so that one can remove useless precedence and
 +  associativity declarations (i.e., map %nonassoc, %left or %right to
 +  %precedence, or to %token) and get exactly the same output.
 +
 +** Useless precedence and associativity
 +
 +  Contributed by Valentin Tolmer.
 +
 +  When developing and maintaining a grammar, useless associativity and
 +  precedence directives are common.  They can be a nuisance: new ambiguities
 +  arising are sometimes masked because their conflicts are resolved due to
 +  the extra precedence or associativity information.  Furthermore, it can
 +  hinder the comprehension of a new grammar: one will wonder about the role
 +  of a precedence, where in fact it is useless.  The following changes aim
 +  at detecting and reporting these extra directives.
 +
 +*** Precedence warning category
 +
 +  A new category of warning, -Wprecedence, was introduced. It flags the
 +  useless precedence and associativity directives.
 +
 +*** Useless associativity
 +
 +  Bison now warns about symbols with a declared associativity that is never
 +  used to resolve conflicts.  In that case, using %precedence is sufficient;
 +  the parsing tables will remain unchanged.  Solving these warnings may raise
 +  useless precedence warnings, as the symbols no longer have associativity.
 +  For example:
 +
 +    %left '+'
 +    %left '*'
 +    %%
 +    exp:
 +      "number"
 +    | exp '+' "number"
 +    | exp '*' exp
 +    ;
 +
 +  will produce a
 +
 +    warning: useless associativity for '+', use %precedence [-Wprecedence]
 +     %left '+'
 +           ^^^
 +
 +*** Useless precedence
 +
 +  Bison now warns about symbols with a declared precedence and no declared
 +  associativity (i.e., declared with %precedence), and whose precedence is
 +  never used.  In that case, the symbol can be safely declared with %token
 +  instead, without modifying the parsing tables.  For example:
 +
 +    %precedence '='
 +    %%
 +    exp: "var" '=' "number";
 +
 +  will produce a
 +
 +    warning: useless precedence for '=' [-Wprecedence]
 +     %precedence '='
 +                 ^^^
 +
 +*** Useless precedence and associativity
 +
 +  In case of both useless precedence and associativity, the issue is flagged
 +  as follows:
 +
 +    %nonassoc '='
 +    %%
 +    exp: "var" '=' "number";
 +
 +  The warning is:
 +
 +    warning: useless precedence and associativity for '=' [-Wprecedence]
 +     %nonassoc '='
 +               ^^^
 +
 +** Empty rules
 +
 +  With help from Joel E. Denny and Gabriel Rassoul.
 +
 +  Empty rules (i.e., with an empty right-hand side) can now be explicitly
 +  marked by the new %empty directive.  Using %empty on a non-empty rule is
 +  an error.  The new -Wempty-rule warning reports empty rules without
 +  %empty.  On the following grammar:
 +
 +    %%
 +    s: a b c;
 +    a: ;
 +    b: %empty;
 +    c: 'a' %empty;
 +
 +  bison reports:
 +
 +    3.4-5: warning: empty rule without %empty [-Wempty-rule]
 +     a: {}
 +        ^^
 +    5.8-13: error: %empty on non-empty rule
 +     c: 'a' %empty {};
 +            ^^^^^^
 +
 +** Java skeleton improvements
 +
 +  Contributed by Paolo Bonzini.
 +
 +  The constants for token names were moved to the Lexer interface.  Also, it
 +  is possible to add code to the parser's constructors using "%code init"
 +  and "%define init_throws".
 +
 +** C++ skeletons improvements
 +
 +*** The parser header is no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Using %defines is now optional.  Without it, the needed support classes
 +  are defined in the generated parser, instead of additional files (such as
 +  location.hh, position.hh and stack.hh).
 +
 +*** Locations are no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Both lalr1.cc and glr.cc no longer require %location.
 +
 +*** syntax_error exception (lalr1.cc)
 +
 +  The C++ parser features a syntax_error exception, which can be
 +  thrown from the scanner or from user rules to raise syntax errors.
 +  This facilitates reporting errors caught in sub-functions (e.g.,
 +  rejecting too large integral literals from a conversion function
 +  used by the scanner, or rejecting invalid combinations from a
 +  factory invoked by the user actions).
 +
 +*** %define api.value.type variant
 +
 +  This is based on a submission from Michiel De Wilde.  With help
 +  from Théophile Ranquet.
 +
 +  In this mode, complex C++ objects can be used as semantic values.  For
 +  instance:
 +
 +    %token <::std::string> TEXT;
 +    %token <int> NUMBER;
 +    %token SEMICOLON ";"
 +    %type <::std::string> item;
 +    %type <::std::list<std::string>> list;
 +    %%
 +    result:
 +      list  { std::cout << $1 << std::endl; }
 +    ;
 +
 +    list:
 +      %empty        { /* Generates an empty string list. */ }
 +    | list item ";" { std::swap ($$, $1); $$.push_back ($2); }
 +    ;
 +
 +    item:
 +      TEXT    { std::swap ($$, $1); }
 +    | NUMBER  { $$ = string_cast ($1); }
 +    ;
 +
 +*** %define api.token.constructor
 +
 +  When variants are enabled, Bison can generate functions to build the
 +  tokens.  This guarantees that the token type (e.g., NUMBER) is consistent
 +  with the semantic value (e.g., int):
 +
 +    parser::symbol_type yylex ()
 +    {
 +      parser::location_type loc = ...;
 +      ...
 +      return parser::make_TEXT ("Hello, world!", loc);
 +      ...
 +      return parser::make_NUMBER (42, loc);
 +      ...
 +      return parser::make_SEMICOLON (loc);
 +      ...
 +    }
 +
++* Noteworthy changes in release ?.? (????-??-??) [?]
++
+ ** Bug fixes
+ *** Fix compiler attribute portability (yacc.c)
+   With locations enabled, __attribute__ was used unprotected.
+ *** Fix some compiler warnings (lalr1.cc)
  * Noteworthy changes in release 2.7 (2012-12-12) [stable]
  
  ** Bug fixes
diff --cc THANKS
index f30602cb49f49260c6999ab54670f46496e52a6c,a2d3ea231d4e03a7140e89a0f856cecd48b30cf7..a7d1d47ec9c244f9d4dd74dafd2c3e0134a75106
--- 1/THANKS
--- 2/THANKS
+++ b/THANKS
@@@ -107,7 -103,7 +107,8 @@@ Ralf Wildenhues           Ralf.Wildenhu
  Richard Stallman          rms@gnu.org
  Rob Vermaas               rob.vermaas@gmail.com
  Robert Anisko             anisko_r@epita.fr
+ Rob Conde                 rob.conde@ai-solutions.com
 +Roland Levillain          roland@lrde.epita.fr
  Satya Kiran Popuri        satyakiran@gmail.com
  Sebastian Setzer          sebastian.setzer.ext@siemens.com
  Sebastien Fricker         sebastien.fricker@gmail.com
@@@ -126,7 -122,7 +127,8 @@@ Tom Tromey                tromey@cygnus
  Tommy Nordgren            tommy.nordgren@chello.se
  Troy A. Johnson           troyj@ecn.purdue.edu
  Tys Lefering              gccbison@gmail.com
 +Valentin Tolmer           nitnelave1@gmail.com
+ Victor Khomenko           victor.khomenko@newcastle.ac.uk
  Vin Shelton               acs@alumni.princeton.edu
  W.C.A. Wijngaards         wouter@NLnetLabs.nl
  Wayne Green               wayne@infosavvy.com
index c5f87ad281db455fcbe6663845f6693171f6e8b1,0000000000000000000000000000000000000000..8922ea5fec77274a29014aa383b292fd947c2a67
mode 100644,000000..100644
--- /dev/null
@@@ -1,23 -1,0 +1,21 @@@
- ## Makefile for Bison testsuite.
 +# Copyright (C) 2000-2013 Free Software Foundation, Inc.
 +#
 +# This program is free software: you can redistribute it and/or modify
 +# it under the terms of the GNU General Public License as published by
 +# the Free Software Foundation, either version 3 of the License, or
 +# (at your option) any later version.
 +#
 +# This program is distributed in the hope that it will be useful,
 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +# GNU General Public License for more details.
 +#
 +# You should have received a copy of the GNU General Public License
 +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 +
 +EXTRA_DIST +=                                   \
 +  build-aux/cross-options.pl                    \
 +  build-aux/darwin11.4.0.valgrind               \
 +  build-aux/move-if-change                      \
 +  build-aux/prev-version.txt                    \
 +  build-aux/update-b4-copyright
diff --cc data/bison.m4
index dc12ad2bad9faf192b9a9412c20f0075643b59f6,d87082840a3b5ff85047d8593a37267ff8056af6..910cdf26270e79a6cc4a0fddcaa9feb5c116f8e4
@@@ -345,202 -263,8 +345,220 @@@ b4_define_flag_if([nondeterministic]
  b4_define_flag_if([token_table])        # Whether yytoken_table is demanded.
  b4_define_flag_if([yacc])               # Whether POSIX Yacc is emulated.
  
 -# yytoken_table is needed to support verbose errors.
 -b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
 +
 +## --------- ##
 +## Symbols.  ##
 +## --------- ##
 +
 +# In order to unify the handling of the various aspects of symbols
 +# (tag, type_name, whether terminal, etc.), bison.exe defines one
 +# macro per (token, field), where field can has_id, id, etc.: see
 +# src/output.c:prepare_symbols_definitions().
 +#
 +# The various FIELDS are:
 +#
 +# - has_id: 0 or 1.
 +#   Whether the symbol has an id.
 +# - id: string
 +#   If has_id, the id.  Guaranteed to be usable as a C identifier.
 +#   Prefixed by api.token.prefix if defined.
 +# - tag: string.
 +#   A representat of the symbol.  Can be 'foo', 'foo.id', '"foo"' etc.
 +# - user_number: integer
 +#   The assigned (external) number as used by yylex.
 +# - is_token: 0 or 1
 +#   Whether this is a terminal symbol.
 +# - number: integer
 +#   The internalized number (used after yytranslate).
 +# - has_type: 0, 1
 +#   Whether has a semantic value.
 +# - type_tag: string
 +#   When api.value.type=union, the generated name for the union member.
 +#   yytype_INT etc. for symbols that has_id, otherwise yytype_1 etc.
 +# - type
 +#   If it has a semantic value, its type tag, or, if variant are used,
 +#   its type.
 +#   In the case of api.value.type=union, type is the real type (e.g. int).
 +# - has_printer: 0, 1
 +# - printer: string
 +# - printer_file: string
 +# - printer_line: integer
 +#   If the symbol has a printer, everything about it.
 +# - has_destructor, destructor, destructor_file, destructor_line
 +#   Likewise.
 +#
 +# The following macros provide access to these values.
 +
 +# b4_symbol_(NUM, FIELD)
 +# ----------------------
 +# Recover a FIELD about symbol #NUM.  Thanks to m4_indir, fails if
 +# undefined.
 +m4_define([b4_symbol_],
 +[m4_indir([b4_symbol($1, $2)])])
 +
 +
 +# b4_symbol(NUM, FIELD)
 +# ---------------------
 +# Recover a FIELD about symbol #NUM.  Thanks to m4_indir, fails if
 +# undefined.  If FIELD = id, prepend the token prefix.
 +m4_define([b4_symbol],
 +[m4_case([$2],
 +         [id],    [m4_do([b4_percent_define_get([api.token.prefix])],
 +                         [b4_symbol_([$1], [id])])],
 +         [b4_symbol_($@)])])
 +
 +
 +# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
 +# -------------------------------------------
 +# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE.
 +# Otherwise an error.
 +m4_define([b4_symbol_if],
 +[m4_case(b4_symbol([$1], [$2]),
 +         [1], [$3],
 +         [0], [$4],
 +         [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
 +
 +
 +# b4_symbol_tag_comment(SYMBOL-NUM)
 +# ---------------------------------
 +# Issue a comment giving the tag of symbol NUM.
 +m4_define([b4_symbol_tag_comment],
 +[b4_comment([b4_symbol([$1], [tag])])
 +])
 +
 +
 +# b4_symbol_action_location(SYMBOL-NUM, KIND)
 +# -------------------------------------------
 +# Report the location of the KIND action as FILE:LINE.
 +m4_define([b4_symbol_action_location],
 +[b4_symbol([$1], [$2_file]):b4_syncline([b4_symbol([$1], [$2_line])])])
 +
 +
 +# b4_symbol_action(SYMBOL-NUM, KIND)
 +# ----------------------------------
 +# Run the action KIND (destructor or printer) for SYMBOL-NUM.
 +# Same as in C, but using references instead of pointers.
 +m4_define([b4_symbol_action],
 +[b4_symbol_if([$1], [has_$2],
 +[b4_dollar_pushdef([(*yyvaluep)],
 +                   b4_symbol_if([$1], [has_type],
 +                                [m4_dquote(b4_symbol([$1], [type]))]),
 +                   [(*yylocationp)])dnl
 +    b4_symbol_case_([$1])[]dnl
 +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
 +      b4_symbol([$1], [$2])
 +b4_syncline([@oline@], [@ofile@])
 +        break;
 +
 +b4_dollar_popdef[]dnl
 +])])
 +
 +
 +# b4_symbol_destructor(SYMBOL-NUM)
 +# b4_symbol_printer(SYMBOL-NUM)
 +# --------------------------------
 +m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])])
 +m4_define([b4_symbol_printer],    [b4_symbol_action([$1], [printer])])
 +
 +
++# b4_symbol_actions(KIND, [TYPE = yytype])
++# ----------------------------------------
++# Emit the symbol actions for KIND ("printer" or "destructor").
++# Dispatch on TYPE.
++m4_define([b4_symbol_actions],
++[m4_pushdef([b4_actions_], m4_expand([b4_symbol_foreach([b4_symbol_$1])]))dnl
++m4_ifval(m4_defn([b4_actions_]),
++[switch (m4_default([$2], [yytype]))
++    {
++      m4_defn([b4_actions_])
++      default:
++        break;
++    }dnl
++],
++[YYUSE (m4_default([$2], [yytype]));])dnl
++m4_popdef([b4_actions_])dnl
++])
++
 +# b4_symbol_case_(SYMBOL-NUM)
 +# ---------------------------
 +# Issue a "case NUM" for SYMBOL-NUM.
 +m4_define([b4_symbol_case_],
 +[case b4_symbol([$1], [number]): b4_symbol_tag_comment([$1])])
 +])
 +
 +
 +# b4_symbol_foreach(MACRO)
 +# ------------------------
 +# Invoke MACRO(SYMBOL-NUM) for each SYMBOL-NUM.
 +m4_define([b4_symbol_foreach],
 +          [m4_map([$1], m4_defn([b4_symbol_numbers]))])
 +
 +# b4_symbol_map(MACRO)
 +# --------------------
 +# Return a list (possibly empty elements) of MACRO invoked for each
 +# SYMBOL-NUM.
 +m4_define([b4_symbol_map],
 +[m4_map_args_sep([$1(], [)], [,], b4_symbol_numbers)])
 +
 +
 +# b4_token_visible_if(NUM, IF-TRUE, IF-FALSE)
 +# -------------------------------------------
 +# Whether NUM denotes a token that has an exported definition (i.e.,
 +# shows in enum yytokentype).
 +m4_define([b4_token_visible_if],
 +[b4_symbol_if([$1], [is_token],
 +              [b4_symbol_if([$1], [has_id], [$2], [$3])],
 +              [$3])])
 +
 +# b4_token_has_definition(NUM)
 +# ----------------------------
 +# 1 if NUM is visible, nothing otherwise.
 +m4_define([b4_token_has_definition],
 +[b4_token_visible_if([$1], [1])])
 +
 +# b4_any_token_visible_if([IF-TRUE], [IF-FALSE])
 +# ----------------------------------------------
 +# Whether there is a token that needs to be defined.
 +m4_define([b4_any_token_visible_if],
 +[m4_ifval(b4_symbol_foreach([b4_token_has_definition]),
 +          [$1], [$2])])
 +
 +
 +# b4_token_format(FORMAT, NUM)
 +# ----------------------------
 +m4_define([b4_token_format],
 +[b4_token_visible_if([$2],
 +[m4_quote(m4_format([$1],
 +                     [b4_symbol([$2], [id])],
 +                     [b4_symbol([$2], [user_number])]))])])
 +
 +
 +## ------- ##
 +## Types.  ##
 +## ------- ##
 +
 +# b4_type_action_(NUMS)
 +# ---------------------
 +# Run actions for the symbol NUMS that all have the same type-name.
 +# Skip NUMS that have no type-name.
 +#
 +# To specify the action to run, define b4_dollar_dollar(NUMBER,
 +# TAG, TYPE).
 +m4_define([b4_type_action_],
 +[b4_symbol_if([$1], [has_type],
 +[m4_map([      b4_symbol_case_], [$@])[]dnl
 +        b4_dollar_dollar([b4_symbol([$1], [number])],
 +                         [b4_symbol([$1], [tag])],
 +                         [b4_symbol([$1], [type])]);
 +        break;
 +
 +])])
 +
 +# b4_type_foreach(MACRO)
 +# ----------------------
 +# Invoke MACRO(SYMBOL-NUMS) for each set of SYMBOL-NUMS for each type set.
 +m4_define([b4_type_foreach],
 +          [m4_map([$1], m4_defn([b4_type_names]))])
  
  
  
diff --cc data/c.m4
index edf9991ff8d5415b77e4c5e5edd88efa997b6213,b1b6e2895937d19b8521030e4eff2d37d140f6e9..abc769b9c3adfa1483e566ecca61d6d1d19577cc
+++ b/data/c.m4
@@@ -199,11 -187,31 +199,36 @@@ m4_define([b4_table_value_equals]
         [(!!(($2) == ($3)))])])
  
  
+ ## ----------------- ##
+ ## Compiler issues.  ##
+ ## ----------------- ##
+ # b4_attribute_define
+ # -------------------
+ # Provide portability for __attribute__.
+ m4_define([b4_attribute_define],
+ [#ifndef __attribute__
+ /* This feature is available in gcc versions 2.5 and later.  */
+ # if (! defined __GNUC__ || __GNUC__ < 2 \
+       || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
+ #  define __attribute__(Spec) /* empty */
+ # endif
+ #endif
+ /* Suppress unused-variable warnings by "using" E.  */
+ #if ! defined lint || defined __GNUC__
+ # define YYUSE(E) ((void) (E))
+ #else
+ # define YYUSE(E) /* empty */
+ #endif
+ ])
 +## ---------##
 +## Values.  ##
 +## ---------##
 +
 +
  # b4_null_define
  # --------------
  # Portability issues: define a YY_NULL appropriate for the current
@@@ -421,12 -501,7 +446,7 @@@ m4_ifset([b4_parse_param], [, b4_parse_
      yymsg = "Deleting";
    YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
  
-   switch (yytype)
-     {
- ]b4_symbol_foreach([b4_symbol_destructor])dnl
- [      default:
-         break;
-     }
 -  ]b4_symbol_actions([destructors])[
++  ]b4_symbol_actions([destructor])[
  }]dnl
  ])
  
@@@ -449,22 -527,19 +469,17 @@@ b4_locations_if([, [[YYLTYPE const * co
  m4_ifset([b4_parse_param], [, b4_parse_param]))[
  {
    FILE *yyo = yyoutput;
 -  YYUSE (yyo);
 -  if (!yyvaluep)
 -    return;
 -]b4_locations_if([  YYUSE (yylocationp);
 -])dnl
 -b4_parse_param_use[]dnl
 -[# ifdef YYPRINT
 +]b4_parse_param_use([yyo], [yylocationp])dnl
 +[  if (!yyvaluep)
 +    return;]
 +dnl glr.c does not feature yytoknum.
 +m4_if(b4_skeleton, ["yacc.c"],
 +[[# ifdef YYPRINT
    if (yytype < YYNTOKENS)
      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 -# else
 -  YYUSE (yyoutput);
  # endif
 -  ]b4_symbol_actions([printers])[
 +]])dnl
- [  switch (yytype)
-     {
- ]b4_symbol_foreach([b4_symbol_printer])dnl
- [      default:
-         break;
-     }
++  b4_symbol_actions([printer])[
  }
  
  
diff --cc data/glr.c
index 7ab3823589e99d7f05fa02aa69e70e2737fec23a,1a2e6ba68729beaf1517c86ce1c0e35eab8408da..ff70890f334f6b739e94d09d82004ae438ee099f
@@@ -246,13 -246,16 +246,6 @@@ b4_percent_code_get[]dn
  # endif
  #endif
  
- /* Suppress unused-variable warnings by "using" E.  */
- #ifdef __GNUC__
- # define YYUSE(E) ((void) (E))
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
--#else
- # define YYUSE(E) /* empty */
 -]b4_c_function_def([YYID], [static int], [[int i], [i]])[
 -{
 -  return i;
 -}
--#endif
--
  #ifndef YYFREE
  # define YYFREE free
  #endif
diff --cc data/glr.cc
index 0164eda6b439c5ddde10e82bac75b6342f4c32c9,bb0234a7c51eb8270ac0a80bbc47e743824e6c68..e57308bd82514cbebe68a6457acf4fd7b0d6bb5b
@@@ -187,12 -167,7 +187,7 @@@ m4_pushdef([b4_parse_param], m4_defn([b
      std::ostream& yyoutput = debug_stream ();
      std::ostream& yyo = yyoutput;
      YYUSE (yyo);
-     switch (yytype)
-       {
- ]b4_symbol_foreach([b4_symbol_printer])dnl
- [        default:
-           break;
-       }
 -    ]b4_symbol_actions([printers])[
++    ]b4_symbol_actions([printer])[
    }
  
  
diff --cc data/lalr1.cc
index 4eec878abdf9295ec477cf39b6430800803637fb,f6568695bc95473c219b1bf92b361f70a8acadf1..3294f591106d6cbe53c80c32241e1632990861b9
  
  m4_include(b4_pkgdatadir/[c++.m4])
  
 -m4_define([b4_parser_class_name],
 -          [b4_percent_define_get([[parser_class_name]])])
 +# api.value.type=variant is valid.
 +m4_define([b4_value_type_setup_variant])
 +
 +# b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT)
 +# --------------------------------------------------------------
 +# Declare "parser::yy<TABLE-NAME>_" whose contents is CONTENT.
 +m4_define([b4_integral_parser_table_declare],
 +[m4_ifval([$3], [b4_comment([$3], [  ])
 +])dnl
 +  static const b4_int_type_for([$2]) yy$1_[[]];dnl
 +])
  
 -# The header is mandatory.
 -b4_defines_if([],
 -              [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
 +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
 +# -------------------------------------------------------------
 +# Define "parser::yy<TABLE-NAME>_" whose contents is CONTENT.
 +m4_define([b4_integral_parser_table_define],
 +[  const b4_int_type_for([$2])
 +  b4_parser_class_name::yy$1_[[]] =
 +  {
 +  $2
 +  };dnl
 +])
  
 -b4_percent_define_ifdef([[api.location.type]], [],
 -  [# Backward compatibility.
 -  m4_define([b4_location_constructors])
 -  m4_include(b4_pkgdatadir/[location.cc])])
 -m4_include(b4_pkgdatadir/[stack.hh])
 +# b4_symbol_value_template(VAL, [TYPE])
 +# -------------------------------------
 +# Same as b4_symbol_value, but used in a template method.  It makes
 +# a difference when using variants.  Note that b4_value_type_setup_union
 +# overrides b4_symbol_value, so we must override it again.
 +m4_copy([b4_symbol_value], [b4_symbol_value_template])
 +m4_append([b4_value_type_setup_union],
 +          [m4_copy_force([b4_symbol_value_union], [b4_symbol_value_template])])
 +
 +# b4_lhs_value([TYPE])
 +# --------------------
 +# Expansion of $<TYPE>$.
 +m4_define([b4_lhs_value],
 +          [b4_symbol_value([yylhs.value], [$1])])
 +
 +
 +# b4_lhs_location()
 +# -----------------
 +# Expansion of @$.
 +m4_define([b4_lhs_location],
 +          [yylhs.location])
 +
 +
 +# b4_rhs_data(RULE-LENGTH, NUM)
 +# -----------------------------
 +# Return the data corresponding to the symbol #NUM, where the current
 +# rule has RULE-LENGTH symbols on RHS.
 +m4_define([b4_rhs_data],
 +          [yystack_@{b4_subtract($@)@}])
 +
 +
 +# b4_rhs_state(RULE-LENGTH, NUM)
 +# ------------------------------
 +# The state corresponding to the symbol #NUM, where the current
 +# rule has RULE-LENGTH symbols on RHS.
 +m4_define([b4_rhs_state],
 +          [b4_rhs_data([$1], [$2]).state])
 +
 +
 +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
 +# --------------------------------------
 +# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH
 +# symbols on RHS.
 +m4_define([b4_rhs_value],
 +          [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])])
 +
 +
 +# b4_rhs_location(RULE-LENGTH, NUM)
 +# ---------------------------------
 +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols
 +# on RHS.
 +m4_define([b4_rhs_location],
 +          [b4_rhs_data([$1], [$2]).location])
 +
 +
 +# b4_symbol_action(SYMBOL-NUM, KIND)
 +# ----------------------------------
 +# Run the action KIND (destructor or printer) for SYMBOL-NUM.
 +# Same as in C, but using references instead of pointers.
 +m4_define([b4_symbol_action],
 +[b4_symbol_if([$1], [has_$2],
 +[m4_pushdef([b4_symbol_value], m4_defn([b4_symbol_value_template]))[]dnl
 +b4_dollar_pushdef([yysym.value],
 +                   b4_symbol_if([$1], [has_type],
 +                                [m4_dquote(b4_symbol([$1], [type]))]),
 +                   [yysym.location])dnl
 +      b4_symbol_case_([$1])
 +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
 +        b4_symbol([$1], [$2])
 +b4_syncline([@oline@], [@ofile@])
 +        break;
  
 -b4_defines_if(
 -[b4_output_begin([b4_spec_defines_file])
 -b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
 -             [2002-2013])
 -[
 -/**
 - ** \file ]b4_spec_defines_file[
 - ** Define the ]b4_namespace_ref[::parser class.
 - */
 +m4_popdef([b4_symbol_value])[]dnl
 +b4_dollar_popdef[]dnl
 +])])
  
 -/* C++ LALR(1) parser skeleton written by Akim Demaille.  */
  
 -]b4_cpp_guard_open([b4_spec_defines_file])[
 +# b4_lex
 +# ------
 +# Call yylex.
 +m4_define([b4_lex],
 +[b4_token_ctor_if(
 +[b4_function_call([yylex],
 +                  [symbol_type], m4_ifdef([b4_lex_param], b4_lex_param))],
 +[b4_function_call([yylex], [int],
 +                  [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl
 +b4_locations_if([, [[location*], [&yyla.location]]])dnl
 +m4_ifdef([b4_lex_param], [, ]b4_lex_param))])])
  
 -]b4_percent_code_get([[requires]])[
  
 -#include <string>
 -#include <iostream>
 -#include "stack.hh"
 -]b4_percent_define_ifdef([[api.location.type]], [],
 -                         [[#include "location.hh"]])[
 +m4_pushdef([b4_copyright_years],
 +           [2002-2013])
 +
 +m4_define([b4_parser_class_name],
 +          [b4_percent_define_get([[parser_class_name]])])
 +
 +b4_bison_locations_if([# Backward compatibility.
 +   m4_define([b4_location_constructors])
 +   m4_include(b4_pkgdatadir/[location.cc])])
 +m4_include(b4_pkgdatadir/[stack.hh])
 +b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])])
 +
 +# b4_shared_declarations
 +# ----------------------
 +# Declaration that might either go into the header (if --defines)
 +# or open coded in the parser body.
 +m4_define([b4_shared_declarations],
 +[b4_percent_code_get([[requires]])[
 +]b4_parse_assert_if([# include <cassert>])[
 +# include <vector>
 +# include <iostream>
 +# include <stdexcept>
 +# include <string>]b4_defines_if([[
 +# include "stack.hh"
 +]b4_bison_locations_if([[# include "location.hh"]])])[
 +]b4_variant_if([b4_variant_includes])[
  
  ]b4_YYDEBUG_define[
  
@@@ -196,28 -106,54 +195,32 @@@ b4_location_define])])
      void set_debug_level (debug_level_type l);
  #endif
  
 +    /// Report a syntax error.]b4_locations_if([[
 +    /// \param loc    where the syntax error is found.]])[
 +    /// \param msg    a description of the syntax error.
 +    virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg);
 +
 +    /// Report a syntax error.
 +    void error (const syntax_error& err);
 +
    private:
 -    /// Report a syntax error.
 -    /// \param loc    where the syntax error is found.
 -    /// \param msg    a description of the syntax error.
 -    virtual void error (const location_type& loc, const std::string& msg);
+     /// This class is not copyable.
+     ]b4_parser_class_name[ (const ]b4_parser_class_name[&);
+     ]b4_parser_class_name[& operator= (const ]b4_parser_class_name[&);
 +    /// State numbers.
 +    typedef int state_type;
  
      /// Generate an error message.
 -    /// \param state   the state where the error occurred.
 -    /// \param tok     the lookahead token.
 -    virtual std::string yysyntax_error_ (int yystate, int tok);
 +    /// \param yystate   the state where the error occurred.
 +    /// \param yytoken   the lookahead token type, or yyempty_.
 +    virtual std::string yysyntax_error_ (state_type yystate,
 +                                         symbol_number_type yytoken) const;
  
 -#if ]b4_api_PREFIX[DEBUG
 -    /// \brief Report a symbol value on the debug stream.
 -    /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    virtual void yy_symbol_value_print_ (int yytype,
 -                                       const semantic_type* yyvaluep,
 -                                       const location_type* yylocationp);
 -    /// \brief Report a symbol on the debug stream.
 -    /// \param yytype       The token type.
 -    /// \param yyvaluep     Its semantic value.
 -    /// \param yylocationp  Its location.
 -    virtual void yy_symbol_print_ (int yytype,
 -                                 const semantic_type* yyvaluep,
 -                                 const location_type* yylocationp);
 -#endif
 -
 -
 -    /// State numbers.
 -    typedef int state_type;
 -    /// State stack type.
 -    typedef stack<state_type>    state_stack_type;
 -    /// Semantic value stack type.
 -    typedef stack<semantic_type> semantic_stack_type;
 -    /// location stack type.
 -    typedef stack<location_type> location_stack_type;
 -
 -    /// The state stack.
 -    state_stack_type yystate_stack_;
 -    /// The semantic value stack.
 -    semantic_stack_type yysemantic_stack_;
 -    /// The location stack.
 -    location_stack_type yylocation_stack_;
 +    /// Compute post-reduction state.
 +    /// \param yystate   the current state
 +    /// \param yylhs     the nonterminal to push on the stack
 +    state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
  
      /// Whether the given \c yypact_ value indicates a defaulted state.
      /// \param yyvalue   the value to check
@@@ -586,64 -426,32 +589,53 @@@ m4_if(b4_prefix, [yy], []
    }
  
  
 +  template <typename Base>
 +  inline
    void
 -  ]b4_parser_class_name[::yy_symbol_print_ (int yytype,
 -                         const semantic_type* yyvaluep, const location_type* yylocationp)
 +  ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const
    {
 -    *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
 -             << ' ' << yytname_[yytype] << " ("
 -             << *yylocationp << ": ";
 -    yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
 -    *yycdebug_ << ')';
 +    if (yymsg)
 +      YY_SYMBOL_PRINT (yymsg, yysym);]b4_variant_if([], [
 +
 +    // User destructor.
-     symbol_number_type yytype = yysym.type_get ();
-     switch (yytype)
-       {
- ]b4_symbol_foreach([b4_symbol_destructor])dnl
- [       default:
-           break;
-       }])[
++    b4_symbol_actions([destructor], [yysym.type_get ()])])[
    }
 -#endif
  
 +#if ]b4_api_PREFIX[DEBUG
 +  template <typename Base>
    void
 -  ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
 -                         int yytype, semantic_type* yyvaluep, location_type* yylocationp)
 +  ]b4_parser_class_name[::yy_print_ (std::ostream& yyo,
 +                                     const basic_symbol<Base>& yysym) const
    {
 -    YYUSE (yylocationp);
 -    YYUSE (yymsg);
 -    YYUSE (yyvaluep);
 +    std::ostream& yyoutput = yyo;
 +    YYUSE (yyoutput);
 +    symbol_number_type yytype = yysym.type_get ();
 +    yyo << (yytype < yyntokens_ ? "token" : "nterm")
 +        << ' ' << yytname_[yytype] << " ("]b4_locations_if([
 +        << yysym.location << ": "])[;
-     switch (yytype)
-       {
- ]b4_symbol_foreach([b4_symbol_printer])dnl
- [       default:
-           break;
-       }
++    ]b4_symbol_actions([printer])[
 +    yyo << ')';
 +  }
 +#endif
  
 -    if (yymsg)
 -      YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 +  inline
 +  void
 +  ]b4_parser_class_name[::yypush_ (const char* m, state_type s, symbol_type& sym)
 +  {
 +    stack_symbol_type t (s, sym);
 +    yypush_ (m, t);
 +  }
  
 -    ]b4_symbol_actions([destructors])[
 +  inline
 +  void
 +  ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s)
 +  {
 +    if (m)
 +      YY_SYMBOL_PRINT (m, s);
 +    yystack_.push (s);
    }
  
 +  inline
    void
    ]b4_parser_class_name[::yypop_ (unsigned int n)
    {
@@@ -741,15 -546,19 +733,15 @@@ b4_dollar_popdef])[]dn
         yynewstate, since the latter expects the semantical and the
         location values to have been already stored, initialize these
         stacks with a primary value.  */
-     yystack_ = stack_type (0);
 -    yystate_stack_.clear ();
 -    yysemantic_stack_.clear ();
 -    yylocation_stack_.clear ();
 -    yysemantic_stack_.push (yylval);
 -    yylocation_stack_.push (yylloc);
++    yystack_.clear ();
 +    yypush_ (YY_NULL, 0, yyla);
  
 -    /* New state.  */
 +    // A new symbol was pushed on the stack.
    yynewstate:
 -    yystate_stack_.push (yystate);
 -    YYCDEBUG << "Entering state " << yystate << std::endl;
 +    YYCDEBUG << "Entering state " << yystack_[0].state << std::endl;
  
 -    /* Accept?  */
 -    if (yystate == yyfinal_)
 +    // Accept?
 +    if (yystack_[0].state == yyfinal_)
        goto yyacceptlab;
  
      goto yybackup;
diff --cc data/stack.hh
index 037c212fc6a549462f8a480d5982495ce1eed8bd,317a0612c2ac1708151822994e26123ae5a58a8c..aa64d63d842cce563540a8254251dc1135ba9e5c
@@@ -69,32 -74,28 +69,40 @@@ m4_define([b4_stack_define]
      pop (unsigned int n = 1)
      {
        for (; n; --n)
 -        seq_.pop_front ();
 +        seq_.pop_back ();
      }
  
+     void
+     clear ()
+     {
+       seq_.clear ();
+     }
      inline
 -    unsigned int
 -    height () const
 +    typename S::size_type
 +    size () const
      {
        return seq_.size ();
      }
  
 -    inline const_iterator begin () const { return seq_.rbegin (); }
 -    inline const_iterator end () const { return seq_.rend (); }
 +    inline
 +    const_iterator
 +    begin () const
 +    {
 +      return seq_.rbegin ();
 +    }
 +
 +    inline
 +    const_iterator
 +    end () const
 +    {
 +      return seq_.rend ();
 +    }
  
    private:
+     stack (const stack&);
+     stack& operator= (const stack&);
 +    /// The wrapped container.
      S seq_;
    };
  
diff --cc data/yacc.c
index c47114ab4b7ea9c621b3017d46c4a4d28caf9e44,360892315284edee098385630c7d5dcd986a9803..74fadd1d725b02596e7d9c4a2b6e7fd73f7722a4
@@@ -430,13 -447,18 +430,8 @@@ typedef short int yytype_int16
  # endif
  #endif
  
- /* Suppress unused-variable warnings by "using" E.  */
- #ifdef __GNUC__
- # define YYUSE(E) ((void) (E))
- #else
- # define YYUSE(E) /* empty */
- #endif
+ ]b4_attribute_define[
  
 -/* Identity function, used to suppress warnings about constant conditions.  */
 -#ifndef lint
 -# define YYID(N) (N)
 -#else
 -]b4_c_function_def([YYID], [static int], [[int yyi], [yyi]])[
 -{
 -  return yyi;
 -}
 -#endif
 -
  #if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[
  
  /* The parser invokes alloca or malloc; define the necessary symbols.  */]dnl
index 9eb429c77908db9363404a4f840bb300c68074f0,868c84109e62c73c2274feb7b2a04aa35fbb6615..711ab7ec597fc6d588ba0527f4ab85330a30c5c0
@@@ -486,9 -485,13 +486,9 @@@ start
     ;
  
  %%
- ]AT_YYLEX_DEFINE(["a"])[
  ]AT_YYERROR_DEFINE[
 -int
 -main (void)
 -{
 -  return yyparse () != 1;
 -}
+ ]AT_YYLEX_DEFINE(["a"])[
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS
  
@@@ -1679,9 -1698,14 +1679,9 @@@ start
  b: 'b';
  d: /* nada.  */;
  %%
- ]AT_YYLEX_DEFINE(["abc"])[
  ]AT_YYERROR_DEFINE[
 -int
 -main (void)
 -{
 -  yydebug = 1;
 -  return !!yyparse ();
 -}
+ ]AT_YYLEX_DEFINE(["abc"])[
 +]AT_MAIN_DEFINE[
  ]])
  AT_BISON_OPTION_POPDEFS