Prettified debug output (sorted initial state and accept-states)

Properly tested epsilon transitions
This commit is contained in:
Gabriel Tofvesson 2019-03-27 21:53:36 +01:00
parent 382d2e9501
commit 51dd52aa86
5 changed files with 47 additions and 16 deletions

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

0
README.md Normal file
View File

View File

@ -1,24 +1,37 @@
import dev.w1zzrd.automata.*
fun main(args: Array<String>){
val language = Language.makeLanguage(0, 1, 2)
val automaton = Automaton(language, false)
val language = Language.makeLanguage(0, 1)
val nfa = Automaton(language, false)
val stateA = automaton.makeState("a")
val stateB = automaton.makeState("b")
val stateC = automaton.makeState("c")
val stateD = automaton.makeState("d", true)
val stateS = nfa.makeState("s")
val stateQ1 = nfa.makeState("q1")
val stateQ2 = nfa.makeState("q2", true)
val stateP = nfa.makeState("p")
val stateQ = nfa.makeState("q")
val stateR = nfa.makeState("r", true)
stateA.addConnective(arrayOf(0, 1), stateB)
stateA.addConnective(arrayOf(1, 2), stateC)
stateS.addEpsilon(stateQ1, stateP)
stateB.addConnective(arrayOf(0, 2), stateD)
stateQ1.addConnective(0, stateQ1)
stateQ1.addConnective(1, stateQ2)
stateC.addConnective(arrayOf(0, 1), stateD)
stateQ2.addConnective(0, stateQ1)
stateD.addConnective(0, stateA)
stateP.addConnective(arrayOf(0, 1), stateP)
stateP.addConnective(1, stateQ)
automaton.entryPoint = stateA
stateQ.addConnective(arrayOf(0, 1), stateR)
val dfa = automaton.toDeterministicAutomaton(true)
nfa.entryPoint = stateS
val dfa = nfa.toDeterministicAutomaton(true)
val dtraverser = dfa.makeTraverser()
dtraverser.traverse(1, 1, 0, 0)
println(dtraverser.currentState.toString())
val ntraverser = nfa.makeTraverser()
ntraverser.traverse(1, 1, 0, 0)
println(ntraverser.currentState.toString())
}

View File

@ -97,7 +97,7 @@ class Automaton<T>(val language: Language<T>, val deterministic: Boolean){
}
if(printTable)
for(key in tableEntries.keys){
for(key in tableEntries.keys.sortedBy { if(it.contentsEquals(startingState)) 0 else if (it.isAcceptState()) 2 else 1 }){
print(
(if(key.contentsEquals(startingState)) "" else " ") +
(if(key.isAcceptState()) "F" else " ") +
@ -131,7 +131,13 @@ class Automaton<T>(val language: Language<T>, val deterministic: Boolean){
private fun MutableList<State<T>>.isAcceptState() = firstOrNull { it.acceptState } != null
private inner class StateTraverser(entryPoint: State<T>) {
fun makeTraverser(): StateTraverser{
if(entryPoint == null)
throw IllegalStateException("Entry point state must be defined!")
return StateTraverser(entryPoint!!)
}
inner class StateTraverser(entryPoint: State<T>) {
var currentState: MutableList<State<T>> = ArrayList()
val accepted: Boolean
@ -150,8 +156,9 @@ class Automaton<T>(val language: Language<T>, val deterministic: Boolean){
val nextState = ArrayList<State<T>>()
for(state in currentState)
for(traverseState in state.getConnective(verb))
for(traverseState in state.getConnective(verb)) {
nextState.traverseEpsilon(traverseState)
}
currentState = nextState
}
@ -161,6 +168,7 @@ class Automaton<T>(val language: Language<T>, val deterministic: Boolean){
for(epsilonState in state.getEpsilon())
if(!contains(epsilonState))
traverseEpsilon(epsilonState)
}
}
}

View File

@ -44,6 +44,10 @@ class State<T>(
override fun hashCode(): Int {
return name.hashCode()
}
override fun toString(): String {
return name
}
}
class StateFactory<T>(val language: Language<T>, val deterministic: Boolean){