]> git.saurik.com Git - bison.git/blobdiff - data/lalr1.cc
Update copyright.
[bison.git] / data / lalr1.cc
index 9863ae995587ebf282d9badaa09074d8fd758a3e..7eddaf90afa17a6f1ab31bbf895dc8f0b130d017 100644 (file)
@@ -149,11 +149,19 @@ b4_syncline([@oline@], [@ofile@])[
 # define YYDEBUG ]b4_debug[
 #endif
 
-/* Enabling verbose error message.  */
-#ifndef YYERROR_VERBOSE
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
 # define YYERROR_VERBOSE ]b4_error_verbose[
 #endif
 
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE ]b4_token_table[
+#endif
+
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
 ]m4_ifdef([b4_stype],
 [b4_syncline([b4_stype_line], [b4_filename])
@@ -321,9 +329,14 @@ namespace yy
     /// For a rule, its RHS length.
     static const ]b4_int_type_for([b4_r2])[ yyr2_[];
 
-#if YYDEBUG || YYERROR_VERBOSE
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
     /// For a symbol, its name in clear.
-    static const char* const yyname_[];
+    static const char* const yytname_[];
+#endif
+
+#if YYERROR_VERBOSE
+    /// Convert the symbol name \a n to a form suitable for a diagnostic.
+    virtual std::string yytnamerr_ (const char *n);
 #endif
 
 #if YYDEBUG
@@ -417,6 +430,18 @@ m4_if(b4_defines_flag, 0, [],
 [
 #include @output_header_name@])[
 
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* FIXME: INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
 /* A pseudo ostream that takes yydebug_ into account. */
 # define YYCDEBUG                                                      \
   for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false)       \
@@ -459,6 +484,47 @@ do {                                       \
 #define YYABORT                goto yyabortlab
 #define YYERROR                goto yyerrorlab
 
+#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: ;
+    }
+
+  return yystr;
+}
+
+#endif
+
 #if YYDEBUG
 /*--------------------------------.
 | Print this symbol on YYOUTPUT.  |
@@ -476,7 +542,7 @@ yy::]b4_parser_class_name[::yysymprint_ (int yytype,
   (void) cdebug_;
 
   *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
-            << ' ' << yyname_[yytype] << " ("
+            << ' ' << yytname_[yytype] << " ("
              << *yylocationp << ": ";
   switch (yytype)
     {
@@ -544,6 +610,8 @@ yy::]b4_parser_class_name[::set_debug_level (debug_level_type l)
 int
 yy::]b4_parser_class_name[::parse ()
 {
+  int yyresult_;
+
   YYCDEBUG << "Starting parse" << std::endl;
 
   yynerrs_ = 0;
@@ -715,23 +783,11 @@ yyerrlab:
       /* If just tried and failed to reuse look-ahead token after an
         error, discard it.  */
 
-      /* Return failure if at end of input.  */
       if (yylooka_ <= yyeof_)
         {
-          /* If at end of input, pop the error token,
-            then the rest of the stack, then return failure.  */
+         /* Return failure if at end of input.  */
          if (yylooka_ == yyeof_)
-            for (;;)
-              {
-                 yyerror_range_[0] = yylocation_stack_[0];
-                 yypop_ ();
-                if (yystate_stack_.height () == 1)
-                  YYABORT;
-                 yydestruct_ ("Error: popping",
-                              yystos_[yystate_stack_[0]],
-                              &yysemantic_stack_[0],
-                              &yylocation_stack_[0]);
-              }
+           YYABORT;
         }
       else
         {
@@ -754,7 +810,7 @@ yyerrorlab:
      YYERROR and the label yyerrorlab therefore never appears in user
      code.  */
   if (false)
-     goto yyerrorlab;
+    goto yyerrorlab;
 
   yyerror_range_[0] = yylocation_stack_[yylen_ - 1];
   yypop_ (yylen_);
@@ -813,25 +869,38 @@ yyerrlab1:
 
   /* Accept.  */
 yyacceptlab:
-  return 0;
+  yyresult_ = 0;
+  goto yyreturn;
 
   /* Abort.  */
 yyabortlab:
-  /* Free the lookahead. */
-  yydestruct_ ("Error: discarding lookahead", yyilooka_, &yylval, &yylloc);
-  yylooka_ = yyempty_;
-  return 1;
+  yyresult_ = 1;
+  goto yyreturn;
+
+yyreturn:
+  if (yylooka_ != yyeof_ && yylooka_ != yyempty_)
+    yydestruct_ ("Error: discarding lookahead", yyilooka_, &yylval, &yylloc);
+
+  while (yystate_stack_.height () != 1)
+    {
+      yydestruct_ ("Error: popping",
+                  yystos_[yystate_stack_[0]],
+                  &yysemantic_stack_[0],
+                  &yylocation_stack_[0]);
+      yypop_ ();
+    }
+
+  return yyresult_;
 }
 
 void
 yy::]b4_parser_class_name[::yylex_ ()
 {
   YYCDEBUG << "Reading a token: ";
-#if YYLSP_NEEDED
-  yylooka_ = yylex (&yylval, &yylloc);
-#else
-  yylooka_ = yylex (&yylval);
-#endif
+  yylooka_ = ]b4_c_function_call([yylex], [int],
+[[YYSTYPE*], [&yylval]][]dnl
+b4_location_if([, [[location*], [&yylloc]]])dnl
+m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
 }
 
 // Generate an error message, and invoke error.
@@ -859,8 +928,16 @@ yy::]b4_parser_class_name[::yyreport_syntax_error_ ()
             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_[yyilooka_], etc.
+         // Until this gets fixed, this message appears in English only.
          message = "syntax error, unexpected ";
-         message += yyname_[yyilooka_];
+         message += yytnamerr_ (yytname_[yyilooka_]);
           if (count < 5)
             {
               count = 0;
@@ -868,13 +945,13 @@ yy::]b4_parser_class_name[::yyreport_syntax_error_ ()
                 if (yycheck_[x + yyn_] == x && x != yyterror_)
                   {
                     message += (!count++) ? ", expecting " : " or ";
-                    message += yyname_[x];
-                 }
+                   message += yytnamerr_ (yytname_[x]);
+                 }
             }
        }
       else
 #endif
