Ziel ist es, aus einem regulären Ausdruck z in systematischer Weise einen nichtdeterministischen endlichen Automaten N(z) zu konstruieren, der die von z erzeugte reguläre Sprache L(z) erkennt. Hierzu wird zuerst eine kontextfreie Grammatik für reguläre Ausdrücke angegeben. Basierend auf dieser Grammatik wird mithilfe der Recursive-Descent-Methode ein Übersetzer erzeugt, der einen regulären Ausdruck in den entsprechenden Automaten übersetzt. Die Übersetzungsaktionen entsprechen den Schritten, die im Abschnitt Konstruktion eines nichtdeterministischen endlichen Automaten aus einem regulären Ausdruck angegeben sind.
Zur Beschreibung regulärer Ausdrücke verwenden wir eine Grammatik in erweiterter Backus-Naur-Form (EBNF) mit folgenden Produktionen:
expr | term (| term)* | |
term | factor factor* | |
factor | atom ** | |
atom | ( expr ) | literal | |
literal | a | b | c | % |
Die Zeichen |, *, (, ) kommen einerseits in regulären Ausdrücken vor, sind also Terminalzeichen der Grammatik, andererseits aber auch Metazeichen zur Beschreibung der Grammatik. Zur Unterscheidung sind Terminalzeichen rot dargestellt, Metazeichen schwarz.
Die Grammatik berücksichtigt die Präzedenzregeln bei der Auswertung regulärer Ausdrücke: * bindet am stärksten, | bindet am schwächsten. Das in den regulären Ausdrücken verwendete Alphabet besteht hier nur aus den Zeichen a, b und c. Das Zeichen % steht für die leere Menge.
Es folgt das Programm.
Die folgende, von der Klasse Parser abgeleitete Klasse RegExprCompiler übersetzt einen regulären Ausdruck in den zugehörigen nichtdeterministischen endlichen Automaten. Sie enthält für jede Produktionen der Grammatik eine entsprechende Funktion.
Der Automat wird bottom-up aus einfachen Automaten durch Parallel- und Hintereinanderschaltung sowie Abschlussbildung mittels der Funktionen parallel, concat und star der unten angegebenen Klasse Nfa aufgebaut.
Ein möglicher Aufruf des Übersetzers ist
Zunächst folgt die Klasse State, die einen Zustand des Automaten darstellt. Bedingt durch die spezielle Konstruktion des Automaten ist die Klasse State sehr einfach aufgebaut.
Der Automat hat genau einen Endzustand. Dieser ist der einzige Zustand, der keinen Folgezustand hat. Alle anderen Zustände des Automaten haben einen oder zwei Folgezustände. Hat ein Zustand zwei Folgezustände, so sind beide Zustandsübergänge mit ε markiert.
Attribute der Klasse sind eine Liste nextstate mit bis zu zwei Einträgen, die Verweise auf die beiden möglichen Folgezustände enthält, sowie ein String symbol, der das Zeichen enthält, mit dem der Zustand in den Folgezustand übergeht. Ferner trägt jeder Zustand eine Nummer; diese wird mithilfe der Klassenvariable n bei jeder Erzeugung eines neuen Zustands hochgezählt. Für die Ausgabe und die Simulation des Automaten wird außerdem das boolesche Attribut marked benötigt.
Die folgende Klasse Nfa (nondeterministic finite automaton) repräsentiert einen nichtdeterministischen endlichen Automaten. Sie enthält einen Konstruktor zur Erzeugung eines Elementarautomaten für ein Alphabetzeichen a. Derselbe Konstruktor wird verwendet, um den Elementarautomaten für die leere Sprache, hier bezeichnet durch das Zeichen %, zu erzeugen. Da das Zeichen % nicht im Alphabet vorkommt, kann der Zustandsübergang mit dem Zeichen % nie ausgeführt werden, sodass der Automat wie gewünscht die leere Sprache akzeptiert.
Die Klasse enthält ferner Methoden zur Parallelschaltung und Hintereinanderschaltung des Automaten mit einem anderen Automaten sowie eine Methode für die Abschlussbildung, also die Anwendung des Stern-Operators, außerdem eine Methode zur Darstellung des Automaten als Tabelle der Übergangsrelation.
Die Struktur regulärer Ausdrücke ist durch die Grammatik für reguläre Ausdrücke vorgegeben. Aus dieser Grammatik haben wir mit der Recursive-Descent-Methode einen Übersetzer für reguläre Ausdrücke konstruiert. Ziel der Übersetzung eines bestimmten regulären Ausdrucks ist ein zugehöriger nichtdeterministischer endlicher Automat, der die von dem regulären Ausdruck erzeugte Sprache erkennt.
Mithilfe des so konstruierten Automaten lässt sich feststellen, ob ein bestimmtes Wort w von einem gegebenen regulären Ausdruck erzeugt wird (siehe Simulation eines nichtdeterministischen endlichen Automaten).
Weiter mit: [Simulation eines nichtdeterministischen endlichen Automaten] oder [up]