]> git.saurik.com Git - bison.git/blobdiff - data/lalr1.cc
* data/lalr1.cc (yyreport_syntax_error_): Catch up with glr.c and
[bison.git] / data / lalr1.cc
index b921b818603a061f485bc197d82fdac5f6e2b741..8e82cb51f3efc266ec5f6a08eedcbf3cfe80af30 100644 (file)
@@ -810,24 +810,30 @@ yy::]b4_parser_class_name[::yyreport_syntax_error_ ()
       yyn_ = yypact_[yystate_];
       if (yypact_ninf_ < yyn_ && yyn_ < yylast_)
        {
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         int yyxbegin = yyn_ < 0 ? -yyn_ : 0;
+
+         /* Stay within bounds of both yycheck and yytname.  */
+         int yychecklim = yylast_ - yyn_;
+         int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
+          int count = 0;
+          for (int x = yyxbegin; x < yyxend; ++x)
+            if (yycheck_[x + yyn_] == x && x != yyterror_)
+              ++count;
+
          message = "syntax error, unexpected ";
          message += yyname_[yyilooka_];
-         {
-           int count = 0;
-           for (int x = (yyn_ < 0 ? -yyn_ : 0); x < yyntokens_ + yynnts_; ++x)
-             if (yycheck_[x + yyn_] == x && x != yyterror_)
-               ++count;
-           if (count < 5)
-             {
-               count = 0;
-               for (int x = (yyn_ < 0 ? -yyn_ : 0); x < yyntokens_ + yynnts_; ++x)
-                 if (yycheck_[x + yyn_] == x && x != yyterror_)
-                   {
-                     message += (!count++) ? ", expecting " : " or ";
-                     message += yyname_[x];
-                   }
-             }
-         }
+          if (count < 5)
+            {
+              count = 0;
+              for (int x = yyxbegin; x < yyxend; ++x)
+                if (yycheck_[x + yyn_] == x && x != yyterror_)
+                  {
+                    message += (!count++) ? ", expecting " : " or ";
+                    message += yyname_[x];
+                 }
+            }
        }
       else
 #endif