]> git.saurik.com Git - bison.git/blobdiff - data/lalr1.java
doc: cleanup.
[bison.git] / data / lalr1.java
index 32462d7828631be8a053b8b14984d0470fda71ca..76460ead074e25963475bae63a253e701156e26e 100644 (file)
@@ -582,8 +582,10 @@ m4_popdef([b4_at_dollar])])dnl
         /* If not already recovering from an error, report this error.  */
         if (yyerrstatus_ == 0)
           {
-           ++yynerrs_;
-           yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken));
+            ++yynerrs_;
+            if (yychar == yyempty_)
+              yytoken = yyempty_;
+            yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken));
           }
 
         ]b4_locations_if([yyerrloc = yylloc;])[
@@ -683,17 +685,52 @@ m4_popdef([b4_at_dollar])])dnl
   {
     if (errorVerbose)
       {
-        int yyn = yypact_[yystate];
-        if (yypact_ninf_ < yyn && yyn <= yylast_)
+        /* There are many possibilities here to consider:
+           - Assume YYFAIL is not used.  It's too flawed to consider.
+             See
+             <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+             for details.  YYERROR is fine as it does not invoke this
+             function.
+           - If this state is a consistent state with a default action,
+             then the only way this function was invoked is if the
+             default action is an error action.  In that case, don't
+             check for expected tokens because there are none.
+           - The only way there can be no lookahead present (in tok) is
+             if this state is a consistent state with a default action.
+             Thus, detecting the absence of a lookahead is sufficient to
+             determine that there is no unexpected or expected token to
+             report.  In that case, just report a simple "syntax error".
+           - Don't assume there isn't a lookahead just because this
+             state is a consistent state with a default action.  There
+             might have been a previous inconsistent state, consistent
+             state with a non-default action, or user semantic action
+             that manipulated yychar.  (However, yychar is currently out
+             of scope during semantic actions.)
+           - Of course, the expected token list depends on states to
+             have correct lookahead information, and it depends on the
+             parser not to perform extra reductions after fetching a
+             lookahead from the scanner and before detecting a syntax
+             error.  Thus, state merging (from LALR or IELR) and default
+             reductions corrupt the expected token list.  However, the
+             list is correct for canonical LR with one exception: it
+             will still contain any token that will not be accepted due
+             to an error action in a later state.
+        */
+        if (tok != yyempty_)
           {
-            StringBuffer res;
-
+            // FIXME: This method of building the message is not compatible
+            // with internationalization.
+            StringBuffer res =
+              new StringBuffer ("syntax error, unexpected ");
+            res.append (yytnamerr_ (yytname_[tok]));
+            int yyn = yypact_[yystate];
+            if (!yy_pact_value_is_default_ (yyn))
+              {
                 /* Start YYX at -YYN if negative to avoid negative
                    indexes in 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 yychecklim = yylast_ - yyn + 1;
                 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
@@ -702,11 +739,6 @@ m4_popdef([b4_at_dollar])])dnl
                   if (yycheck_[x + yyn] == x && x != yyterror_
                       && !yy_table_value_is_error_ (yytable_[x + yyn]))
                     ++count;
-
-            // FIXME: This method of building the message is not compatible
-            // with internationalization.
-            res = new StringBuffer ("syntax error, unexpected ");
-            res.append (yytnamerr_ (yytname_[tok]));
                 if (count < 5)
                   {
                     count = 0;
@@ -718,6 +750,7 @@ m4_popdef([b4_at_dollar])])dnl
                           res.append (yytnamerr_ (yytname_[x]));
                         }
                   }
+              }
             return res.toString ();
           }
       }