]> git.saurik.com Git - bison.git/blobdiff - data/lalr1.cc
In DOT output, convert from "/*" comments to "//" comments.
[bison.git] / data / lalr1.cc
index 8f0ebe8f52de10e5df0f68b15a2a742ccd6df79c..cd54b6c3e61c8335fe9ed0e4cb698b2b55876ba3 100644 (file)
@@ -1,36 +1,40 @@
-m4_divert(-1)
-
 # C++ skeleton for Bison
 
 # C++ skeleton for Bison
 
-# Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2002-2010 Free Software Foundation, Inc.
 
 
-# This program is free software; you can redistribute it and/or modify
+# 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
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 # (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.
 # 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
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301  USA
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 m4_include(b4_pkgdatadir/[c++.m4])
 
 m4_include(b4_pkgdatadir/[c++.m4])
+
+m4_define([b4_parser_class_name],
+          [b4_percent_define_get([[parser_class_name]])])
+
+# The header is mandatory.
+b4_defines_if([],
+              [b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
+
 # Backward compatibility.
 m4_define([b4_location_constructors])
 m4_include(b4_pkgdatadir/[location.cc])
 
 # We do want M4 expansion after # for CPP macros.
 m4_changecom()
 # Backward compatibility.
 m4_define([b4_location_constructors])
 m4_include(b4_pkgdatadir/[location.cc])
 
 # We do want M4 expansion after # for CPP macros.
 m4_changecom()
-m4_divert(0)dnl
-m4_if(b4_defines_flag, 0, [],
-[@output @output_header_name@
-b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
-            [2002, 2003, 2004, 2005, 2006])
+m4_divert_push(0)dnl
+b4_defines_if(
+[@output(b4_spec_defines_file@)@
+b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
+             [2002-2010])
 dnl FIXME: This is wrong, we want computed header guards.
 [
 /* C++ LALR(1) parser skeleton written by Akim Demaille.  */
 dnl FIXME: This is wrong, we want computed header guards.
 [
 /* C++ LALR(1) parser skeleton written by Akim Demaille.  */
@@ -38,28 +42,16 @@ dnl FIXME: This is wrong, we want computed header guards.
 #ifndef PARSER_HEADER_H
 # define PARSER_HEADER_H
 
 #ifndef PARSER_HEADER_H
 # define PARSER_HEADER_H
 
+]b4_percent_code_get([[requires]])[
+
 #include <string>
 #include <iostream>
 #include <string>
 #include <iostream>
+#include "location.hh"
 #include "stack.hh"
 
 #include "stack.hh"
 
-namespace yy
-{
-  class position;
-  class location;
-}
-
-/* First part of user declarations.  */
-]b4_pre_prologue[
-
-]/* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])[
-
-]dnl Include location.hh here: it might depend on headers included above.
-[#include "location.hh"
-
 /* Enabling traces.  */
 #ifndef YYDEBUG
 /* Enabling traces.  */
 #ifndef YYDEBUG
-# define YYDEBUG ]b4_debug[
+# define YYDEBUG ]b4_debug_flag[
 #endif
 
 /* Enabling verbose error messages.  */
 #endif
 
 /* Enabling verbose error messages.  */
@@ -67,7 +59,7 @@ b4_syncline([@oline@], [@ofile@])[
 # undef YYERROR_VERBOSE
 # define YYERROR_VERBOSE 1
 #else
 # undef YYERROR_VERBOSE
 # define YYERROR_VERBOSE 1
 #else
-# define YYERROR_VERBOSE ]b4_error_verbose[
+# define YYERROR_VERBOSE ]b4_error_verbose_flag[
 #endif
 
 /* Enabling the token table.  */
 #endif
 
 /* Enabling the token table.  */
@@ -94,8 +86,7 @@ do {                                                  \
 } while (false)
 #endif
 
 } while (false)
 #endif
 
-namespace yy
-{
+]b4_namespace_open[
 
   /// A Bison parser.
   class ]b4_parser_class_name[
 
   /// A Bison parser.
   class ]b4_parser_class_name[
@@ -105,16 +96,17 @@ namespace yy
 #ifndef YYSTYPE
 ]m4_ifdef([b4_stype],
 [    union semantic_type
 #ifndef YYSTYPE
 ]m4_ifdef([b4_stype],
 [    union semantic_type
-b4_stype
-/* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])
-       ;],
-[    typedef int semantic_type;])[
+    {
+b4_user_stype
+    };],
+[m4_if(b4_tag_seen_flag, 0,
+[[    typedef int semantic_type;]],
+[[    typedef YYSTYPE semantic_type;]])])[
 #else
     typedef YYSTYPE semantic_type;
 #endif
     /// Symbol locations.
 #else
     typedef YYSTYPE semantic_type;
 #endif
     /// Symbol locations.
-    typedef ]b4_location_type[ location_type;
+    typedef ]b4_percent_define_get([[location_type]])[ location_type;
     /// Tokens.
     struct token
     {
     /// Tokens.
     struct token
     {
@@ -131,6 +123,7 @@ b4_syncline([@oline@], [@ofile@])
     /// \returns  0 iff parsing succeeded.
     virtual int parse ();
 
     /// \returns  0 iff parsing succeeded.
     virtual int parse ();
 
+#if YYDEBUG
     /// The current debugging stream.
     std::ostream& debug_stream () const;
     /// Set the current debugging stream.
     /// The current debugging stream.
     std::ostream& debug_stream () const;
     /// Set the current debugging stream.
@@ -142,6 +135,7 @@ b4_syncline([@oline@], [@ofile@])
     debug_level_type debug_level () const;
     /// Set the current debugging level.
     void set_debug_level (debug_level_type l);
     debug_level_type debug_level () const;
     /// Set the current debugging level.
     void set_debug_level (debug_level_type l);
+#endif
 
   private:
     /// Report a syntax error.
 
   private:
     /// Report a syntax error.
@@ -151,9 +145,8 @@ b4_syncline([@oline@], [@ofile@])
 
     /// Generate an error message.
     /// \param state   the state where the error occurred.
 
     /// Generate an error message.
     /// \param state   the state where the error occurred.
-    /// \param tok     the look-ahead token.
-    virtual std::string yysyntax_error_ (int yystate]dnl
-b4_error_verbose_if([, int tok])[);
+    /// \param tok     the lookahead token.
+    virtual std::string yysyntax_error_ (int yystate, int tok);
 
 #if YYDEBUG
     /// \brief Report a symbol value on the debug stream.
 
 #if YYDEBUG
     /// \brief Report a symbol value on the debug stream.
@@ -170,7 +163,7 @@ b4_error_verbose_if([, int tok])[);
     virtual void yy_symbol_print_ (int yytype,
                                   const semantic_type* yyvaluep,
                                   const location_type* yylocationp);
     virtual void yy_symbol_print_ (int yytype,
                                   const semantic_type* yyvaluep,
                                   const location_type* yylocationp);
-#endif /* ! YYDEBUG */
+#endif
 
 
     /// State numbers.
 
 
     /// State numbers.
@@ -189,6 +182,14 @@ b4_error_verbose_if([, int tok])[);
     /// The location stack.
     location_stack_type yylocation_stack_;
 
     /// The location stack.
     location_stack_type yylocation_stack_;
 
+    /// Whether the given \c yypact_ value indicates a defaulted state.
+    /// \param yyvalue   the value to check
+    static bool yy_pact_value_is_default_ (int yyvalue);
+
+    /// Whether the given \c yytable_ value indicates a syntax error.
+    /// \param yyvalue   the value to check
+    static bool yy_table_value_is_error_ (int yyvalue);
+
     /// Internal symbol numbers.
     typedef ]b4_int_type_for([b4_translate])[ token_number_type;
     /* Tables.  */
     /// Internal symbol numbers.
     typedef ]b4_int_type_for([b4_translate])[ token_number_type;
     /* Tables.  */
@@ -196,7 +197,7 @@ b4_error_verbose_if([, int tok])[);
     static const ]b4_int_type_for([b4_pact])[ yypact_[];
     static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
 
     static const ]b4_int_type_for([b4_pact])[ yypact_[];
     static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
 
-    /// For a state, default rule to reduce.
+    /// For a state, default reduction number.
     /// Unless\a  yytable_ specifies something else to do.
     /// Zero means the default is an error.
     static const ]b4_int_type_for([b4_defact])[ yydefact_[];
     /// Unless\a  yytable_ specifies something else to do.
     /// Zero means the default is an error.
     static const ]b4_int_type_for([b4_defact])[ yydefact_[];
@@ -225,12 +226,10 @@ b4_error_verbose_if([, int tok])[);
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
     /// For a symbol, its name in clear.
     static const char* const yytname_[];
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
     /// For a symbol, its name in clear.
     static const char* const yytname_[];
-#endif
+#endif]b4_error_verbose_if([
 
 
-#if YYERROR_VERBOSE
     /// Convert the symbol name \a n to a form suitable for a diagnostic.
     /// Convert the symbol name \a n to a form suitable for a diagnostic.
-    virtual std::string yytnamerr_ (const char *n);
-#endif
+    static std::string yytnamerr_ (const char *n);])[
 
 #if YYDEBUG
     /// A type to store symbol numbers and -1.
 
 #if YYDEBUG
     /// A type to store symbol numbers and -1.
@@ -247,10 +246,14 @@ b4_error_verbose_if([, int tok])[);
     virtual void yy_reduce_print_ (int r);
     /// Print the state stack on the debug stream.
     virtual void yystack_print_ ();
     virtual void yy_reduce_print_ (int r);
     /// Print the state stack on the debug stream.
     virtual void yystack_print_ ();
+
+    /* Debugging.  */
+    int yydebug_;
+    std::ostream* yycdebug_;
 #endif
 
 #endif
 
-    /// Convert a scanner token number to a symbol number.
-    token_number_type yytranslate_ (int token);
+    /// Convert a scanner token number \a t to a symbol number.
+    token_number_type yytranslate_ (int t);
 
     /// \brief Reclaim the memory associated to a symbol.
     /// \param yymsg        Why this token is reclaimed.
 
     /// \brief Reclaim the memory associated to a symbol.
     /// \param yymsg        Why this token is reclaimed.
@@ -277,44 +280,43 @@ b4_error_verbose_if([, int tok])[);
     static const int yyntokens_;
     static const unsigned int yyuser_token_number_max_;
     static const token_number_type yyundef_token_;
     static const int yyntokens_;
     static const unsigned int yyuser_token_number_max_;
     static const token_number_type yyundef_token_;
-
-    /* Debugging.  */
-    int yydebug_;
-    std::ostream* yycdebug_;
-
 ]b4_parse_param_vars[
   };
 ]b4_parse_param_vars[
   };
-}
+]b4_namespace_close[
 
 
-]m4_ifset([b4_global_tokens_and_yystype],
+]b4_percent_define_flag_if([[global_tokens_and_yystype]],
 [b4_token_defines(b4_tokens)
 
 #ifndef YYSTYPE
  /* Redirection for backward compatibility.  */
 [b4_token_defines(b4_tokens)
 
 #ifndef YYSTYPE
  /* Redirection for backward compatibility.  */
-# define YYSTYPE yy::b4_parser_class_name::semantic_type
+# define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
 #endif
 #endif
-])[
-#endif /* ! defined PARSER_HEADER_H */]
+])
+b4_percent_code_get([[provides]])[]dnl
+
+[#endif /* ! defined PARSER_HEADER_H */]
 ])dnl
 ])dnl
