diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 92aa074..980c243 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,10 +4,10 @@
-
-
+
+
@@ -60,6 +60,8 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -129,30 +163,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -167,10 +177,10 @@
+
+
-
-
@@ -258,7 +268,15 @@
1704819635241
-
+
+
+ 1704888180654
+
+
+
+ 1704888180655
+
+
@@ -282,21 +300,27 @@
-
+
+
file://$PROJECT_DIR$/src/main/java/ab1/impl/GRUPPE/NFAImpl.java
- 343
+ 344
file://$PROJECT_DIR$/src/main/java/ab1/impl/GRUPPE/NFAImpl.java
- 355
+ 356
+
+ file://$PROJECT_DIR$/src/test/java/ab1/tests/ComplexTests.java
+ 141
+
+
@@ -304,6 +328,7 @@
+
diff --git a/src/main/java/ab1/impl/GRUPPE/NFAImpl.java b/src/main/java/ab1/impl/GRUPPE/NFAImpl.java
index 8b26e77..34f8062 100644
--- a/src/main/java/ab1/impl/GRUPPE/NFAImpl.java
+++ b/src/main/java/ab1/impl/GRUPPE/NFAImpl.java
@@ -5,6 +5,7 @@ import ab1.NFA;
import ab1.Transition;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
public class NFAImpl implements NFA {
private final Set states;
@@ -385,49 +386,61 @@ public class NFAImpl implements NFA {
List path = new ArrayList<>();
List transitions= new ArrayList<>(this.getTransitions());
- //int finished = 0; //0=unfinished, 1=finite, 2 = infinite
+ AtomicInteger finished = new AtomicInteger(0); //0=unfinished, 1=finite, 2 = infinite
List letters = new ArrayList<>(this.alphabet); // letters is alphabet with epsilon (null)
- if(!letters.contains(null)) {
- letters.add(null);
- }
if(this.alphabet.isEmpty()){
return true;
}
- // EndTuple hast firstElement = a
- path.add(new Tuple('a', this.initialState, true));
- if(fillToEnd(path, transitions, letters)){
- return true;
+ if(!letters.contains(null)) {
+ letters.add(null);
}
-
-
-
-
- return continueOnLastTuple(path, transitions, letters);
+ // EndTuple hast firstElement = a //doesn´t matter at all aktually
+ path.add(new Tuple('a', this.initialState));
+ if(fillToEnd(path, transitions, letters, finished)){
+ return false;
+ }
+ while(finished.intValue()==0){
+ continueOnLastTuple(path, transitions, letters, finished);
+ }
+ if (finished.intValue() == 1) {
+ return true;
+ } else if (finished.intValue() == 2) {
+ return false;
+ }
+ System.out.println("ERROR-isFinite method isn´t running right!");
+ return true;
+ //return continueOnLastTuple(path, transitions, letters);
}
- private boolean continueOnLastTuple(List path, List transitions, List letters) {
+ private void continueOnLastTuple(List path, List transitions, List letters, AtomicInteger finished) {
// path is already filled to end -> check next available state for the transition.
// case we reached the limit (last state)
if(path.size()==1){
- return false;
+ finished.set(1);
+ return;
}
String fromState = path.get(path.size()-2).getElement_2();
Character readSymbol = path.get(path.size()-1).getElement_1();
Transition currentTransition = new Transition(fromState, readSymbol, path.get(path.size()-1).getElement_2());
- for(int i=transitions.indexOf(currentTransition);i path, List transitions, List letters){
+ private boolean fillToEnd(List path, List transitions, List letters, AtomicInteger finished){
String fromState = path.get(path.size()-1).getElement_2();
for(Character letter : letters) {
for (Transition transition : transitions) {
@@ -490,9 +513,15 @@ public class NFAImpl implements NFA {
if(stateInPath(path, transition.toState())) {
//loop!
//loop reaches a acceptingstate? then return true, else delete some shit
+ if(stateReachesAcceptingstates(transition.toState())) {
+ //true:
+ finished.set(2);
+ return true;
+ }
+ //else do nothing and take next transition if possible
} else {
path.add(new Tuple(letter, transition.toState()));
- return fillToEnd(path, transitions, letters);
+ return fillToEnd(path, transitions, letters, finished);
}
}
}
@@ -510,6 +539,35 @@ public class NFAImpl implements NFA {
}
return false;
}
+ private boolean stateReachesAcceptingstates(String state){
+ if(this.acceptingStates.contains(state)){
+ return true;
+ }
+ Set currentStates = new HashSet<>();
+ Set newStates = new HashSet<>();
+ currentStates.add(state);
+ boolean containsNewStates;
+ do{
+ containsNewStates = false;
+ for(String currentstate : currentStates){
+ for(Transition transition : this.transitions){
+ if(transition.fromState().equals(currentstate)){
+ newStates.add(transition.toState());
+ }
+ }
+ }
+ for(String newState : newStates){
+ if(this.acceptingStates.contains(newState)){
+ return true;
+ }
+ if(!currentStates.contains(newState)){
+ containsNewStates=true;
+ currentStates.add(newState);
+ }
+ }
+ }while(containsNewStates);
+ return false;
+ }
// #TODO
@Override
diff --git a/src/main/java/ab1/impl/GRUPPE/Tuple.java b/src/main/java/ab1/impl/GRUPPE/Tuple.java
index c780985..50408cc 100644
--- a/src/main/java/ab1/impl/GRUPPE/Tuple.java
+++ b/src/main/java/ab1/impl/GRUPPE/Tuple.java
@@ -21,20 +21,10 @@ public class Tuple {
private String element_2;
- public boolean isEnd() {
- return isEnd;
- }
- private boolean isEnd;
+
public Tuple(Character firstElement, String secondElement){
this.element_1=firstElement;
this.element_2=secondElement;
- this.isEnd = false;
}
- public Tuple(Character firstElement, String secondElement, boolean isend){
- this.element_1=firstElement;
- this.element_2=secondElement;
- this.isEnd = isend;
- }
-
}