From c0efefa1a187aeb9b776d4d25df4a509b8d06435 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 28 Apr 2024 20:24:11 +0300 Subject: [PATCH] fixed folder structure + lab4 less hardcode, cleanup --- .idea/inspectionProfiles/Project_Default.xml | 6 ++ src/{ => Lab1}/FiniteAutomaton.java | 5 +- src/{ => Lab1}/Grammar.java | 16 +--- src/{ => Lab2}/ChomskyChecker.java | 2 + src/{ => Lab2}/ManualFiniteAutomaton.java | 8 +- src/{ => Lab3}/Lexer.java | 4 +- src/{ => Lab4}/RegexGenerator.java | 89 ++++++++++--------- .../BinaryOperatorExpr.java | 2 +- src/{ast_parser => Lab6}/Expr.java | 2 +- src/{ast_parser => Lab6}/FunctionExpr.java | 2 +- src/{ast_parser => Lab6}/Lexer.java | 2 +- src/{ast_parser => Lab6}/MainParser.java | 2 +- src/{ast_parser => Lab6}/NumberExpr.java | 2 +- src/{ast_parser => Lab6}/Parser.java | 2 +- src/{ast_parser => Lab6}/Token.java | 2 +- src/{ast_parser => Lab6}/TokenType.java | 2 +- src/Main.java | 11 ++- 17 files changed, 86 insertions(+), 73 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml rename src/{ => Lab1}/FiniteAutomaton.java (86%) rename src/{ => Lab1}/Grammar.java (82%) rename src/{ => Lab2}/ChomskyChecker.java (98%) rename src/{ => Lab2}/ManualFiniteAutomaton.java (96%) rename src/{ => Lab3}/Lexer.java (98%) rename src/{ => Lab4}/RegexGenerator.java (61%) rename src/{ast_parser => Lab6}/BinaryOperatorExpr.java (97%) rename src/{ast_parser => Lab6}/Expr.java (74%) rename src/{ast_parser => Lab6}/FunctionExpr.java (98%) rename src/{ast_parser => Lab6}/Lexer.java (98%) rename src/{ast_parser => Lab6}/MainParser.java (96%) rename src/{ast_parser => Lab6}/NumberExpr.java (90%) rename src/{ast_parser => Lab6}/Parser.java (99%) rename src/{ast_parser => Lab6}/Token.java (93%) rename src/{ast_parser => Lab6}/TokenType.java (84%) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..8a7fe54 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/FiniteAutomaton.java b/src/Lab1/FiniteAutomaton.java similarity index 86% rename from src/FiniteAutomaton.java rename to src/Lab1/FiniteAutomaton.java index cb56dda..083da14 100644 --- a/src/FiniteAutomaton.java +++ b/src/Lab1/FiniteAutomaton.java @@ -1,4 +1,5 @@ -import java.util.HashMap; +package Lab1; + import java.util.Map; import java.util.Set; @@ -6,7 +7,7 @@ public class FiniteAutomaton { private final String SS; private final Set alphabet; private final Map> T; - public FiniteAutomaton(String SS, Set VN, Set VT, Map> T) { + public FiniteAutomaton(String SS, Set VT, Map> T) { this.SS = SS; this.alphabet = VT; this.T = T; diff --git a/src/Grammar.java b/src/Lab1/Grammar.java similarity index 82% rename from src/Grammar.java rename to src/Lab1/Grammar.java index ef34d1f..94b060c 100644 --- a/src/Grammar.java +++ b/src/Lab1/Grammar.java @@ -1,18 +1,14 @@ +package Lab1; + import java.util.*; public class Grammar { private final String SS; - private final Set VN; - private final Set VT; - private final Map> P; private final FiniteAutomaton FA; - public Grammar(String SS, Set VN, Set VT, Map> P) { + public Grammar(String SS, Set VT, Map> P) { this.SS = SS; - this.VN = VN; - this.VT = VT; - this.P = P; - this.FA = new FiniteAutomaton(SS, VN, VT, generateTransitions(P)); + this.FA = new FiniteAutomaton(SS, VT, generateTransitions(P)); } public Map> generateTransitions(Map> P) { @@ -31,10 +27,6 @@ public class Grammar { return transitions; } - public FiniteAutomaton getFA() { - return this.FA; - } - public boolean isValid(String word) { return this.FA.isValid(word); } diff --git a/src/ChomskyChecker.java b/src/Lab2/ChomskyChecker.java similarity index 98% rename from src/ChomskyChecker.java rename to src/Lab2/ChomskyChecker.java index 65c44cc..e91400f 100644 --- a/src/ChomskyChecker.java +++ b/src/Lab2/ChomskyChecker.java @@ -1,3 +1,5 @@ +package Lab2; + import java.util.List; import java.util.Map; diff --git a/src/ManualFiniteAutomaton.java b/src/Lab2/ManualFiniteAutomaton.java similarity index 96% rename from src/ManualFiniteAutomaton.java rename to src/Lab2/ManualFiniteAutomaton.java index 8970c94..1e4f179 100644 --- a/src/ManualFiniteAutomaton.java +++ b/src/Lab2/ManualFiniteAutomaton.java @@ -1,3 +1,5 @@ +package Lab2; + import util.Pair; import java.util.*; @@ -5,13 +7,11 @@ public class ManualFiniteAutomaton { private final List stateList; private final Set alphabet; - private final Set acceptingStates; private final Map> T; - public ManualFiniteAutomaton(List stateList, Set alphabet, Set acceptingStates, Map> T) { + public ManualFiniteAutomaton(List stateList, Set alphabet, Map> T) { this.stateList = stateList; this.alphabet = alphabet; - this.acceptingStates = acceptingStates; this.T = T; } @@ -86,7 +86,7 @@ public class ManualFiniteAutomaton { } } - // Method to convert the NFA to Grammar + // Method to convert the NFA to Lab1.Grammar public void toGrammar() { Map mappedStates = mapStates(); // Map original states to single-character states Map> grammar = new HashMap<>(); // Create a map to store the grammar rules diff --git a/src/Lexer.java b/src/Lab3/Lexer.java similarity index 98% rename from src/Lexer.java rename to src/Lab3/Lexer.java index cb0f4ba..8dc8c63 100644 --- a/src/Lexer.java +++ b/src/Lab3/Lexer.java @@ -1,3 +1,5 @@ +package Lab3; + import java.util.ArrayList; import java.util.List; import java.util.Stack; @@ -89,7 +91,7 @@ public class Lexer { } public static void main(String[] args) { - String input = "(3 + 5) * sqrt(16)"; + String input = "(3 + 5) * loge(16)"; try { List tokens = tokenize(input); for (Token token : tokens) { diff --git a/src/RegexGenerator.java b/src/Lab4/RegexGenerator.java similarity index 61% rename from src/RegexGenerator.java rename to src/Lab4/RegexGenerator.java index ce47406..82f032d 100644 --- a/src/RegexGenerator.java +++ b/src/Lab4/RegexGenerator.java @@ -1,3 +1,5 @@ +package Lab4; + import java.util.Random; public class RegexGenerator { @@ -6,31 +8,22 @@ public class RegexGenerator { String[] randomStrings = new String[numStrings]; Random random = new Random(); - System.out.println("========================="); - for (int i = 0; i < numStrings; i++) { - System.out.println("String Nr. " + (i+1)); StringBuilder sb = new StringBuilder(); sb.append("O"); - System.out.println("Putting a fixed 'O'"); int length = random.nextInt(1,5); for (int j = 0; j < length; j++) { char randomChar = randomChar("PQR"); sb.append(randomChar); - System.out.println("Putting a random char from \"PQR\": " + randomChar); } sb.append("2"); - System.out.println("Putting a fixed '2'"); - char randomDigit = randomChar("34"); sb.append(randomDigit); - System.out.println("Putting a random digit from \"34\": " + randomDigit); randomStrings[i] = sb.toString(); - System.out.println("========================="); } return randomStrings; @@ -40,38 +33,27 @@ public class RegexGenerator { String[] randomStrings = new String[numStrings]; Random random = new Random(); - System.out.println("========================="); - for (int i = 0; i < numStrings; i++) { - System.out.println("String Nr. " + (i+1)); StringBuilder sb = new StringBuilder(); int length1 = random.nextInt(6); for (int j = 0; j < length1; j++) { char randomChar = randomChar("A"); sb.append(randomChar); - System.out.println("Putting a random char from \"A\": " + randomChar); } sb.append("B"); - System.out.println("Putting a fixed 'B'"); char randomChar = randomChar("CDE"); sb.append(randomChar); - System.out.println("Putting a random char from \"CDE\": " + randomChar); sb.append("F"); - System.out.println("Putting a fixed 'F'"); char chr = randomChar("GHI"); sb.append(chr); - System.out.println("Putting a random char from \"GHI\": " + chr); - sb.append(chr); - System.out.println("Repeating the previous random char: " + chr); randomStrings[i] = sb.toString(); - System.out.println("========================="); } return randomStrings; @@ -81,43 +63,28 @@ public class RegexGenerator { String[] randomStrings = new String[numStrings]; Random random = new Random(); - System.out.println("========================="); - for (int i = 0; i < numStrings; i++) { - System.out.println("String Nr. " + (i+1)); StringBuilder sb = new StringBuilder(); int length1 = random.nextInt(1,6); - for (int j = 0; j < length1; j++) { - sb.append("J"); - System.out.println("Putting a fixed 'J'"); - } + sb.append("J".repeat(Math.max(0, length1))); sb.append("K"); - System.out.println("Putting a fixed 'K'"); length1 = random.nextInt(6); for (int j = 0; j < length1; j++) { char randomChar = randomChar("LMN"); sb.append(randomChar); - System.out.println("Putting a random char from \"LMN\": " + randomChar); } length1 = random.nextInt(2); - for (int j = 0; j < length1; j++) { - sb.append("O"); - System.out.println("Putting a fixed 'O'"); - } + sb.append("O".repeat(length1)); length1 = 3; char chr = randomChar("PQ"); - for (int j = 0; j < length1; j++) { - sb.append(chr); - System.out.println("Putting a random char from \"PQ\": " + chr); - } + sb.append(String.valueOf(chr).repeat(length1)); randomStrings[i] = sb.toString(); - System.out.println("========================="); } return randomStrings; @@ -133,22 +100,62 @@ public class RegexGenerator { String[] randomStrings1 = generateRandomNr1(5); System.out.println("All Strings Nr1: "); for (String str : randomStrings1) { - System.out.println(str); + explainRandomNr1(str); } System.out.println("========================="); String[] randomStrings2 = generateRandomNr2(5); System.out.println("All Strings Nr2: "); for (String str : randomStrings2) { - System.out.println(str); + explainRandomNr2(str); } System.out.println("========================="); String[] randomStrings3 = generateRandomNr3(5); System.out.println("All Strings Nr3: "); for (String str : randomStrings3) { - System.out.println(str); + explainRandomNr3(str); } System.out.println("========================="); } + + public static void explainRandomNr1(String s) { + System.out.println("Input: " + s); + System.out.println("O -> O"); + int mid = s.indexOf('2'); + System.out.println("(P|Q|R)+ -> " + s.substring(1, mid)); + System.out.println("2 -> 2"); + System.out.println("(3|4) -> " + s.charAt(s.length() - 1)); + } + + public static void explainRandomNr2(String s) { + System.out.println("Input: " + s); + int idx = 0; + while (s.charAt(idx) == 'A') { + idx++; + } + System.out.println("A* -> " + (idx > 0 ? s.substring(0, idx) : "'' (no A's)")); + System.out.println("B -> B"); + char cde = s.charAt(idx + 1); + System.out.println("(C|D|E) -> " + cde); + System.out.println("F -> F"); + System.out.println("(G|H|I)^2 -> " + s.substring(idx + 3)); + } + + public static void explainRandomNr3(String s) { + System.out.println("Input: " + s); + int idx = s.indexOf('K'); + System.out.println("J+ -> " + s.substring(0, idx)); + System.out.println("K -> K"); + int nextPart = idx + 1; + while (nextPart < s.length() && "LMN".contains(s.charAt(nextPart) + "")) { + nextPart++; + } + System.out.println("(L|M|N)* -> " + (nextPart > idx + 1 ? s.substring(idx + 1, nextPart) : "'' (no L, M, N)")); + if (nextPart < s.length() && s.charAt(nextPart) == 'O') { + System.out.println("O? -> O"); + nextPart++; + } + System.out.println("(P|Q)^3 -> " + s.substring(nextPart)); + } } diff --git a/src/ast_parser/BinaryOperatorExpr.java b/src/Lab6/BinaryOperatorExpr.java similarity index 97% rename from src/ast_parser/BinaryOperatorExpr.java rename to src/Lab6/BinaryOperatorExpr.java index ce75ae8..023eaa4 100644 --- a/src/ast_parser/BinaryOperatorExpr.java +++ b/src/Lab6/BinaryOperatorExpr.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; class BinaryOperatorExpr extends Expr { Expr left; diff --git a/src/ast_parser/Expr.java b/src/Lab6/Expr.java similarity index 74% rename from src/ast_parser/Expr.java rename to src/Lab6/Expr.java index d69a6ba..1e00455 100644 --- a/src/ast_parser/Expr.java +++ b/src/Lab6/Expr.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; abstract class Expr { abstract double evaluate(); diff --git a/src/ast_parser/FunctionExpr.java b/src/Lab6/FunctionExpr.java similarity index 98% rename from src/ast_parser/FunctionExpr.java rename to src/Lab6/FunctionExpr.java index f221a34..d472bf1 100644 --- a/src/ast_parser/FunctionExpr.java +++ b/src/Lab6/FunctionExpr.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; import java.util.List; diff --git a/src/ast_parser/Lexer.java b/src/Lab6/Lexer.java similarity index 98% rename from src/ast_parser/Lexer.java rename to src/Lab6/Lexer.java index 84519ab..304934b 100644 --- a/src/ast_parser/Lexer.java +++ b/src/Lab6/Lexer.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; import java.util.ArrayList; import java.util.List; diff --git a/src/ast_parser/MainParser.java b/src/Lab6/MainParser.java similarity index 96% rename from src/ast_parser/MainParser.java rename to src/Lab6/MainParser.java index 2ea4f28..001f488 100644 --- a/src/ast_parser/MainParser.java +++ b/src/Lab6/MainParser.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; import java.util.List; diff --git a/src/ast_parser/NumberExpr.java b/src/Lab6/NumberExpr.java similarity index 90% rename from src/ast_parser/NumberExpr.java rename to src/Lab6/NumberExpr.java index 28bb7fa..7372246 100644 --- a/src/ast_parser/NumberExpr.java +++ b/src/Lab6/NumberExpr.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; class NumberExpr extends Expr { double value; diff --git a/src/ast_parser/Parser.java b/src/Lab6/Parser.java similarity index 99% rename from src/ast_parser/Parser.java rename to src/Lab6/Parser.java index 6831f5f..f58b07a 100644 --- a/src/ast_parser/Parser.java +++ b/src/Lab6/Parser.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; import java.util.ArrayList; import java.util.List; diff --git a/src/ast_parser/Token.java b/src/Lab6/Token.java similarity index 93% rename from src/ast_parser/Token.java rename to src/Lab6/Token.java index 89faaad..d8452d7 100644 --- a/src/ast_parser/Token.java +++ b/src/Lab6/Token.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; public class Token { public TokenType type; diff --git a/src/ast_parser/TokenType.java b/src/Lab6/TokenType.java similarity index 84% rename from src/ast_parser/TokenType.java rename to src/Lab6/TokenType.java index fdb715b..7c66a82 100644 --- a/src/ast_parser/TokenType.java +++ b/src/Lab6/TokenType.java @@ -1,4 +1,4 @@ -package ast_parser; +package Lab6; public enum TokenType { NUMBER, diff --git a/src/Main.java b/src/Main.java index 7204ef7..a5c8786 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,3 +1,6 @@ +import Lab1.Grammar; +import Lab2.ChomskyChecker; +import Lab2.ManualFiniteAutomaton; import util.Pair; import java.util.Arrays; @@ -9,7 +12,7 @@ public class Main { // LAB 1 public static final String SS = "S"; - public static final Set VN = Set.of("S", "B", "C"); + //public static final Set VN = Set.of("S", "B", "C"); public static final Set VT = Set.of("a", "b", "c"); public static final Map> P = Map.of( "S", List.of("aB"), @@ -19,7 +22,7 @@ public class Main { // LAB 2 public static final List stateList = Arrays.asList("q0", "q1", "q2"); public static final Set alphabet = Set.of("a", "b"); - public static final Set acceptingStates = Set.of("q2"); + //public static final Set acceptingStates = Set.of("q2"); public static final Map> transitions= Map.of( "q0", List.of(new Pair("a", "q0"), new Pair("a", "q1")), "q1", List.of(new Pair("b", "q2"), new Pair("a", "q0")), @@ -29,14 +32,14 @@ public class Main { public static void main(String[] args) { String toCheck = "aac"; - Grammar grammar = new Grammar(SS, VN, VT, P); + Grammar grammar = new Grammar(SS, VT, P); grammar.generateWords(5); System.out.println("==================================="); System.out.println("Is " + toCheck + " valid? " + grammar.isValid(toCheck)); System.out.println("==================================="); System.out.println(ChomskyChecker.classifyGrammar(P)); - ManualFiniteAutomaton MFA = new ManualFiniteAutomaton(stateList, alphabet, acceptingStates, transitions); + ManualFiniteAutomaton MFA = new ManualFiniteAutomaton(stateList, alphabet, transitions); System.out.println("==================================="); MFA.toGrammar(); System.out.println("===================================");