-@output @output_parser_name@
-b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
-            [2002, 2003, 2004, 2005, 2006])
-m4_if(b4_prefix[], [yy], [],
+@output(b4_parser_file_name@)@
+b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
+             [2002-2010])
+b4_percent_code_get([[top]])[]dnl
+m4_if(b4_prefix, [yy], [],
 [
 // Take the name prefix into account.
 [
 // Take the name prefix into account.
-#define yylex   b4_prefix[]lex])
-m4_if(b4_defines_flag, 0, [],
-[
-#include @output_header_name@])[
+#define yylex   b4_prefix[]lex])[
 
 
-/* User implementation prologue.  */
-]b4_post_prologue[
+/* First part of user declarations.  */
+]b4_user_pre_prologue
 
 
-]/* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])[
+b4_defines_if([[
+#include "@basename(]b4_spec_defines_file[@)"]])[
+
+/* User implementation prologue.  */
+]b4_user_post_prologue
+b4_percent_code_get[]dnl
 
 
-#ifndef YY_
-# if YYENABLE_NLS
+[#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
 #  if ENABLE_NLS
 #   include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -328,14 +330,12 @@ b4_syncline([@oline@], [@ofile@])[
 /* Suppress unused-variable warnings by "using" E.  */
 #define YYUSE(e) ((void) (e))
 
 /* Suppress unused-variable warnings by "using" E.  */
 #define YYUSE(e) ((void) (e))
 
-/* A pseudo ostream that takes yydebug_ into account.  */
-# define YYCDEBUG                                                      \
-  for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false)       \
-    (*yycdebug_)
-
 /* Enable debugging if requested.  */
 #if YYDEBUG
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
 
+/* A pseudo ostream that takes yydebug_ into account.  */
+# define YYCDEBUG if (yydebug_) (*yycdebug_)
+
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
 do {                                                   \
   if (yydebug_)                                                \
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
 do {                                                   \
   if (yydebug_)                                                \
@@ -360,63 +360,68 @@ do {                                      \
 
 #else /* !YYDEBUG */
 
 
 #else /* !YYDEBUG */
 
+# define YYCDEBUG if (false) std::cerr
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 # define YY_REDUCE_PRINT(Rule)
 # define YY_STACK_PRINT()
 
 #endif /* !YYDEBUG */
 
 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
 # define YY_REDUCE_PRINT(Rule)
 # define YY_STACK_PRINT()
 
 #endif /* !YYDEBUG */
 
+#define yyerrok                (yyerrstatus_ = 0)
+#define yyclearin      (yychar = yyempty_)
+
 #define YYACCEPT       goto yyacceptlab
 #define YYABORT                goto yyabortlab
 #define YYERROR                goto yyerrorlab
 #define YYACCEPT       goto yyacceptlab
 #define YYABORT                goto yyabortlab
 #define YYERROR                goto yyerrorlab
+#define YYRECOVERING()  (!!yyerrstatus_)
 
 
-#if YYERROR_VERBOSE
-
-/* Return YYSTR after stripping away unnecessary quotes and
-   backslashes, so that it's suitable for yyerror.  The heuristic is
-   that double-quoting is unnecessary unless the string contains an
-   apostrophe, a comma, or backslash (other than backslash-backslash).
-   YYSTR is taken from yytname.  */
-std::string
-yy::]b4_parser_class_name[::yytnamerr_ (const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      std::string yyr = "";
-      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:
-           yyr += *yyp;
-           break;
-
-         case '"':
-           return yyr;
-         }
-    do_not_strip_quotes: ;
-    }
+]b4_namespace_open[]b4_error_verbose_if([[
 
 
-  return yystr;
-}
+  /* Return YYSTR after stripping away unnecessary quotes and
+     backslashes, so that it's suitable for yyerror.  The heuristic is
+     that double-quoting is unnecessary unless the string contains an
+     apostrophe, a comma, or backslash (other than backslash-backslash).
+     YYSTR is taken from yytname.  */
+  std::string
+  ]b4_parser_class_name[::yytnamerr_ (const char *yystr)
+  {
+    if (*yystr == '"')
+      {
+        std::string yyr = "";
+        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:
+              yyr += *yyp;
+              break;
+
+            case '"':
+              return yyr;
+            }
+      do_not_strip_quotes: ;
+      }
 
 
-#endif
+    return yystr;
+  }
+]])[
 
 
-namespace yy
-{
   /// Build a parser object.
   /// Build a parser object.
-  ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)
-    : yydebug_ (false),
-      yycdebug_ (&std::cerr)]b4_parse_param_cons[
+  ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
+    :])[
+#if YYDEBUG
+    ]m4_ifset([b4_parse_param], [  ], [ :])[yydebug_ (false),
+      yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
+#endif]b4_parse_param_cons[
   {
   }
 
   {
   }
 
@@ -454,7 +459,7 @@ namespace yy
     yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
     *yycdebug_ << ')';
   }
     yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
     *yycdebug_ << ')';
   }
