From 8ef9e0f8779fbeb1f2815acb036fab61e733511d Mon Sep 17 00:00:00 2001
From: NoahH <NoahH@141.26.186.166>
Date: Tue, 9 Apr 2024 11:28:47 +0200
Subject: [PATCH] added result writer for checking chatbot answers later

---
 ChatGPTParsing/src/grammar/Grammar.java      |  2 +
 ChatGPTParsing/src/grammar/Type2Grammar.java | 24 +++++-
 ChatGPTParsing/src/grammar/Type3Grammar.java | 32 +++++++-
 ChatGPTParsing/src/json/GrammarToJSON.java   | 74 ++---------------
 ChatGPTParsing/src/type2/Type2Parser.java    |  4 +-
 ChatGPTParsing/src/writer/.gitignore         |  3 +-
 ChatGPTParsing/src/writer/Writer.java        | 85 ++++++++++++--------
 7 files changed, 118 insertions(+), 106 deletions(-)

diff --git a/ChatGPTParsing/src/grammar/Grammar.java b/ChatGPTParsing/src/grammar/Grammar.java
index 475c591..dc8f023 100644
--- a/ChatGPTParsing/src/grammar/Grammar.java
+++ b/ChatGPTParsing/src/grammar/Grammar.java
@@ -48,4 +48,6 @@ public abstract class Grammar {
 		this.start = start;
 	}
 
+	public abstract String toJSON();
+
 }
diff --git a/ChatGPTParsing/src/grammar/Type2Grammar.java b/ChatGPTParsing/src/grammar/Type2Grammar.java
index bf89a4c..71c2524 100644
--- a/ChatGPTParsing/src/grammar/Type2Grammar.java
+++ b/ChatGPTParsing/src/grammar/Type2Grammar.java
@@ -1,14 +1,36 @@
 package grammar;
 
