From e9fa17068e8e90400d9264dd73aae0c5db414363 Mon Sep 17 00:00:00 2001
From: Noah Heuser <nheuser@uni-koblenz.de>
Date: Wed, 3 Jul 2024 01:04:26 +0200
Subject: [PATCH] =?UTF-8?q?added=20Reader=20to=20return=20derivation=20che?=
 =?UTF-8?q?ck,=20updated=20parsers,=20generators=20and=20derivation=20chec?=
 =?UTF-8?q?ker=20to=20accept=20and=20generate=20=CE=B5=20not=20"",=20some?=
 =?UTF-8?q?=20file=20path=20changes=20in=20Writer,=20toStringPython()=20wi?=
 =?UTF-8?q?thout=20linebreaks?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ChatGPTParsing/src/derivation/Derivation.java | 19 +++--
 ChatGPTParsing/src/derivation/Reader.java     | 74 +++++++++----------
 ChatGPTParsing/src/grammar/Grammar.java       |  8 +-
 ChatGPTParsing/src/json/JSONArray.java        |  2 +-
 ChatGPTParsing/src/json/JSONBoolean.java      | 13 +++-
 ChatGPTParsing/src/json/JSONObject.java       |  2 +-
 ChatGPTParsing/src/main/Main.java             | 20 +++--
 ChatGPTParsing/src/type2/Type2Parser.java     |  2 +-
 .../src/type3/Type3GrammarGenerator.java      |  2 +-
 ChatGPTParsing/src/type3/Type3Parser.java     |  3 +
 .../src/word_generator/WordGenerator.java     | 11 ++-
 ChatGPTParsing/src/writer/Writer.java         | 25 ++++++-
 12 files changed, 110 insertions(+), 71 deletions(-)