-#endif /* ! YYDEBUG */
+#endif
 
   void
   ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
 
   void
   ]b4_parser_class_name[::yydestruct_ (const char* yymsg,
@@ -482,6 +487,7 @@ namespace yy
     yylocation_stack_.pop (n);
   }
 
     yylocation_stack_.pop (n);
   }
 
+#if YYDEBUG
   std::ostream&
   ]b4_parser_class_name[::debug_stream () const
   {
   std::ostream&
   ]b4_parser_class_name[::debug_stream () const
   {
@@ -506,12 +512,24 @@ namespace yy
   {
     yydebug_ = l;
   }
   {
     yydebug_ = l;
   }
+#endif
+
+  inline bool
+  ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue)
+  {
+    return yyvalue == yypact_ninf_;
+  }
 
 
+  inline bool
+  ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue)
+  {
+    return yyvalue == yytable_ninf_;
+  }
 
   int
   ]b4_parser_class_name[::parse ()
   {
 
   int
   ]b4_parser_class_name[::parse ()
   {
-    /// Look-ahead and look-ahead in internal form.
+    /// Lookahead and lookahead in internal form.
     int yychar = yyempty_;
     int yytoken = 0;
 
     int yychar = yyempty_;
     int yytoken = 0;
 
@@ -524,12 +542,12 @@ namespace yy
     int yynerrs_ = 0;
     int yyerrstatus_ = 0;
 
     int yynerrs_ = 0;
     int yyerrstatus_ = 0;
 
-    /// Semantic value of the look-ahead.
+    /// Semantic value of the lookahead.
     semantic_type yylval;
     semantic_type yylval;
-    /// Location of the look-ahead.
+    /// Location of the lookahead.
     location_type yylloc;
     /// The locations where the error started and ended.
     location_type yylloc;
     /// The locations where the error started and ended.
-    location yyerror_range[2];
+    location_type yyerror_range[3];
 
     /// $$.
     semantic_type yyval;
 
     /// $$.
     semantic_type yyval;
@@ -544,11 +562,9 @@ namespace yy
 m4_pushdef([b4_at_dollar],     [yylloc])dnl
 m4_pushdef([b4_dollar_dollar], [yylval])dnl
     /* User initialization code.  */
 m4_pushdef([b4_at_dollar],     [yylloc])dnl
 m4_pushdef([b4_dollar_dollar], [yylval])dnl
     /* User initialization code.  */
-    b4_initial_action
+    b4_user_initial_action
 m4_popdef([b4_dollar_dollar])dnl
 m4_popdef([b4_dollar_dollar])dnl
-m4_popdef([b4_at_dollar])dnl
-  /* Line __line__ of yacc.c.  */
-b4_syncline([@oline@], [@ofile@])])dnl
+m4_popdef([b4_at_dollar])])dnl
 
   [  /* Initialize the stacks.  The initial state will be pushed in
        yynewstate, since the latter expects the semantical and the
 
   [  /* Initialize the stacks.  The initial state will be pushed in
        yynewstate, since the latter expects the semantical and the
@@ -564,23 +580,28 @@ b4_syncline([@oline@], [@ofile@])])dnl
   yynewstate:
     yystate_stack_.push (yystate);
     YYCDEBUG << "Entering state " << yystate << std::endl;
   yynewstate:
     yystate_stack_.push (yystate);
     YYCDEBUG << "Entering state " << yystate << std::endl;
+
+    /* Accept?  */
+    if (yystate == yyfinal_)
+      goto yyacceptlab;
+
     goto yybackup;
 
     /* Backup.  */
   yybackup:
 
     goto yybackup;
 
     /* Backup.  */
   yybackup:
 
-    /* Try to take a decision without look-ahead.  */
+    /* Try to take a decision without lookahead.  */
     yyn = yypact_[yystate];
     yyn = yypact_[yystate];
-    if (yyn == yypact_ninf_)
+    if (yy_pact_value_is_default_ (yyn))
       goto yydefault;
 
       goto yydefault;
 
-    /* Read a look-ahead token.  */
+    /* Read a lookahead token.  */
     if (yychar == yyempty_)
       {
        YYCDEBUG << "Reading a token: ";
        yychar = ]b4_c_function_call([yylex], [int],
                                     [[YYSTYPE*], [&yylval]][]dnl
     if (yychar == yyempty_)
       {
        YYCDEBUG << "Reading a token: ";
        yychar = ]b4_c_function_call([yylex], [int],
                                     [[YYSTYPE*], [&yylval]][]dnl
-b4_location_if([, [[location*], [&yylloc]]])dnl
+b4_locations_if([, [[location*], [&yylloc]]])dnl
 m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
       }
 
 m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
       }
 
@@ -607,22 +628,17 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
     yyn = yytable_[yyn];
     if (yyn <= 0)
       {
     yyn = yytable_[yyn];
     if (yyn <= 0)
       {
-       if (yyn == 0 || yyn == yytable_ninf_)
-       goto yyerrlab;
+       if (yy_table_value_is_error_ (yyn))
+         goto yyerrlab;
        yyn = -yyn;
        goto yyreduce;
       }
 
        yyn = -yyn;
        goto yyreduce;
       }
 
-    /* Accept?  */
-    if (yyn == yyfinal_)
-      goto yyacceptlab;
-
-    /* Shift the look-ahead token.  */
+    /* Shift the lookahead token.  */
     YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 
     YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
 
-    /* Discard the token being shifted unless it is eof.  */
-    if (yychar != yyeof_)
-      yychar = yyempty_;
+    /* Discard the token being shifted.  */
+    yychar = yyempty_;
 
     yysemantic_stack_.push (yylval);
     yylocation_stack_.push (yylloc);
 
     yysemantic_stack_.push (yylval);
     yylocation_stack_.push (yylloc);
@@ -667,10 +683,9 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
     YY_REDUCE_PRINT (yyn);
     switch (yyn)
       {
     YY_REDUCE_PRINT (yyn);
     switch (yyn)
       {
-       ]b4_actions
-    /* Line __line__ of lalr1.cc.  */
-b4_syncline([@oline@], [@ofile@])[
-       default: break;
+       ]b4_user_actions[
+       default:
+          break;
       }
     YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
 
       }
     YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
 
@@ -699,14 +714,13 @@ b4_syncline([@oline@], [@ofile@])[
     if (!yyerrstatus_)
       {
        ++yynerrs_;
     if (!yyerrstatus_)
       {
        ++yynerrs_;
-       error (yylloc, yysyntax_error_ (yystate]dnl
-b4_error_verbose_if([, yytoken])[));
+       error (yylloc, yysyntax_error_ (yystate, yytoken));
       }
 
       }
 
-    yyerror_range[0] = yylloc;
+    yyerror_range[1] = yylloc;
     if (yyerrstatus_ == 3)
       {
     if (yyerrstatus_ == 3)
       {
-       /* If just tried and failed to reuse look-ahead token after an
+       /* If just tried and failed to reuse lookahead token after an
         error, discard it.  */
 
        if (yychar <= yyeof_)
         error, discard it.  */
 
        if (yychar <= yyeof_)
@@ -722,7 +736,7 @@ b4_error_verbose_if([, yytoken])[));
          }
       }
 
          }
       }
 
