diff --git a/src/com/imegumii/Automata.java b/src/com/imegumii/Automata.java index 165c90a..e07f71c 100644 --- a/src/com/imegumii/Automata.java +++ b/src/com/imegumii/Automata.java @@ -53,4 +53,14 @@ public class Automata { } + public void clearEindStates() + { + eindStates.clear(); + } + + public void clearBeginStates() + { + beginStates.clear(); + } + } diff --git a/src/com/imegumii/Main.java b/src/com/imegumii/Main.java index 885b7a6..f67e1c9 100644 --- a/src/com/imegumii/Main.java +++ b/src/com/imegumii/Main.java @@ -99,6 +99,23 @@ public class Main { } + + public static void Thompson() + { + RegExp expr1 = new RegExp("a"); + RegExp expr2 = new RegExp("b"); + RegExp expr3 = new RegExp("c"); + RegExp expr4 = new RegExp("d"); + + RegExp expr5 = expr1.ster(); + RegExp expr6 = expr3.plus(); + + RegExp expr7 = expr5.punt(expr6); + + NDFA test = ThompsonConverter.Convert(expr7); + test.printTransitions(); + } + public static void main(String[] args) { // System.out.println("Here my code be"); // com.imegumii.codevandocent.Automata t1 = TestAutomata.getExampleSlide8Lesson2(); @@ -112,7 +129,8 @@ public class Main { // Practicum1(); - Practicum2(); +// Practicum2(); + Thompson(); } } diff --git a/src/com/imegumii/ThompsonConverter.java b/src/com/imegumii/ThompsonConverter.java new file mode 100644 index 0000000..2d57530 --- /dev/null +++ b/src/com/imegumii/ThompsonConverter.java @@ -0,0 +1,150 @@ +package com.imegumii; + +/** + * Created by kenny on 17-5-2017. + */ +public class ThompsonConverter { + + private static int count = 0; + + public static NDFA Convert(RegExp regex) + { + Character [] characters = {'a', 'b'}; + NDFA generated = new NDFA(characters); + + ConvertStatement(regex, generated); + + return generated; + } + + private static void ConvertStatement(RegExp regex, NDFA automata) + { + switch(regex.operator) + { + case PLUS: + + //Links + ConvertStatement(regex.links, automata); + String endLink1 = (String) automata.eindStates.first(); + String beginLink1 = (String) automata.beginStates.first(); + + //Repeat and skip + automata.addTransition(new Transition(endLink1, Transition.EPSILON, beginLink1)); + + automata.clearEindStates(); + automata.clearBeginStates(); + + automata.defineAsStartState(endLink1); + automata.defineAsEndState(beginLink1); + + break; + case STER: + + //Links + ConvertStatement(regex.links, automata); + String endLink2 = (String) automata.eindStates.first(); + String beginLink2 = (String) automata.beginStates.first(); + + //New states + String start2 = getState(); + String end2 = getState(); + + //Repeat and skip + automata.addTransition(new Transition(start2, Transition.EPSILON, end2)); + automata.addTransition(new Transition(endLink2, Transition.EPSILON, beginLink2)); + automata.addTransition(new Transition(start2, Transition.EPSILON, beginLink2)); + automata.addTransition(new Transition(endLink2, Transition.EPSILON, end2)); + + automata.clearEindStates(); + automata.clearBeginStates(); + + automata.defineAsStartState(start2); + automata.defineAsEndState(end2); + + break; + case OF: + + //Links + ConvertStatement(regex.links, automata); + String topEnd = (String) automata.eindStates.first(); + String topBegin = (String) automata.beginStates.first(); + + //Rechts + ConvertStatement(regex.rechts, automata); + String bottomBegin = (String) automata.beginStates.first(); + String bottomEnd = (String) automata.eindStates.first(); + + //New states + String start3 = getState(); + String end3 = getState(); + + //Link both + automata.addTransition(new Transition(start3, Transition.EPSILON, topBegin)); + automata.addTransition(new Transition(start3, Transition.EPSILON, bottomBegin)); + automata.addTransition(new Transition(topEnd, Transition.EPSILON, end3)); + automata.addTransition(new Transition(bottomEnd, Transition.EPSILON, end3)); + + automata.clearEindStates(); + automata.clearBeginStates(); + + automata.defineAsStartState(start3); + automata.defineAsEndState(end3); + + + break; + case PUNT: + + //Links + ConvertStatement(regex.links, automata); + String endLink = (String) automata.eindStates.first(); + String newBeginLink = (String) automata.beginStates.first(); + + //Rechts + ConvertStatement(regex.rechts, automata); + String beginLink = (String) automata.beginStates.first(); + String newEndLink = (String) automata.eindStates.first(); + + //Link both + automata.addTransition(new Transition(endLink, Transition.EPSILON, beginLink)); + + automata.clearEindStates(); + automata.clearBeginStates(); + + automata.defineAsStartState(newBeginLink); + automata.defineAsEndState(newEndLink); + + break; + case EEN: + char[] s = regex.characters.toCharArray(); + + automata.clearBeginStates(); + automata.clearEindStates(); + + String prevState = getState(); + String newState = ""; + automata.defineAsStartState(prevState); + + for(char c : s) + { + newState = getState(); + Transition t = new Transition(prevState, c, newState); + prevState = newState; + automata.addTransition(t); + } + + automata.defineAsEndState(newState); + + break; + default: + System.out.println("Error #8.1"); + break; + } + } + + private static String getState() + { + count++; + return "q" + count; + } + +} diff --git a/src/com/imegumii/Transition.java b/src/com/imegumii/Transition.java index 9b5af88..0c457f3 100644 --- a/src/com/imegumii/Transition.java +++ b/src/com/imegumii/Transition.java @@ -5,6 +5,7 @@ package com.imegumii; */ public class Transition implements Comparable> { public static final char ENDCHAR = '$'; + public static final char EPSILON = 'ε'; public T vanState; public char symbol;