From 08d401032c9a7aa7d3e2ba4c6aad6a85c8da8fab Mon Sep 17 00:00:00 2001
From: Noah Heuser <nheuser@uni-koblenz.de>
Date: Thu, 27 Jun 2024 16:19:26 +0200
Subject: [PATCH] Fixed bug in checkDerivation where foundRule was always true
 for epsilon-Rules

---
 ChatGPTParsing/src/derivation/Derivation.java | 26 +++++++++++++++++--
 ChatGPTParsing/src/main/Main.java             | 26 +++++++++----------
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/ChatGPTParsing/src/derivation/Derivation.java b/ChatGPTParsing/src/derivation/Derivation.java
index 464de71..68177ef 100644
--- a/ChatGPTParsing/src/derivation/Derivation.java
+++ b/ChatGPTParsing/src/derivation/Derivation.java
@@ -25,8 +25,8 @@ public class Derivation {
 			return false;
 		}
 		StringBuilder sb = new StringBuilder(steps[0]);
+		int j = 0;
 		for (int i = 0; i < steps.length - 1; i++) {
-			int j = 0;
 			while (j < sb.length() && !rules.containsKey(sb.charAt(j) + "")) {
 				j++;
 			}
@@ -34,6 +34,7 @@ public class Derivation {
 			List<List<String>> cs = rules.get(v);
 			boolean foundRule = false;
 			int ruleLength = 0;
+			boolean[] ba = new boolean[2];
 			for (List<String> c : cs) {
 				sb.deleteCharAt(j);
 				int k = j;
@@ -41,7 +42,8 @@ public class Derivation {
 					sb.insert(k++, s);
 				}
 				ruleLength = k - j;
-				if (substringEquals(sb, steps[i + 1], j, j + ruleLength)) {
+				ba = checkInfix(ruleLength, sb, steps[i + 1], j);
+				if (ba[0]) {
 					foundRule = true;
 					break;
 				}
@@ -50,6 +52,9 @@ public class Derivation {
 			if (!foundRule) {
 				return false;
 			}
+			if (ba[1]) {
+				continue;
+			}
 			if (!substringEquals(sb, steps[i + 1], 0, j)) {
 				return false;
 			}
@@ -74,4 +79,21 @@ public class Derivation {
 		}
 		return true;
 	}
+
+	private boolean[] checkInfix(int ruleLength, StringBuilder a, String b, int current) {
+		boolean[] ba = new boolean[2];
+		if (ruleLength != 0) {
+			ba[0] = substringEquals(a, b, current, current + ruleLength);
+		} else {
+			boolean prefixEquals = substringEquals(a, b, 0, current);
+			if (!prefixEquals) {
+				ba[0] = false;
+				return ba;
+			}
+			int end = a.length() >= b.length() ? a.length() : b.length();
+			ba[0] = substringEquals(a, b, current + ruleLength, end);
+			ba[1] = true;
+		}
+		return ba;
+	}
 }
diff --git a/ChatGPTParsing/src/main/Main.java b/ChatGPTParsing/src/main/Main.java
index 4892de8..5a8deca 100644
--- a/ChatGPTParsing/src/main/Main.java
+++ b/ChatGPTParsing/src/main/Main.java
@@ -1,29 +1,27 @@
 package main;
 
-import java.util.List;
-
 import derivation.Derivation;
 import grammar.Grammar;
-import writer.Writer;
 
 public class Main {
 
 	// ε
 
 	public static void main(String[] args) {
-		Writer w = new Writer();
-		List<String> vars = List.of("S", "A", "B", "C");
-		List<String> alphabet = List.of("a", "b", "c");
-		int maxConclusios = 3;
-		int maxConclusioSize = 4;
-		String start = "S";
-		int mode = 3;
-		w.runType2Grammar(vars, alphabet, maxConclusios, maxConclusioSize, start, mode, 3);
+//		Writer w = new Writer();
+//		List<String> vars = List.of("S", "A", "B", "C");
+//		List<String> alphabet = List.of("a", "b", "c");
+//		int maxConclusios = 3;
+//		int maxConclusioSize = 4;
+//		String start = "S";
+//		int mode = 3;
+//		w.runType2Grammar(vars, alphabet, maxConclusios, maxConclusioSize, start, mode, 3);
 		Grammar g = Grammar.toGrammar(
-				"G = (V, T, R, S)\nV = {S, A, B, C}\nT = {a, b, c}\nR = {S -> BcAc,\n     A -> cbC | c,\n     B -> ab | C,\n     C -> cc | ACB}");
+				"G = (V, T, R, S)\nV = {S, A, B, C}\nT = {a, b, c}\nR = {S -> aA | CB,\n     A -> Sc | AACA,\n     B -> cCS | CC,\n     C -> ε | bb}");
 		System.out.println(g.getRules());
-		String[] steps = { "S", "BcAc", "abcAc", "abccc" };
-		Derivation d = new Derivation(steps, g.getRules(), g.getStart(), "abccc");
+		String[] steps = { "S", "aA", "aSc", "aCBc", "aBc", "acCSc", "acbbSc", "acbbCBc", "acbbBc", "acbbCCc", "acbbCc",
+				"acbbc" };
+		Derivation d = new Derivation(steps, g.getRules(), g.getStart(), "acbbc");
 		System.out.println(d.checkDerivation());
 //		Type2Parser t2p = new Type2Parser();
 //		Map<String, List<List<String>>> rules = new LinkedHashMap<>();
-- 
GitLab