-    /* Else will try to reuse look-ahead token after shifting the error
+    /* Else will try to reuse lookahead token after shifting the error
        token.  */
     goto yyerrlab1;
 
        token.  */
     goto yyerrlab1;
 
@@ -738,7 +752,7 @@ b4_error_verbose_if([, yytoken])[));
     if (false)
       goto yyerrorlab;
 
     if (false)
       goto yyerrorlab;
 
-    yyerror_range[0] = yylocation_stack_[yylen - 1];
+    yyerror_range[1] = yylocation_stack_[yylen - 1];
     /* Do not reclaim the symbols of the rule which action triggered
        this YYERROR.  */
     yypop_ (yylen);
     /* Do not reclaim the symbols of the rule which action triggered
        this YYERROR.  */
     yypop_ (yylen);
@@ -755,7 +769,7 @@ b4_error_verbose_if([, yytoken])[));
     for (;;)
       {
        yyn = yypact_[yystate];
     for (;;)
       {
        yyn = yypact_[yystate];
-       if (yyn != yypact_ninf_)
+       if (!yy_pact_value_is_default_ (yyn))
        {
          yyn += yyterror_;
          if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
        {
          yyn += yyterror_;
          if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_)
@@ -770,7 +784,7 @@ b4_error_verbose_if([, yytoken])[));
        if (yystate_stack_.height () == 1)
        YYABORT;
 
        if (yystate_stack_.height () == 1)
        YYABORT;
 
-       yyerror_range[0] = yylocation_stack_[0];
+       yyerror_range[1] = yylocation_stack_[0];
        yydestruct_ ("Error: popping",
                     yystos_[yystate],
                     &yysemantic_stack_[0], &yylocation_stack_[0]);
        yydestruct_ ("Error: popping",
                     yystos_[yystate],
                     &yysemantic_stack_[0], &yylocation_stack_[0]);
@@ -779,19 +793,16 @@ b4_error_verbose_if([, yytoken])[));
        YY_STACK_PRINT ();
       }
 
        YY_STACK_PRINT ();
       }
 