diff --git a/ChatGPTParsing/src/derivation/Derivation.java b/ChatGPTParsing/src/derivation/Derivation.java
index c84225c..5e3353a 100644
--- a/ChatGPTParsing/src/derivation/Derivation.java
+++ b/ChatGPTParsing/src/derivation/Derivation.java
@@ -12,15 +12,17 @@ public class Derivation {
 	private String start;
 	private String word;
 
-	public Derivation(String[] steps, String grammar, String word) {
-		Grammar g = Grammar.toGrammar(grammar);
+	public Derivation(String[] steps, Grammar grammar, String word) {
 		this.steps = steps;
-		this.rules = g.getRules();
-		this.start = g.getStart();
+		this.rules = grammar.getRules();
+		this.start = grammar.getStart();
 		this.word = word;
 	}
 
-	public boolean checkDerivation() {
+	public Boolean checkDerivation() {
+		if (steps.length == 0) {
+			return null;
+		}
 		if (!steps[0].equals(start)) {
 			return false;
 		}
@@ -33,6 +35,9 @@ public class Derivation {
 			while (j < sb.length() && !rules.containsKey(sb.charAt(j) + "")) {
 				j++;
 			}
+			if (j == sb.length()) {
+				return false;
+			}
 			String v = sb.charAt(j) + "";
 			List<List<String>> cs = rules.get(v);
 			boolean foundRule = false;
@@ -87,6 +92,10 @@ public class Derivation {
 		boolean[] ba = new boolean[2];
 		if (ruleLength != 0) {
 			ba[0] = substringEquals(a, b, current, current + ruleLength);
+		} else if (a.isEmpty()) {
+			boolean e = b.equals(((char) 949) + "");
+			ba[0] = e;
+			ba[1] = e;
 		} else {
 			boolean prefixEquals = substringEquals(a, b, 0, current);
 			if (!prefixEquals) {
diff --git a/ChatGPTParsing/src/derivation/Reader.java b/ChatGPTParsing/src/derivation/Reader.java
index 14ed482..530ac60 100644
--- a/ChatGPTParsing/src/derivation/Reader.java
+++ b/ChatGPTParsing/src/derivation/Reader.java
@@ -3,47 +3,49 @@ package derivation;
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
 
 import grammar.Grammar;
+import json.JSONArray;
+import json.JSONBoolean;
 
 public class Reader {
 
 	private String defaultPath = "//wsl.localhost/Ubuntu/home/noah/gptgrammarparsing/PythonAPI";
+	String path;
 
-	private String readOutput() {
-		String line = "";
-		try (BufferedReader br = new BufferedReader(new FileReader(defaultPath + "/test.txt"))) {
-			line = br.readLine();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		String[] lineArray = line.split(": ");
-		lineArray[0] = lineArray[0].substring(1);
-		int lastIndex = lineArray.length - 1;
-		int lastChar = lineArray[lastIndex].length() - 1;
-		lineArray[lastIndex] = lineArray[lastIndex].substring(0, lastChar);
-		return lineArray[0];
+	public Reader() {
+		path = defaultPath;
 	}
 
-	private String convertToParsableString(String s) {
-		StringBuilder sb = new StringBuilder();
-		char[] ca = s.toCharArray();
-		int i = 0;
-		while (i < ca.length) {
-			if (ca[i] == '\\' && ca[i + 1] == 'n') {
-				sb.append('\n');
-				i++;
-			} else if (ca[i] != '\"') {
-				sb.append(ca[i]);
+	public Reader(String path) {
+		this.path = path;
+	}
+
+	public List<Derivation> readOutput(int type, int id) {
+		List<Derivation> derivations = new LinkedList<>();
+		String file = "/results_algo/t" + type + "/input_dev_check" + id + ".txt";
+		try (BufferedReader br = new BufferedReader(new FileReader(defaultPath + file))) {
+			String line;
+			while ((line = br.readLine()) != null) {
+				String[] lineArray = line.split("! ");
+				Grammar g = Grammar.toGrammar(lineArray[0]);
+				String word = lineArray[1];
+				String[] steps = parseDerivation(lineArray[2]);
+				derivations.add(new Derivation(steps, g, word));
 			}
-			i++;
+		} catch (IOException e) {
+			e.printStackTrace();
 		}
-		return sb.toString();
+		return derivations;
 	}
 
 	private String[] parseDerivation(String d) {
-		String dNew = d.replace("\"", "");
-		String[] dArray = dNew.split(", ");
+		if (d.equals("[]")) {
+			return new String[0];
+		}
+		String[] dArray = d.replace("\'", "").split(", ");
 		dArray[0] = dArray[0].substring(1);
 		int lastIndex = dArray.length - 1;
 		int lastChar = dArray[lastIndex].length() - 1;
@@ -51,19 +53,15 @@ public class Reader {
 		return dArray;
 	}
 
-	private boolean checkDerivation(String grammar, String derivation, String word) {
-		String[] dArray = parseDerivation(derivation);
-		Derivation d = new Derivation(dArray, grammar, word);
-		return d.checkDerivation();
-	}
-
 	public static void main(String[] args) {
 		Reader r = new Reader();
-		String g = r.readOutput();
-		System.out.println(g);
-		String s = r.convertToParsableString(g);
-		Grammar grammar = Grammar.toGrammar(s);
-		System.out.println(grammar);
+		List<Derivation> devs = r.readOutput(3, 0);
+		JSONArray devJSON = new JSONArray();
+		for (Derivation dev : devs) {
+			JSONBoolean jb = new JSONBoolean(dev.checkDerivation());
+			devJSON.add(jb);
+		}
+		System.out.println(devJSON);
 	}
 
 }
diff --git a/ChatGPTParsing/src/grammar/Grammar.java b/ChatGPTParsing/src/grammar/Grammar.java
index 8c3bb88..c69b187 100644
--- a/ChatGPTParsing/src/grammar/Grammar.java
+++ b/ChatGPTParsing/src/grammar/Grammar.java
@@ -54,7 +54,7 @@ public abstract class Grammar {
 	}
 
 	public static Grammar toGrammar(String gString) {
-		String[] gArray = gString.split("\\n");
+		String[] gArray = gString.split("; ");
 		String variables = gArray[1];
 		String[] vars = variables.split(", ");
 		vars[0] = vars[0].substring(5);
@@ -110,7 +110,7 @@ public abstract class Grammar {
 
 	public String toStringPython() {
 		StringBuilder sb = new StringBuilder();
-		sb.append("G = (V, T, R, " + this.getStart() + ")\\n");
+		sb.append("G = (V, T, R, " + this.getStart() + "); ");
 		sb.append("V = {");
 		for (int i = 0; i < this.getVars().size(); i++) {
 			sb.append(this.getVars().get(i));
@@ -118,7 +118,7 @@ public abstract class Grammar {
 				sb.append(", ");
 			}
 		}
-		sb.append("}\\n");
+		sb.append("}; ");
 		sb.append("T = {");
 		for (int i = 0; i < this.getAlphabet().size(); i++) {
 			sb.append(this.getAlphabet().get(i));
@@ -126,7 +126,7 @@ public abstract class Grammar {
 				sb.append(", ");
 			}
 		}
-		sb.append("}\\n");
+		sb.append("}; ");
 		sb.append("R = {");
 		Iterator<Entry<String, List<List<String>>>> it = this.getRules().entrySet().iterator();
 		while (it.hasNext()) {
diff --git a/ChatGPTParsing/src/json/JSONArray.java b/ChatGPTParsing/src/json/JSONArray.java
index e0dc047..8262a65 100644
--- a/ChatGPTParsing/src/json/JSONArray.java
+++ b/ChatGPTParsing/src/json/JSONArray.java
@@ -27,7 +27,7 @@ public class JSONArray implements JSONDatatype, Iterable<JSONDatatype> {
 		sb.append("[");
 		for (int i = 0; i < a.size(); i++) {
 			if (i < a.size() - 1) {
-				sb.append(a.get(i).toString() + ",");
+				sb.append(a.get(i).toString() + ", ");
 			} else {
 				sb.append(a.get(i).toString());
 			}
diff --git a/ChatGPTParsing/src/json/JSONBoolean.java b/ChatGPTParsing/src/json/JSONBoolean.java
index c28df2a..9ac70d1 100644
--- a/ChatGPTParsing/src/json/JSONBoolean.java
+++ b/ChatGPTParsing/src/json/JSONBoolean.java
@@ -2,14 +2,21 @@ package json;
 
 public class JSONBoolean implements JSONDatatype {
 
-	private boolean b;
+	private Boolean b;
 
-	public JSONBoolean(boolean b) {
+	public JSONBoolean(Boolean b) {
 		this.b = b;
 	}
 
 	@Override
 	public String toString() {
-		return b ? "true" : "false";
+		if (b == null) {
+			return "null";
+		}
+		if (b.booleanValue()) {
+			return "true";
+		} else {
+			return "false";
+		}
 	}
 }
diff --git a/ChatGPTParsing/src/json/JSONObject.java b/ChatGPTParsing/src/json/JSONObject.java
index c55fd04..3dd26aa 100644
--- a/ChatGPTParsing/src/json/JSONObject.java
+++ b/ChatGPTParsing/src/json/JSONObject.java
@@ -28,7 +28,7 @@ public class JSONObject implements JSONDatatype {
 			Entry<String, JSONDatatype> e = it.next();
 			sb.append(new JSONString(e.getKey()).toString() + ":" + e.getValue().toString());
 			if (it.hasNext()) {
-				sb.append(",");
+				sb.append(", ");
 			}
 		}
 		sb.append("}");
diff --git a/ChatGPTParsing/src/main/Main.java b/ChatGPTParsing/src/main/Main.java
index 326ae1e..e1047c0 100644
--- a/ChatGPTParsing/src/main/Main.java
+++ b/ChatGPTParsing/src/main/Main.java
@@ -2,7 +2,6 @@ package main;
 
 import java.util.List;
 
-import grammar.Grammar;
 import writer.Writer;
 
 public class Main {
@@ -10,22 +9,21 @@ public class Main {
 	// ε
 
 	public static void main(String[] args) {
-		List<String> vars = List.of("S", "A", "B", "C");
-		List<String> alphabet = List.of("a", "b", "c");
+		List<String> vars = List.of("S", "A", "B");
+		List<String> alphabet = List.of("a", "b");
 		int maxConclusios = 3;
-		int maxConclusioSize = 4;
+		int maxConclusioSize = 3;
 		String start = "S";
 		int mode = 3;
 		Writer w = new Writer(vars, alphabet, maxConclusios, maxConclusioSize, start, mode);
-		w.setT3Counter(0);
-		w.setT2Counter(1);
+		int type = 2;
+//		w.setT3Counter(1);
+//		w.setT2Counter(1);
 //		w.runType3Grammar(3);
 //		w.runType2Grammar(3);
-		System.out.println("T3:" + w.getT3Counter());
-		System.out.println("T2:" + w.getT2Counter());
-		Grammar g = Grammar.toGrammar(
-				"G = (V, T, R, S)\nV = {S, A, B, C}\nT = {a, b, c}\nR = {S -> Cb | SS | SaA, A -> Ac | AaS | ε, B -> ca | bBa, C -> BSS | ε}");
-		System.out.println(g);
+//		System.out.println("T3:" + w.getT3Counter());
+//		System.out.println("T2:" + w.getT2Counter());
+		w.writeDerivationResultsToFile(type, 0);
 	}
 
 }
diff --git a/ChatGPTParsing/src/type2/Type2Parser.java b/ChatGPTParsing/src/type2/Type2Parser.java
index ef6867a..46e76b4 100644
--- a/ChatGPTParsing/src/type2/Type2Parser.java
+++ b/ChatGPTParsing/src/type2/Type2Parser.java
@@ -337,7 +337,7 @@ public class Type2Parser {
 	}
 
 	public boolean isPartOfLanguage(Map<String, List<List<String>>> cnfRules, String word) {
-		if (word.isEmpty()) {
+		if (word.equals(((char) 949) + "")) {
 			return ListOfListContains.contains(cnfRules.get("S'"), new LinkedList<>());
 		}
 		return cyk(cnfRules, word);
diff --git a/ChatGPTParsing/src/type3/Type3GrammarGenerator.java b/ChatGPTParsing/src/type3/Type3GrammarGenerator.java
index 169d93a..96fada7 100644
--- a/ChatGPTParsing/src/type3/Type3GrammarGenerator.java
+++ b/ChatGPTParsing/src/type3/Type3GrammarGenerator.java
@@ -17,7 +17,7 @@ public class Type3GrammarGenerator {
 	private List<List<String>> genConclusios(List<String> alphabet, List<String> vars, int maxConclusios,
 			boolean start) {
 		List<List<String>> conclusios = new LinkedList<>();
-		if (start && Math.random() <= 0.2) {
+		if (start && Math.random() <= 0.4) {
 			conclusios.add(new LinkedList<>());
 		}
 		int numOfConclusios = random.nextInt(maxConclusios) + 1;
diff --git a/ChatGPTParsing/src/type3/Type3Parser.java b/ChatGPTParsing/src/type3/Type3Parser.java
index d33f010..97eba19 100644
--- a/ChatGPTParsing/src/type3/Type3Parser.java
+++ b/ChatGPTParsing/src/type3/Type3Parser.java
@@ -50,6 +50,9 @@ public class Type3Parser {
 	}
 
 	public boolean isPartOfLanguage(FiniteStateMachine fsm, String word) {
+		if (word.equals(((char) 949) + "")) {
+			word = "";
+		}
 		for (char c : word.toCharArray()) {
 			fsm.switchStates(c + "");
 			if (fsm.isEmptyCurrent()) {
diff --git a/ChatGPTParsing/src/word_generator/WordGenerator.java b/ChatGPTParsing/src/word_generator/WordGenerator.java
index ffd65d6..b1f8be2 100644
--- a/ChatGPTParsing/src/word_generator/WordGenerator.java
+++ b/ChatGPTParsing/src/word_generator/WordGenerator.java
@@ -12,8 +12,12 @@ public class WordGenerator {
 	Random random = new Random();
 
 	public String wordGenerator(int maxLength) {
-		return random.ints(random.nextInt(maxLength + 1), 97, 123)
-				.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();
+		StringBuilder sb = random.ints(random.nextInt(maxLength + 1), 97, 123).collect(StringBuilder::new,
+				StringBuilder::appendCodePoint, StringBuilder::append);
+		if (sb.isEmpty()) {
+			return ((char) 949) + "";
+		}
+		return sb.toString();
 	}
 
 	public String wordGeneratorOverAlphabet(int maxLength, List<String> alphabet) {
@@ -22,6 +26,9 @@ public class WordGenerator {
 		while (sb.length() < length) {
 			sb.append(alphabet.get(random.nextInt(alphabet.size())));
 		}
+		if (sb.isEmpty()) {
+			return ((char) 949) + "";
+		}
 		return sb.toString();
 	}
 
diff --git a/ChatGPTParsing/src/writer/Writer.java b/ChatGPTParsing/src/writer/Writer.java
index cb4de6d..7dfdd9f 100644
--- a/ChatGPTParsing/src/writer/Writer.java
+++ b/ChatGPTParsing/src/writer/Writer.java
@@ -11,6 +11,8 @@ import java.util.Map;
 import java.util.Set;
 
 import auxiliary.ListOfRulesContains;
+import derivation.Derivation;
+import derivation.Reader;
 import grammar.Type2Grammar;
 import grammar.Type3Grammar;
 import json.JSONArray;
@@ -37,8 +39,8 @@ public class Writer {
 	String start;
 	int mode;
 
-	private static final int DISTINCT_WORDS = 10;
-	private static final int MAX_LENGTH = 20;
+	private static final int DISTINCT_WORDS = 5;
+	private static final int MAX_LENGTH = 15;
 
 	private WordGenerator wg = new WordGenerator();
 	private Type2Parser t2p = new Type2Parser();
@@ -70,6 +72,21 @@ public class Writer {
 		this.path = path;
 	}
 
+	public void writeDerivationResultsToFile(int type, int id) {
+		Reader r = new Reader(path);
+		List<Derivation> devs = r.readOutput(type, id);
+		JSONArray devJSON = new JSONArray();
+		for (Derivation dev : devs) {
+			JSONBoolean jb = new JSONBoolean(dev.checkDerivation());
+			devJSON.add(jb);
+		}
+		try (FileWriter fw = new FileWriter(path + "/results_algo/t" + type + "/results_algo_d" + id + ".txt")) {
+			fw.write(devJSON.toString());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
 	private void writePairsToFile(JSONObject pairs, int type) {
 		String d = path + "/input_data/t" + type + "/input";
 		String p = "";
@@ -103,7 +120,7 @@ public class Writer {
 			k++;
 		}
 		try (BufferedWriter bw = new BufferedWriter(
-				new FileWriter(path + "/results_algo/t2/results_algo_" + t2Counter + ".txt"))) {
+				new FileWriter(path + "/results_algo/t2/results_algo_b" + t2Counter + ".txt"))) {
 			bw.write(results.toString());
 		} catch (IOException e) {
 			e.printStackTrace();
@@ -124,7 +141,7 @@ public class Writer {
 			k++;
 		}
 		try (BufferedWriter bw = new BufferedWriter(
-				new FileWriter(path + "/results_algo/t3/results_algo_" + t3Counter + ".txt"))) {
+				new FileWriter(path + "/results_algo/t3/results_algo_b" + t3Counter + ".txt"))) {
 			bw.write(results.toString());
 		} catch (IOException e) {
 			e.printStackTrace();
-- 
GitLab