Die abstrakte Klasse Parser dient als Basisklasse für einen konkreten Recursive-Descent-Parser. Sie greift ihrerseits zurück auf eine abstrakte Klasse ParserFunctions zurück. Wenn es später nicht nur um das Parsen geht, sondern über die reine Syntaxprüfung hinaus um das Übersetzen, kommt als Basisklasse für konkrete Übersetzer noch die abstrakte Klasse Compiler hinzu (Bild 1).
Bild 1: Klassenhierarchie von Parsern und Compilern
In der Klasse ParserFunctions befinden sich die globalen Variablen inputstring, errormessage und errorposition sowie grundlegende Funktionen zur Abarbeitung des Eingabewortes.
Dies ist nur eine minimale Sammlung von Funktionen, die für das Parsen benötigt werden. Bei Bedarf lassen sich in dieser Klasse weitere nützliche Funktionen unterbingen, zum Beispiel eine Funktion ignoreBlanks, die Leerzeichen abarbeitet, oder eine Funktion getSymbol, die ein Zeichen abarbeitet und zurückgibt.
In der Klasse Parser befindet sich die public-Methode parse(String x). Diese übernimmt das Eingabewort x, weist es der globalen Variablen inputstring zu und ruft die Methode startSymbol() auf. Die Methode startSymbol() ist abstrakt; sie muss in dem jeweiligen konkreten Parser, der von der abstrakten Klasse Parser abgeleitet wird, implementiert werden. Darüber hinaus fängt die Methode parse jegliche Fehler auf, die beim Parsen des Eingabewortes aufgrund von Syntaxfehlern möglicherweise ausgelöst werden.
Die Klasse Compiler ist genauso aufgebaut wie die Klasse Parser. Der Unterschied besteht darin, dass der Aufruf des Startsymbols jetzt einen Wert vom Typ Type zurückliefert. Dieser Wert stellt das Ergebnis der Übersetzung dar.
Weiter mit: [up]