-    if (yyn == yyfinal_)
-      goto yyacceptlab;
-
-    yyerror_range[1] = yylloc;
+    yyerror_range[2] = yylloc;
     // Using YYLLOC is tempting, but would change the location of
     // Using YYLLOC is tempting, but would change the location of
-    // the look-ahead.  YYLOC is available though.
-    YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
+    // the lookahead.  YYLOC is available though.
+    YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
     yysemantic_stack_.push (yylval);
     yylocation_stack_.push (yyloc);
 
     /* Shift the error token.  */
     YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
     yysemantic_stack_.push (yylval);
     yylocation_stack_.push (yyloc);
 
     /* Shift the error token.  */
     YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
-                  &yysemantic_stack_[0], &yylocation_stack_[0]);
+                    &yysemantic_stack_[0], &yylocation_stack_[0]);
 
     yystate = yyn;
     goto yynewstate;
 
     yystate = yyn;
     goto yynewstate;
@@ -807,7 +818,7 @@ b4_error_verbose_if([, yytoken])[));
     goto yyreturn;
 
   yyreturn:
     goto yyreturn;
 
   yyreturn:
-    if (yychar != yyeof_ && yychar != yyempty_)
+    if (yychar != yyempty_)
       yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
 
     /* Do not reclaim the symbols of the rule which action triggered
       yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
 
     /* Do not reclaim the symbols of the rule which action triggered
@@ -827,52 +838,73 @@ b4_error_verbose_if([, yytoken])[));
 
   // Generate an error message.
   std::string
 
   // Generate an error message.
   std::string
-  ]b4_parser_class_name[::yysyntax_error_ (int yystate]dnl
-b4_error_verbose_if([, int tok])[)
+  ]b4_parser_class_name[::yysyntax_error_ (]dnl
+b4_error_verbose_if([int yystate, int yytoken],
+                    [int, int])[)
   {
   {
-    std::string res;
-    YYUSE (yystate);
-#if YYERROR_VERBOSE
+    std::string yyres;]b4_error_verbose_if([[
     int yyn = yypact_[yystate];
     int yyn = yypact_[yystate];
-    if (yypact_ninf_ < yyn && yyn < yylast_)
+    if (yypact_ninf_ < yyn && yyn <= yylast_)
       {
        /* Start YYX at -YYN if negative to avoid negative indexes in
       {
        /* Start YYX at -YYN if negative to avoid negative indexes in
-          YYCHECK.  */
+          YYCHECK.  In other words, skip the first -YYN actions for this
+          state because they are default actions.  */
        int yyxbegin = yyn < 0 ? -yyn : 0;
 
        /* Stay within bounds of both yycheck and yytname.  */
        int yyxbegin = yyn < 0 ? -yyn : 0;
 
        /* Stay within bounds of both yycheck and yytname.  */
