diff --git a/ChatGPTParsing/.gitignore b/ChatGPTParsing/.gitignore
index d08d94f4e44f0a670046190d2ca2e0f67014e504..c27b429fd39ebd4e298d43ad7de6907743e209cc 100644
--- a/ChatGPTParsing/.gitignore
+++ b/ChatGPTParsing/.gitignore
@@ -1,2 +1,2 @@
 /bin/
-.classpath
\ No newline at end of file
+/.classpath
\ No newline at end of file
diff --git a/ChatGPTParsing/src/auxiliary/ListofListContains.java b/ChatGPTParsing/src/auxiliary/ListOfListContains.java
similarity index 87%
rename from ChatGPTParsing/src/auxiliary/ListofListContains.java
rename to ChatGPTParsing/src/auxiliary/ListOfListContains.java
index 35c0b89628716abb6ea5e50a1836b6657edbdc0a..0de5e569e4bfd030e9fb00d8487df6de8ba0d8b2 100644
--- a/ChatGPTParsing/src/auxiliary/ListofListContains.java
+++ b/ChatGPTParsing/src/auxiliary/ListOfListContains.java
@@ -2,7 +2,7 @@ package auxiliary;
 
 import java.util.List;
 
-public class ListofListContains {
+public class ListOfListContains {
 
 	public static boolean contains(List<List<String>> container, List<String> contained) {
 		for (List<String> c : container) {
diff --git a/ChatGPTParsing/src/auxiliary/ListOfRulesContains.java b/ChatGPTParsing/src/auxiliary/ListOfRulesContains.java
new file mode 100644
index 0000000000000000000000000000000000000000..16922acdb579f34a7580570a0079f3a0c4429192
--- /dev/null
+++ b/ChatGPTParsing/src/auxiliary/ListOfRulesContains.java
@@ -0,0 +1,13 @@
+package auxiliary;
+
+import java.util.List;
+import java.util.Map;
+
+public class ListOfRulesContains {
+
+	public static boolean contains(List<Map<String, List<List<String>>>> container,
+			Map<String, List<List<String>>> contained) {
+		return false;
+	}
+
+}
diff --git a/ChatGPTParsing/src/json/GrammarToJSON.java b/ChatGPTParsing/src/json/GrammarToJSON.java
index 0561a6158bf4f92537c8565dffc089c8d1143824..ec7ffb5ae246fd2a43f84787d41660ffcbf8e1a5 100644
--- a/ChatGPTParsing/src/json/GrammarToJSON.java
+++ b/ChatGPTParsing/src/json/GrammarToJSON.java
@@ -11,6 +11,7 @@ import type3.Type3GrammarGenerator;
 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) {
@@ -46,8 +47,8 @@ public class GrammarToJSON {
 		return grammarJSON.toString();
 	}
 
-	public String createJSONObject(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize, String start,
-			int type, int mode, int n) {
+	public List<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) {
@@ -57,28 +58,60 @@ public class GrammarToJSON {
 		}
 	}
 
-	private String createJSONObjectType3(String[] vars, int alphaSize, int maxConclusios, String start, int mode,
+	private List<String> createJSONObjectType3(String[] vars, int alphaSize, int maxConclusios, String start, int mode,
 			int n) {
-		List<Map<String, List<List<String>>>> grammarRuleSets = new LinkedList<>();
+		List<Map<String, List<List<String>>>> ruleSets = new LinkedList<>();
 		switch (mode) {
 		case 0:
-			grammarRuleSets = gen3.genType3GrammarRuleSets0(vars, alphaSize, maxConclusios, start, n);
+			ruleSets = gen3.genType3GrammarRuleSets0(vars, alphaSize, maxConclusios, start, n);
+			break;
+		case 1:
+			ruleSets = gen3.genType3GrammarRuleSets1(vars, alphaSize, maxConclusios, start, n);
+			break;
+		case 2:
+			ruleSets = gen3.genType3GrammarRuleSets2(vars, alphaSize, maxConclusios, start, n);
+			break;
+		case 3:
+			ruleSets = gen3.genType3GrammarRuleSets3(vars, alphaSize, maxConclusios, start, n);
+			break;
+		default:
+			break;
 		}
-
-		return null;
+		List<String> jsonGrammars = new LinkedList<>();
+		for (Map<String, List<List<String>>> ruleSet : ruleSets) {
+			jsonGrammars.add(createJSONGrammar(vars, alphaSize, ruleSet, start));
+		}
+		return jsonGrammars;
 	}
 
-	private String createJSONObjectType2(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize,
+	private List<String> createJSONObjectType2(String[] vars, int alphaSize, int maxConclusios, int maxConclusioSize,
 			String start, int mode, int n) {
-		// TODO Auto-generated method stub
-		return null;
+		List<Map<String, List<List<String>>>> ruleSets = new LinkedList<>();
+		switch (mode) {
+		case 0:
+			ruleSets = gen2.genType2GrammarRuleSets0(vars, alphaSize, maxConclusios, maxConclusioSize, n);
+			break;
+		case 1:
+			ruleSets = gen2.genType2GrammarRuleSets1(vars, alphaSize, maxConclusios, maxConclusioSize, start, n);
+			break;
+		case 2:
+			ruleSets = gen2.genType2GrammarRuleSets2(vars, alphaSize, maxConclusios, maxConclusioSize, n);
+			break;
+		case 3:
+			ruleSets = gen2.genType2GrammarRuleSets3(vars, alphaSize, maxConclusios, maxConclusioSize, start, n);
+			break;
+		default:
+			break;
+		}
+		List<String> jsonGrammars = new LinkedList<>();
+		for (Map<String, List<List<String>>> ruleSet : ruleSets) {
+			jsonGrammars.add(createJSONGrammar(vars, alphaSize, ruleSet, start));
+		}
+		return jsonGrammars;
 	}
 
 	public static void main(String[] args) {
-		Type2GrammarGenerator g = new Type2GrammarGenerator();
-		String[] vars = { "S", "A" };
-		Map<String, List<List<String>>> rules = g.genType2GrammarRuleSet(vars, 2, 2, 2);
-		System.out.println(rules);
+
 	}
 
 }
diff --git a/ChatGPTParsing/src/type2/Type2GrammarGenerator.java b/ChatGPTParsing/src/type2/Type2GrammarGenerator.java
index 0c7a145b0ebfe383d5428efb597c9526aec3dd9b..0917986a7224dc76cd469810f5d9d85cdd095a26 100644
--- a/ChatGPTParsing/src/type2/Type2GrammarGenerator.java
+++ b/ChatGPTParsing/src/type2/Type2GrammarGenerator.java
@@ -8,7 +8,7 @@ import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 
-import auxiliary.ListofListContains;
+import auxiliary.ListOfListContains;
 import co_reachable.CoReachability;
 import reachable.Reachability;
 
@@ -16,7 +16,7 @@ public class Type2GrammarGenerator {
 
 	Random random = new Random();
 
-	public Map<String, List<List<String>>> genType2GrammarRuleSet(String[] vars, int alphaSize, int maxConclusios,
+	private Map<String, List<List<String>>> genType2GrammarRuleSet(String[] vars, int alphaSize, int maxConclusios,
 			int maxConclusioSize) {
 		Map<String, List<List<String>>> rules = new LinkedHashMap<>();
 		for (String v : vars) {
@@ -31,7 +31,7 @@ public class Type2GrammarGenerator {
 		int numOfConclusios = random.nextInt(maxConclusios) + 1;
 		while (conclusios.size() < numOfConclusios) {
 			List<String> conclusio = genConclusio(alphaSize, vars, maxConclusioSize);
-			if (!ListofListContains.contains(conclusios, conclusio)) {
+			if (!ListOfListContains.contains(conclusios, conclusio)) {
 				conclusios.add(conclusio);
 			}
 		}
@@ -65,7 +65,7 @@ public class Type2GrammarGenerator {
 		return s;
 	}
 
-	public List<Map<String, List<List<String>>>> genType2GrammarRuleSets(String[] vars, int alphaSize,
+	public List<Map<String, List<List<String>>>> genType2GrammarRuleSets0(String[] vars, int alphaSize,
 			int maxConclusios, int maxConclusioSize, int n) {
 		List<Map<String, List<List<String>>>> grammarRuleSets = new LinkedList<>();
 		while (grammarRuleSets.size() < n) {
diff --git a/ChatGPTParsing/src/type2/Type2Parser.java b/ChatGPTParsing/src/type2/Type2Parser.java
index 56b99f26c2c167c78ab7bc99ff16b82533a60dbf..f672047159596f7bfc8c6ecdc5b5d9eead8428ad 100644
--- a/ChatGPTParsing/src/type2/Type2Parser.java
+++ b/ChatGPTParsing/src/type2/Type2Parser.java
@@ -9,7 +9,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
-import auxiliary.ListofListContains;
+import auxiliary.ListOfListContains;
 import co_reachable.CoReachability;
 import reachable.Reachability;
 
@@ -137,7 +137,7 @@ public class Type2Parser {
 			for (List<String> oldConclusio : rule.getValue()) {
 				List<List<String>> newCons = removeNullable(oldConclusio, nullable);
 				for (List<String> newCon : newCons) {
-					if ((!newCon.isEmpty() && !ListofListContains.contains(newConclusios, newCon))) {
+					if ((!newCon.isEmpty() && !ListOfListContains.contains(newConclusios, newCon))) {
 						newConclusios.add(newCon);
 					}
 				}
@@ -243,7 +243,7 @@ public class Type2Parser {
 			List<List<String>> newConclusios = new LinkedList<>();
 			for (String s : chainProdMap.get(premise)) {
 				for (List<String> newConclusio : chainRulesDeleted.get(s)) {
-					if (!ListofListContains.contains(newConclusios, newConclusio)) {
+					if (!ListOfListContains.contains(newConclusios, newConclusio)) {
 						newConclusios.add(newConclusio);
 					}
 				}
@@ -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("S'"), new LinkedList<>());
 		}
 		return cyk(cnf, word, cnf.keySet().contains("S'") ? "S'" : start);
 	}
diff --git a/ChatGPTParsing/src/type3/Type3GrammarGenerator.java b/ChatGPTParsing/src/type3/Type3GrammarGenerator.java
index 4072002326070459aa626651f5ba028e02264bbf..5dff47d16d346a0bb766ed8f31202399020113b1 100644
--- a/ChatGPTParsing/src/type3/Type3GrammarGenerator.java
+++ b/ChatGPTParsing/src/type3/Type3GrammarGenerator.java
@@ -8,7 +8,7 @@ import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 
-import auxiliary.ListofListContains;
+import auxiliary.ListOfListContains;
 import co_reachable.CoReachability;
 import reachable.Reachability;
 
@@ -16,7 +16,7 @@ public class Type3GrammarGenerator {
 
 	Random random = new Random();
 
-	public Map<String, List<List<String>>> genType3GrammarRuleSet(String[] vars, int alphaSize, int maxConclusios,
+	private Map<String, List<List<String>>> genType3GrammarRuleSet(String[] vars, int alphaSize, int maxConclusios,
 			String s) {
 		Map<String, List<List<String>>> rules = new LinkedHashMap<>();
 		List<List<String>> conclusios0 = genConclusios(alphaSize, vars, maxConclusios, true);
@@ -34,10 +34,10 @@ public class Type3GrammarGenerator {
 			conclusios.add(new LinkedList<>());
 		}
 		int numOfConclusios = random.nextInt(maxConclusios) + 1;
-		while (conclusios.size() < numOfConclusios || ListofListContains.contains(conclusios, new LinkedList<>())
+		while (conclusios.size() < numOfConclusios || ListOfListContains.contains(conclusios, new LinkedList<>())
 				&& conclusios.size() < numOfConclusios + 1) {
 			List<String> conclusio = genConclusio(alphaSize, vars);
-			if (!ListofListContains.contains(conclusios, conclusio)) {
+			if (!ListOfListContains.contains(conclusios, conclusio)) {
 				conclusios.add(conclusio);
 			}
 		}
diff --git a/ChatGPTParsing/src/type3/Type3Parser.java b/ChatGPTParsing/src/type3/Type3Parser.java
index 05a8cf9863ec21b7b4f21f0a808fd52f0d0127e3..aff9d6658540dcc59c1ae28f9a3ea70ca50c5ef5 100644
--- a/ChatGPTParsing/src/type3/Type3Parser.java
+++ b/ChatGPTParsing/src/type3/Type3Parser.java
@@ -6,14 +6,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import auxiliary.ListofListContains;
+import auxiliary.ListOfListContains;
 
 public class Type3Parser {
 
 	private FiniteStateMachine grammarToFSM(Map<String, List<List<String>>> rules, String start) {
 		Map<String, State> states = new HashMap<>();
 		for (Entry<String, List<List<String>>> entry : rules.entrySet()) {
-			if (entry.getKey().equals(start) && ListofListContains.contains(entry.getValue(), new LinkedList<>())) {
+			if (entry.getKey().equals(start) && ListOfListContains.contains(entry.getValue(), new LinkedList<>())) {
 				states.put(start, new State(start, true));
 			} else {
 				states.put(entry.getKey(), new State(entry.getKey()));
diff --git a/ChatGPTParsing/src/writer/.gitignore b/ChatGPTParsing/src/writer/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e90b7dd35834d0129fffd811ff56c117afcb41d8
--- /dev/null
+++ b/ChatGPTParsing/src/writer/.gitignore
@@ -0,0 +1 @@
+/json.tmp
\ No newline at end of file
diff --git a/ChatGPTParsing/src/writer/Writer.java b/ChatGPTParsing/src/writer/Writer.java
index 7d6d47a5eabc3bf8fd5e22086dda70f7bf5039ab..f4cee6a482add011eeb4a657ef80519c78d57dd0 100644
--- a/ChatGPTParsing/src/writer/Writer.java
+++ b/ChatGPTParsing/src/writer/Writer.java
@@ -3,20 +3,87 @@ package writer;
 import java.io.BufferedWriter;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import json.GrammarToJSON;
+import word_generator.WordGenerator;
 
 public class Writer {
 
-	public void writeToFile(String json) {
+	private static final int DISTINCT_WORDS = 5;
+	private static final int MAX_LENGTH = 5;
+
+	GrammarToJSON jg = new GrammarToJSON();
+	WordGenerator wg = new WordGenerator();
+
+	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) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("\"grammar\":");
+		sb.append(jsonGrammar);
+		sb.append(",\"word\":");
+		sb.append("\"" + word + "\"");
+		return sb.toString();
+	}
+
+	private void writeToFile(List<String> jsons) {
 		try (BufferedWriter bw = new BufferedWriter(new FileWriter("src/writer/json.tmp"))) {
-			bw.write(97);
+			int i = 1;
+			for (String json : jsons) {
+				bw.write(json);
+				bw.newLine();
+				bw.newLine();
+				if (i != 0 && i % DISTINCT_WORDS == 0) {
+					bw.newLine();
+				}
+				i++;
+			}
 		} catch (IOException e) {
-
+			e.printStackTrace();
 		}
 	}
 
+	public void writeToFile(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);
+		writeToFile(grammarWordPairs);
+	}
+
 	public static void main(String[] args) {
 		Writer w = new Writer();
-		w.writeToFile("");
+		String[] vars = { "S", "A", "B" };
+		int alphaSize = 2;
+		int maxConclusios = 2;
+		int maxConclusioSize = -1;
+		String start = "S";
+		int type = 3;
+		int mode = 3;
+		int n = 3;
+		w.writeToFile(vars, alphaSize, maxConclusios, maxConclusioSize, start, type, mode, n);
 	}
 
 }