]> git.saurik.com Git - bison.git/blobdiff - data/lalr1.java
NEWS: update.
[bison.git] / data / lalr1.java
index 32462d7828631be8a053b8b14984d0470fda71ca..b5884c4028c6ccfe1457151a2fc09bae122498fa 100644 (file)
@@ -1,6 +1,6 @@
 # Java skeleton for Bison -*- autoconf -*-
 
 # Java skeleton for Bison -*- autoconf -*-
 
-# Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2007-2012 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
 
 # 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
@@ -25,7 +25,7 @@ m4_ifval(m4_defn([b4_symbol_destructors]),
 m4_divert_push(0)dnl
 @output(b4_parser_file_name@)@
 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
 m4_divert_push(0)dnl
 @output(b4_parser_file_name@)@
 b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
-             [2007, 2008, 2009, 2010])
+             [2007-2011])
 
 b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
 ])[/* First part of user declarations.  */
 
 b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
 ])[/* First part of user declarations.  */
@@ -102,7 +102,7 @@ b4_token_enums(b4_tokens)
   private ]b4_location_type[ yylloc (YYStack rhs, int n)
   {
     if (n > 0)
   private ]b4_location_type[ yylloc (YYStack rhs, int n)
   {
     if (n > 0)
-      return new ]b4_location_type[ (rhs.locationAt (1).begin, rhs.locationAt (n).end);
+      return new ]b4_location_type[ (rhs.locationAt (n-1).begin, rhs.locationAt (0).end);
     else
       return new ]b4_location_type[ (rhs.locationAt (0).end);
   }]])[
     else
       return new ]b4_location_type[ (rhs.locationAt (0).end);
   }]])[
@@ -255,14 +255,14 @@ b4_lexer_if([[
     }
 
     public final void pop () {
     }
 
     public final void pop () {
-      height--;
+      pop (1);
     }
 
     public final void pop (int num) {
       // Avoid memory leaks... garbage collection is a white lie!
       if (num > 0) {
     }
 
     public final void pop (int num) {
       // Avoid memory leaks... garbage collection is a white lie!
       if (num > 0) {
-       java.util.Arrays.fill (valueStack, height - num + 1, height, null);
-        ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height, null);]])[
+       java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null);
+        ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[
       }
       height -= num;
     }
       }
       height -= num;
     }
@@ -284,7 +284,7 @@ b4_lexer_if([[
     {
       out.print ("Stack now");
 
     {
       out.print ("Stack now");
 
-      for (int i = 0; i < height; i++)
+      for (int i = 0; i <= height; i++)
         {
          out.print (' ');
          out.print (stateStack[i]);
         {
          out.print (' ');
          out.print (stateStack[i]);
@@ -454,8 +454,6 @@ b4_lexer_if([[
     /// Semantic value of the lookahead.
     b4_yystype[ yylval = null;
 
     /// Semantic value of the lookahead.
     b4_yystype[ yylval = null;
 
-    int yyresult;
-
     yycdebug ("Starting parse\n");
     yyerrstatus_ = 0;
 
     yycdebug ("Starting parse\n");
     yyerrstatus_ = 0;
 
@@ -582,8 +580,10 @@ m4_popdef([b4_at_dollar])])dnl
         /* If not already recovering from an error, report this error.  */
         if (yyerrstatus_ == 0)
           {
         /* 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;])[
           }
 
         ]b4_locations_if([yyerrloc = yylloc;])[
@@ -642,7 +642,7 @@ m4_popdef([b4_at_dollar])])dnl
              }
 
            /* Pop the current state because it cannot handle the error token.  */
              }
 
            /* Pop the current state because it cannot handle the error token.  */
-           if (yystack.height == 1)
+           if (yystack.height == 0)
              return false;
 
            ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
              return false;
 
            ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
@@ -683,17 +683,52 @@ m4_popdef([b4_at_dollar])])dnl
   {
     if (errorVerbose)
       {
   {
     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;
                 /* 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_;
                 /* Stay within bounds of both yycheck and yytname.  */
                 int yychecklim = yylast_ - yyn + 1;
                 int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
@@ -702,11 +737,6 @@ m4_popdef([b4_at_dollar])])dnl
                   if (yycheck_[x + yyn] == x && x != yyterror_
                       && !yy_table_value_is_error_ (yytable_[x + yyn]))
                     ++count;
                   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;
                 if (count < 5)
                   {
                     count = 0;
@@ -718,6 +748,7 @@ m4_popdef([b4_at_dollar])])dnl
                           res.append (yytnamerr_ (yytname_[x]));
                         }
                   }
                           res.append (yytnamerr_ (yytname_[x]));
                         }
                   }
+              }
             return res.toString ();
           }
       }
             return res.toString ();
           }
       }