-       int yychecklim = yylast_ - yyn;
+       int yychecklim = yylast_ - yyn + 1;
        int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
        int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
-       int count = 0;
-       for (int x = yyxbegin; x < yyxend; ++x)
-         if (yycheck_[x + yyn] == x && x != yyterror_)
-           ++count;
-
-       // FIXME: This method of building the message is not compatible
-       // with internationalization.  It should work like yacc.c does it.
-       // That is, first build a string that looks like this:
-       // "syntax error, unexpected %s or %s or %s"
-       // Then, invoke YY_ on this string.
-       // Finally, use the string as a format to output
-       // yytname_[tok], etc.
-       // Until this gets fixed, this message appears in English only.
-       res = "syntax error, unexpected ";
-       res += yytnamerr_ (yytname_[tok]);
-       if (count < 5)
-         {
-           count = 0;
-           for (int x = yyxbegin; x < yyxend; ++x)
-             if (yycheck_[x + yyn] == x && x != yyterror_)
-               {
-                 res += (!count++) ? ", expecting " : " or ";
-                 res += yytnamerr_ (yytname_[x]);
-               }
-         }
+
+        // Number of reported tokens (one for the "unexpected", one per
+        // "expected").
+       size_t yycount = 0;
+        // Its maximum.
+        enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+        // Arguments of yyformat.
+        char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+        yyarg[yycount++] = yytname_[yytoken];
+       for (int yyx = yyxbegin; yyx < yyxend; ++yyx)
+         if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_
+             && !yy_table_value_is_error_ (yytable_[yyx + yyn]))
+          {
+            if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+            {
+              yycount = 1;
+              break;
+            }
+            else
+              yyarg[yycount++] = yytname_[yyx];
+          }
+
+        char const* yyformat = 0;
+        switch (yycount)
+        {
+#define YYCASE_(N, S)                           \
+          case N:                               \
+            yyformat = S;                       \
+          break
+          YYCASE_(1, YY_("syntax error, unexpected %s"));
+          YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+          YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+          YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+          YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+#undef YYCASE_
+        }
+        // Argument number.
+        size_t yyi = 0;
+        for (char const* yyp = yyformat; *yyp; ++yyp)
+          if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount)
+          {
+            yyres += yytnamerr_ (yyarg[yyi++]);
+            ++yyp;
+          }
+          else
+            yyres += *yyp;
       }
     else
       }
     else