+import json.GrammarToJSON;
 import type2.Type2GrammarGenerator;
 
 public class Type2Grammar extends Grammar {
 
 	Type2GrammarGenerator g = new Type2GrammarGenerator();
 
-	public Type2Grammar(String[] vars, int alphaSize, String start, int maxConclusios, int maxConclusioSize) {
+	public Type2Grammar(String[] vars, int alphaSize, String start, int maxConclusios, int maxConclusioSize, int mode) {
 		super(vars, alphaSize, start);
+		switch (mode) {
+		case 0:
+			this.setRules(g.genType2GrammarRuleSet0(vars, alphaSize, maxConclusios, maxConclusioSize));
+			break;
+		case 1:
+			this.setRules(g.genType2GrammarRuleSet1(vars, alphaSize, maxConclusios, maxConclusioSize, start));
+			break;
+		case 2:
+			this.setRules(g.genType2GrammarRuleSet2(vars, alphaSize, maxConclusios, maxConclusioSize));
+			break;
+		case 3:
+			this.setRules(g.genType2GrammarRuleSet3(vars, alphaSize, maxConclusios, maxConclusioSize, start));
+			break;
+		default:
+			break;
+		}
 
 	}
 
+	@Override
+	public String toJSON() {
+		return GrammarToJSON.createJSONGrammar(this);
+	}
+
 }
diff --git a/ChatGPTParsing/src/grammar/Type3Grammar.java b/ChatGPTParsing/src/grammar/Type3Grammar.java
index 17ee994..072e957 100644
--- a/ChatGPTParsing/src/grammar/Type3Grammar.java
+++ b/ChatGPTParsing/src/grammar/Type3Grammar.java
@@ -1,5 +1,35 @@
 package grammar;
 
-public class Type3Grammar {
+import json.GrammarToJSON;
+import type3.Type3GrammarGenerator;
+
+public class Type3Grammar extends Grammar {
+
+	Type3GrammarGenerator g = new Type3GrammarGenerator();
+
+	public Type3Grammar(String[] vars, int alphaSize, String start, int maxConclusios, int mode) {
+		super(vars, alphaSize, start);
+		switch (mode) {
+		case 0:
+			this.setRules(g.genType3GrammarRuleSet0(vars, alphaSize, maxConclusios, start));
+			break;
+		case 1:
+			this.setRules(g.genType3GrammarRuleSet1(vars, alphaSize, maxConclusios, start));
+			break;
+		case 2:
+			this.setRules(g.genType3GrammarRuleSet2(vars, alphaSize, maxConclusios, start));
+			break;
+		case 3:
+			this.setRules(g.genType3GrammarRuleSet3(vars, alphaSize, maxConclusios, start));
+			break;
+		default:
+			break;
+		}
+	}
+
+	@Override
+	public String toJSON() {
+		return GrammarToJSON.createJSONGrammar(this);
+	}
 
 }
diff --git a/ChatGPTParsing/src/json/GrammarToJSON.java b/ChatGPTParsing/src/json/GrammarToJSON.java
index c82dd76..862e31e 100644
--- a/ChatGPTParsing/src/json/GrammarToJSON.java
+++ b/ChatGPTParsing/src/json/GrammarToJSON.java
@@ -1,32 +1,25 @@
 package json;
 
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 
-import type2.Type2GrammarGenerator;
-import type3.Type3GrammarGenerator;
+import grammar.Grammar;
 
 public class GrammarToJSON {
 
-	Type3GrammarGenerator gen3 = new Type3GrammarGenerator();
-	Type2GrammarGenerator gen2 = new Type2GrammarGenerator();
-
-	private String createJSONGrammar(String[] vars, int alphaSize, Map<String, List<List<String>>> rules,
-			String start) {
+	public static String createJSONGrammar(Grammar grammar) {
 		JSONObject grammarJSON = new JSONObject();
 		JSONArray varsJSON = new JSONArray();
-		for (String v : vars) {
+		for (String v : grammar.getVars()) {
 			varsJSON.add(new JSONString(v));
 		}
 		JSONArray termsJSON = new JSONArray();
-		for (int i = 97; i < 97 + alphaSize; i++) {
+		for (int i = 97; i < 97 + grammar.getAlphaSize(); i++) {
 			termsJSON.add(new JSONString(((char) i) + ""));
 		}
 		JSONArray rulesJSON = new JSONArray();
 		int ruleNo = 1;
-		for (Entry<String, List<List<String>>> rule : rules.entrySet()) {
+		for (Entry<String, List<List<String>>> rule : grammar.getRules().entrySet()) {
 			String premise = rule.getKey();
 			for (List<String> conclusio : rule.getValue()) {
 				JSONObject ruleJSON = new JSONObject();
@@ -43,65 +36,10 @@ public class GrammarToJSON {
 		grammarJSON.put("variables", varsJSON);
 		grammarJSON.put("terminals", termsJSON);
 		grammarJSON.put("rules", rulesJSON);
-		grammarJSON.put("start", new JSONString(start));
+		grammarJSON.put("start", new JSONString(grammar.getStart()));
 		return grammarJSON.toString();
 	}
 
-	public String createJSONGrammars(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize,
-			String start, int type, int mode, int n) {
-		if (type == 3) {
-			return createJSONObjectType3(vars, alphaSize, maxConclusios, start, mode, n);
-		} else if (type == 2) {
-			return createJSONObjectType2(vars, alphaSize, maxConclusios, maxConclusioSize, start, mode, n);
-		} else {
-			throw new IllegalArgumentException("Argument 'type' has to either be 2 or 3.");
-		}
-	}
-
-	private String createJSONObjectType3(String[] vars, int alphaSize, int maxConclusios, String start, int mode,
-			int n) {
-		Map<String, List<List<String>>> ruleSet = new LinkedHashMap<>();
-		switch (mode) {
-		case 0:
-			ruleSet = gen3.genType3GrammarRuleSet0(vars, alphaSize, maxConclusios, start);
-			break;
-		case 1:
-			ruleSet = gen3.genType3GrammarRuleSet1(vars, alphaSize, maxConclusios, start);
-			break;
-		case 2:
-			ruleSet = gen3.genType3GrammarRuleSet2(vars, alphaSize, maxConclusios, start);
-			break;
-		case 3:
-			ruleSet = gen3.genType3GrammarRuleSet3(vars, alphaSize, maxConclusios, start);
-			break;
-		default:
-			break;
-		}
-		return createJSONGrammar(vars, alphaSize, ruleSet, start);
-	}
-
-	private String createJSONObjectType2(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize,
-			String start, int mode, int n) {
-		Map<String, List<List<String>>> ruleSet = new LinkedHashMap<>();
-		switch (mode) {
-		case 0:
-			ruleSet = gen2.genType2GrammarRuleSet0(vars, alphaSize, maxConclusios, maxConclusioSize);
-			break;
-		case 1:
-			ruleSet = gen2.genType2GrammarRuleSet1(vars, alphaSize, maxConclusios, maxConclusioSize, start);
-			break;
-		case 2:
-			ruleSet = gen2.genType2GrammarRuleSet2(vars, alphaSize, maxConclusios, maxConclusioSize);
-			break;
-		case 3:
-			ruleSet = gen2.genType2GrammarRuleSet3(vars, alphaSize, maxConclusios, maxConclusioSize, start);
-			break;
-		default:
-			break;
-		}
-		return createJSONGrammar(vars, alphaSize, ruleSet, start);
-	}
-
 	public static void main(String[] args) {
 
 	}
diff --git a/ChatGPTParsing/src/type2/Type2Parser.java b/ChatGPTParsing/src/type2/Type2Parser.java
index f672047..19a4c42 100644
--- a/ChatGPTParsing/src/type2/Type2Parser.java
+++ b/ChatGPTParsing/src/type2/Type2Parser.java
@@ -407,7 +407,7 @@ public class Type2Parser {
 	public boolean isPartOfLanguage(Map<String, List<List<String>>> rules, String word, String start) {
 		Map<String, List<List<String>>> cnf = createCNF(rules, start);
 		if (word.isEmpty()) {
-			return ListOfListContains.contains(cnf.get("S'"), new LinkedList<>());
+			return ListOfListContains.contains(cnf.get(cnf.keySet().contains("S'") ? "S'" : start), new LinkedList<>());
 		}
 		return cyk(cnf, word, cnf.keySet().contains("S'") ? "S'" : start);
 	}
@@ -432,7 +432,7 @@ public class Type2Parser {
 		rules.put("E", e);
 		List<List<String>> f = List.of(List.of("B", "D", "c"), List.of("a", "F"), List.of("B", "C", "D"));
 		rules.put("F", f);
-		System.out.println(parser2.createCNF(rules, "S"));
+		System.out.println(parser2.isPartOfLanguage(rules, "abb", "S"));
 	}
 
 }
diff --git a/ChatGPTParsing/src/writer/.gitignore b/ChatGPTParsing/src/writer/.gitignore
index e90b7dd..dafeb80 100644
--- a/ChatGPTParsing/src/writer/.gitignore
+++ b/ChatGPTParsing/src/writer/.gitignore
@@ -1 +1,2 @@
-/json.tmp
\ No newline at end of file
+/json.tmp
+/results.tmp
\ No newline at end of file
diff --git a/ChatGPTParsing/src/writer/Writer.java b/ChatGPTParsing/src/writer/Writer.java
index c45747c..9172df3 100644
--- a/ChatGPTParsing/src/writer/Writer.java
+++ b/ChatGPTParsing/src/writer/Writer.java
@@ -8,7 +8,10 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
-import json.GrammarToJSON;
+import grammar.Grammar;
+import grammar.Type2Grammar;
+import type2.Type2Parser;
+import type3.Type3Parser;
 import word_generator.WordGenerator;
 
 public class Writer {
@@ -16,31 +19,11 @@ public class Writer {
 	private static final int DISTINCT_WORDS = 5;
 	private static final int MAX_LENGTH = 5;
 
-	GrammarToJSON jg = new GrammarToJSON();
 	WordGenerator wg = new WordGenerator();
+	Type2Parser t2p = new Type2Parser();
+	Type3Parser t3p = new Type3Parser();
 
-	private List<String> createGrammarWordPairs(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize,
-			String start, int type, int mode, int n) {
-		List<String> grammarWordPairs = new LinkedList<>();
-		List<String> jsonGrammars = jg.createJSONGrammars(vars, alphaSize, maxConclusios, maxConclusioSize, start, type,
-				mode, n);
-		for (String jsonGrammar : jsonGrammars) {
-			Set<String> distinctWords = new HashSet<>();
-			int i = 0;
-			while (i < DISTINCT_WORDS) {
-				String word = wg.wordGenerator(MAX_LENGTH, alphaSize);
-				if (!distinctWords.contains(word)) {
-					distinctWords.add(word);
-					String grammarWordPair = createGrammarWordPair(jsonGrammar, word);
-					grammarWordPairs.add(grammarWordPair);
-					i++;
-				}
-			}
-		}
-		return grammarWordPairs;
-	}
-
-	private String createGrammarWordPair(String jsonGrammar, String word) {
+	private String createJSONGrammarWordPair(String jsonGrammar, String word) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("\"grammar\":");
 		sb.append(jsonGrammar);
@@ -56,7 +39,7 @@ public class Writer {
 				bw.write(json);
 				bw.newLine();
 				bw.newLine();
-				if (i != 0 && i % DISTINCT_WORDS == 0) {
+				if (i % DISTINCT_WORDS == 0) {
 					bw.newLine();
 				}
 				i++;
@@ -66,11 +49,48 @@ public class Writer {
 		}
 	}
 
-	public void writeJSONToFile(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize, String start,
-			int type, int mode, int n) {
-		List<String> grammarWordPairs = createGrammarWordPairs(vars, alphaSize, maxConclusios, maxConclusioSize, start,
-				type, mode, n);
-		writeJSONToFile(grammarWordPairs);
+	private void writeResultToFile(List<Grammar> grammars, List<String> words, int type) {
+		try (BufferedWriter bw = new BufferedWriter(new FileWriter("src/writer/results.tmp"))) {
+			int i = 0;
+			for (Grammar g : grammars) {
+				for (int j = 0; j < DISTINCT_WORDS; j++) {
+					if (type == 2) {
+						bw.write(t2p.isPartOfLanguage(g.getRules(), words.get(i++), g.getStart()) ? "true" : "false");
+					} else {
+						bw.write(t3p.isPartOfLanguage(g.getRules(), words.get(i++), g.getStart()) ? "true" : "false");
+					}
+					bw.newLine();
+				}
+				bw.newLine();
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void runType2Grammar(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize, String start,
+			int mode, int n) {
+		List<String> jsonGrammarWordPairs = new LinkedList<>();
+		List<Grammar> grammars = new LinkedList<>();
+		List<String> words = new LinkedList<>();
+		for (int i = 0; i < n; i++) {
+			Type2Grammar g = new Type2Grammar(vars, alphaSize, start, maxConclusioSize, maxConclusios, mode);
+			grammars.add(g);
+			Set<String> distinctWords = new HashSet<>();
+			int j = 0;
+			while (j < DISTINCT_WORDS) {
+				String word = wg.wordGenerator(MAX_LENGTH, alphaSize);
+				if (!distinctWords.contains(word)) {
+					distinctWords.add(word);
+					words.add(word);
+					jsonGrammarWordPairs.add(createJSONGrammarWordPair(g.toJSON(), word));
+
+					j++;
+				}
+			}
+		}
+		writeResultToFile(grammars, words, 2);
+		writeJSONToFile(jsonGrammarWordPairs);
 	}
 
 	public static void main(String[] args) {
@@ -78,12 +98,11 @@ public class Writer {
 		String[] vars = { "S", "A", "B" };
 		int alphaSize = 2;
 		int maxConclusios = 2;
-		int maxConclusioSize = -1;
+		int maxConclusioSize = 3;
 		String start = "S";
-		int type = 3;
 		int mode = 3;
 		int n = 3;
-		w.writeJSONToFile(vars, alphaSize, maxConclusios, maxConclusioSize, start, type, mode, n);
+		w.runType2Grammar(vars, alphaSize, maxConclusios, maxConclusioSize, start, mode, n);
 	}
 
 }
-- 
GitLab