From: Tim Landscheidt <tim@tim-landscheidt.de>
Date: Sun, 12 Feb 2012 01:29:41 +0000 (+0000)
Subject: Java: Fix syntax error handling without error token.
X-Git-Tag: v2.5.1_rc2~73
X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/e34e97bcd736ab3193bfd3abd4162db3b159836d?ds=inline

Java: Fix syntax error handling without error token.

* data/lalr1.java (YYParser::parse): Here.
* tests/java.at: Add test case.
---

diff --git a/data/lalr1.java b/data/lalr1.java
index f7f2ba36..b5884c40 100644
--- a/data/lalr1.java
+++ b/data/lalr1.java
@@ -642,7 +642,7 @@ m4_popdef([b4_at_dollar])])dnl
 	      }
 
 	    /* 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);])[
diff --git a/tests/java.at b/tests/java.at
index e16701df..b9e9deee 100644
--- a/tests/java.at
+++ b/tests/java.at
@@ -749,3 +749,69 @@ AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep 'Position']], [1], [ignore])
 AT_CHECK([[$EGREP -v ' */?\*' YYParser.java | grep 'Location']], [1], [ignore])
 
 AT_CLEANUP
+
+
+# ----------------------------------------------- #
+# Java syntax error handling without error token. #
+# ----------------------------------------------- #
+
+AT_SETUP([Java syntax error handling without error token])
+
+AT_DATA([[YYParser.y]], [[%language "Java"
+
+%lex-param { String s }
+
+%code imports {
+  import java.io.IOException;
+}
+
+%code lexer {
+  String Input;
+  int Position;
+
+  public YYLexer (String s)
+  {
+    Input    = s;
+    Position = 0;
+  }
+
+  public void yyerror (String s)
+  {
+    System.err.println (s);
+  }
+
+  public Object getLVal ()
+  {
+    return null;
+  }
+
+  public int yylex () throws IOException
+  {
+    if (Position >= Input.length ())
+      return EOF;
+    else
+      return Input.charAt (Position++);
+  }
+}
+
+%code {
+  public static void main (String args []) throws IOException
+  {
+    YYParser p = new YYParser (args [0]);
+    p.parse ();
+  }
+}
+%%
+input:
+  'a' 'a'
+;
+]])
+AT_BISON_CHECK([[YYParser.y]])
+AT_JAVA_COMPILE([[YYParser.java]])
+AT_JAVA_PARSER_CHECK([[YYParser aa]], [[0]], [[]], [[]])
+AT_JAVA_PARSER_CHECK([[YYParser ab]], [[0]], [[]], [[syntax error
+]])
+AT_JAVA_PARSER_CHECK([[YYParser ba]], [[0]], [[]], [[syntax error
+]])
+
+AT_CLEANUP