So eine Art Baumstruktur (naja, eher Graph allgemein) ist es ja auch.
Schreib gleich ein bisschen (oder mehr) dazu, kommt dann hier rein.
edit:
Vorstellen kann man sich so einen "FA" zB. so:
http://blog.markshead.com/wp-content/uploads/2011/02/non-deterministic-finite-state-machine.png
Um es gleich vorweg zu nehmen: Der passt zum Regexp
ab*c|ac*d
oder, das Selbe,
a(b*c|c*d)
Die Buchstaben in den Knoten sind eig. unwichtig, sind nur zur Unterscheidung
(Zahlen gehen genau so gut).
Am Bild zwar nicht wirklich gekennzeichnet, aber angenommen, s ist Start und t ist Ende.
Der Normalfall "püfen, ob ein Wort zum Regexp passt" ist bei dieser Form die Frage,
ob es einen Weg von Start zu Ende gibt, bei dem die Buchstaben
der abgefahrenen Pfade genau das Prüfwort ergeben.
(Es kann auch mehrere mögliche Enden geben.
Und ein Pfad zwischen zwei Knoten kann auch mehrere mögliche Buchstaben haben,
oder anders gesagt es kann mehrere Pfade mit verschiedenen Buchstaben
zwischen den selben Knoten geben)
Regex-Strukturen wie * und | kann man damit gut abbilden
Ein Oder wäre die Verzweigung im Knoten s, ein * die Schleifen in q und r
( der Bogen kann sich natürlich auch über mehrere Knoten ziehen, für (...)* )
sachen wie a+ kann man umformen zu aa* usw.
Optionales wie a? kann man durch eine Verzweigung machen,
bei der eine Seite zu a geht und die andere Seite
ein buchstabenloser (aber existierender) Pfad ist
(der beim Wortprüfen eben keinen Buchstaben ausmacht.
Gibts am Bild nicht, ist aber erlaubt)
Wortgenerierung läuft dann ca. so ab:
Code:
Man beginnt beim Start als aktueller Knoten und einem leeren Wort(speicher)
Solange der aktuelle Knoten kein Endknoten ist
{
Nimm zufällig einen der verfügbaren Pfade
Füg den dazugehörenden Buchstaben (falls vorhanden) zum Wort dazu
und nimm den Zielknoten als aktuellen
}
Einfach zufällig durchlaufen.
Mein Parser zerlegt die Regexp eben in Knoten und Pfade
und behandelt * etc. wie oben beschrieben als Schleifen usw.
Wenn alle eingegeben Regexp so behandelt wurden
gibts ein paar Algorithmen (alle in Klasse FA),
die zusammen am Ende einen einizgen Automat ergeben, der genau die Worte erlaubt,
die eben von allen Quellautomaten erlaubt werden.
Als Datenstruktur ist es (wie schon gesagt) ein Haufen Knoten,
wobei jeder Pfade hat, die ihren Gegenüber-Knoten
und ihre

mögliche

Buchstaben wissen.
(die Buchstaben sind das Hauptgebiet für die Rangeklasse,
damit auch etwas wie "alle Unicodezeichen" speichersparend als Von-Bis abgespeichert wird)
PS: Lasst doch nicht mich allein schreiben,
eure Vorgehensweisen sind auch interessant
