Miniprojekt - Automatensimulator

Zielsetzung

Bei der Entwicklung eines Automatensimulators orientieren wir uns an dem Software-Werkzeug JFlap.

JFlap

Ziel ist es, einen von JFlap erzeugten XML-Quelltext zur Beschreibung eines endlichen Automaten mit Hilfe eines selbst entwickelten Automatensimulators zu verarbeiten. Dieser Simulator muss also XML-Quelltexte wie den folgenden verarbeiten können.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--Created with JFLAP 6.4.-->
<structure>
	<type>fa</type>
	<automaton>
		<!--The list of states.-->
		<state id="0" name="q0">
			<x>60.0</x>
			<y>59.0</y>
			<initial/>
		</state>
		<state id="1" name="q1">
			<x>147.0</x>
			<y>59.0</y>
		</state>
		...
		<state id="5" name="q5">
			<x>510.0</x>
			<y>59.0</y>
			<final/>
		</state>
		<!--The list of transitions.-->
		<transition>
			<from>4</from>
			<to>5</to>
			<read>b</read>
		</transition>
		...
		<transition>
			<from>1</from>
			<to>2</to>
			<read>@</read>
		</transition>
	</automaton>
</structure>
email.jff

Entwicklung eines Automatensimulators

Der folgende Python-Quelltext zeigt einen Ausschnitt aus einer Implementierung eines Automatensimulators.

from xml.dom.minidom import *

# Anfangszustand
def anfangszustand(baum):
    z = None
    k_initial_liste = baum.getElementsByTagName("initial")
    if k_initial_liste != []:
        k_state = k_initial_liste[0].parentNode
        z = k_state.getAttribute("id")
    return z

# nächster Zustand
def naechsterzustand(baum, zustand, eingabe):
    pass

# Endzustand
def endzustand(baum, zustand):
    pass

# Einlesen des XML-Quelltextes
f_xml = open("email.jff", "r")
xml_quelltext = f_xml.read()

# Initialisierung des DOM-Baums
dombaum = parseString(xml_quelltext)
wurzel = dombaum.documentElement

# Test
z = anfangszustand(wurzel)
print(z)

Aufgabe 1

Analysiere zunächst den gezeigten Python-Quelltext. Was leistet die Funktion anfangszustand? Benutze die Datei "email.jff" zum Testen.

Aufgabe 2

Ergänze die Implementierung der beiden Funktionen naechsterzustand und endzustand. Teste anschließend die Funktionen wie folgt:

...

z = anfangszustand(wurzel)
print(z)
wort = "bbb@b.bb"
for w in wort:
    z = naechsterzustand(wurzel, z, w)
    print(z)
if endzustand(wurzel, z):
    print("akzeptiert")
else:
    print("nicht akzeptiert")

Objektorientierte Realisierung

Zur objektorientierten Realisierung eines Automatensimulators wird die Klasse Automat modelliert.

Klassendiagramm

Der folgende Python-Quelltext zeigt einen Ausschnitt aus einer Implementierung der Klasse Automat sowie einen einfachen Test dieser Klasse.

class Automat(object):
    def __init__(self, quelltext):
        self.quelltext = quelltext
        self.dombaum = parseString(self.quelltext)
        self.wurzel = self.dombaum.documentElement
        self.zustand = None

    def anfangszustand(self):
        k_initial_liste = self.wurzel.getElementsByTagName("initial")
        if k_initial_liste != []:
            k_state = k_initial_liste[0].parentNode
            self.zustand = k_state.getAttribute("name")

    def naechsterzustand(self, eingabe):
        pass

    def endzustand(self):
        pass

    def getZustand(self):
        return self.zustand

# Test
f_xml = open("email.jff", "r")
xml_quelltext = f_xml.read()

automat = Automat(xml_quelltext)

automat.anfangszustand()
print(automat.getZustand())
automat.naechsterzustand("b")

Aufgabe 3

Ergänze die Implementierung der beiden Methoden naechsterzustand und endzustand. Teste anschließend die Methoden.

Aufgabe 4

Entwickle eine Klasse Simulator. Objekte dieser Klasse sollen ein eingegebenes Wort mit Hilfe eines Automaten abarbeiten und entscheiden, ob das Wort vom Automaten akzeptiert wird.

X

Fehler melden

X

Suche