-#endif
-      res = YY_("syntax error");
-    return res;
+  ]])dnl
+[    yyres = YY_("syntax error");
+    return yyres;
   }
 
 
   }
 
 
@@ -885,9 +917,9 @@ b4_error_verbose_if([, int tok])[)
     ]b4_pact[
   };
 
     ]b4_pact[
   };
 
-  /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
-     doesn't specify something else to do.  Zero means the default is an
-     error.  */
+  /* YYDEFACT[S] -- default reduction number in state S.  Performed when
+     YYTABLE doesn't specify something else to do.  Zero means the
+     default is an error.  */
   const ]b4_int_type_for([b4_defact])[
   ]b4_parser_class_name[::yydefact_[] =
   {
   const ]b4_int_type_for([b4_defact])[
   ]b4_parser_class_name[::yydefact_[] =
   {
@@ -910,7 +942,7 @@ b4_error_verbose_if([, int tok])[)
 
   /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
      positive, shift that token.  If negative, reduce the rule which
 
   /* 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 zero, do what YYDEFACT says.  */
+     number is the opposite.  If YYTABLE_NINF_, syntax error.  */
   const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
   const ]b4_int_type_for([b4_table])[
   ]b4_parser_class_name[::yytable_[] =
   const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
   const ]b4_int_type_for([b4_table])[
   ]b4_parser_class_name[::yytable_[] =
@@ -1009,7 +1041,7 @@ b4_error_verbose_if([, int tok])[)
     int yynrhs = yyr2_[yyrule];
     /* Print the symbols being reduced, and their result.  */
     *yycdebug_ << "Reducing stack by rule " << yyrule - 1
     int yynrhs = yyr2_[yyrule];
     /* Print the symbols being reduced, and their result.  */
     *yycdebug_ << "Reducing stack by rule " << yyrule - 1
-              << " (line " << yylno << "), ";
+              << " (line " << yylno << "):" << std::endl;
     /* The symbols being reduced.  */
     for (int yyi = 0; yyi < yynrhs; yyi++)
       YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
     /* The symbols being reduced.  */
     for (int yyi = 0; yyi < yynrhs; yyi++)
       YY_SYMBOL_PRINT ("   $" << yyi + 1 << " =",
@@ -1021,7 +1053,7 @@ b4_error_verbose_if([, int tok])[)
 
   /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
   ]b4_parser_class_name[::token_number_type
 
   /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
   ]b4_parser_class_name[::token_number_type
-  ]b4_parser_class_name[::yytranslate_ (int token)
+  ]b4_parser_class_name[::yytranslate_ (int t)
   {
     static
     const token_number_type
   {
     static
     const token_number_type
@@ -1029,8 +1061,8 @@ b4_error_verbose_if([, int tok])[)
     {
       ]b4_translate[
     };
     {
       ]b4_translate[
     };
-    if ((unsigned int) token <= yyuser_token_number_max_)
-      return translate_table[token];
+    if ((unsigned int) t <= yyuser_token_number_max_)
+      return translate_table[t];
     else
       return yyundef_token_;
   }
     else
       return yyundef_token_;
   }
@@ -1047,21 +1079,20 @@ b4_error_verbose_if([, int tok])[)
   const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
   const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
 
   const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
   const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
 
-} // namespace yy
+]b4_namespace_close[
 
 ]b4_epilogue
 dnl
 
 ]b4_epilogue
 dnl
-@output b4_dir_prefix[]stack.hh
-b4_copyright([stack handling for Bison C++ parsers],
-  [2002, 2003, 2004, 2005, 2006])[
+@output(b4_dir_prefix[]stack.hh@)@
+b4_copyright([Stack handling for Bison parsers in C++],
+             [2002-2010])[
 
 #ifndef BISON_STACK_HH
 # define BISON_STACK_HH
 
 #include <deque>
 
 
 #ifndef BISON_STACK_HH
 # define BISON_STACK_HH
 
 #include <deque>
 
-namespace yy
-{
+]b4_namespace_open[
   template <class T, class S = std::deque<T> >
   class stack
   {
   template <class T, class S = std::deque<T> >
   class stack
   {
@@ -1147,7 +1178,8 @@ namespace yy
     const S& stack_;
     unsigned int range_;
   };
     const S& stack_;
     unsigned int range_;
   };
-}
+]b4_namespace_close[
 
 
-#endif // not BISON_STACK_HH]
-m4_divert(-1)
+#endif // not BISON_STACK_HH[]dnl
+]
+m4_divert_pop(0)