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