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