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