-       message = "syntax error";
+       message = YY_("syntax error");
       error (yylloc, message);
     }
 }
@@ -961,11 +1038,11 @@ yy::]b4_parser_class_name[::yyr2_[] =
   ]b4_r2[
 };
 
-#if YYDEBUG || YYERROR_VERBOSE
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at \a yyntokens_, nonterminals. */
 const char*
-const yy::]b4_parser_class_name[::yyname_[] =
+const yy::]b4_parser_class_name[::yytname_[] =
 {
   ]b4_tname[
 };
@@ -1011,12 +1088,12 @@ yy::]b4_parser_class_name[::yyreduce_print_ (int yyrule)
 {
   unsigned int yylno = yyrline_[yyrule];
   /* Print the symbols being reduced, and their result.  */
-    *yycdebug_ << "Reducing stack by rule " << yyn_ - 1
-               << " (line " << yylno << "), ";
+  *yycdebug_ << "Reducing stack by rule " << yyn_ - 1
+             << " (line " << yylno << "), ";
   for (]b4_int_type_for([b4_prhs])[ i = yyprhs_[yyn_];
        0 <= yyrhs_[i]; ++i)
-    *yycdebug_ << yyname_[yyrhs_[i]] << ' ';
-  *yycdebug_ << "-> " << yyname_[yyr1_[yyn_]] << std::endl;
+    *yycdebug_ << yytname_[yyrhs_[i]] << ' ';
+  *yycdebug_ << "-> " << yytname_[yyr1_[yyn_]] << std::endl;
 }
 #endif // YYDEBUG