Es sollen nun mehrstellige ganze Zahlen ausgewertet werden. Der Übersetzer übersetzt also beispielsweise das Eingabewort "123" in die Zahl 123. Im weiteren Verlauf kommen auch Kommazahlen hinzu, sodass der Übersetzer in der Lage ist, auch Eingabewörter wie "123.05" oder "000.567" in die entsprechenden Zahlenwerte zu übersetzen.
Die Aufgabe bei der Konstruktion eines Recursive-Descent-Übersetzers besteht darin, einen entsprechenden Recursive-Descent-Parser um geeignete Übersetzungsaktionen anzureichern.
Gehen Sie zunächst von der Produktion
| integer | ![]() | digit | integer digit |
für Integer-Zahlen aus, auch wenn diese aufgrund ihrer Linksrekursivität nicht für die Recursive-Descent-Methode geeignet ist.
Der Ableitungsbaum für das Eingabewort "123" hat die folgende Gestalt (Bild 1a). Um den zugehörigen Zahlenwert zu ermitteln, führen Sie an den inneren Knoten des Ableitungsbaumes, je nach angewendeter Produktion, bestimmte Übersetzungsaktionen aus. An einem digit-Knoten erstellen Sie per Typumwandlung aus einer Ziffer eine Integer-Zahl. An einem integer-Knoten übernehmen Sie, wenn die Produktion integer
digit angewendet wird, den von digit gelieferten Zahlenwert. Wenn dagegen die Produktion integer
integer digit angewendet wird, multiplizieren Sie den von integer gelieferten Wert mit 10 und addieren den von digit gelieferten Wert hinzu. In Bild 1b sehen Sie den entsprechenden Datenflussgraphen.
Auf diese Weise werten Sie das Eingabewort von links nach rechts aus. Wie bereits erwähnt, sind linksrekursive Produktionen nicht mit der Recursive-Descent-Methode verträglich. Daher wandeln Sie die Rekursion in eine Iteration um (siehe Rekursion durch Iteration ersetzen).
Sie erhalten hierdurch die Produktion
| integer | ![]() | digit digit* |
Die Übersetzungsfunktion ermittelt zunächst den Zahlenwert v der ersten digit. Wenn keine weiteren digits mehr folgen, wird dieser Wert v zurückgegeben. Ansonsten wird der Wert v mit 10 multipliziert und der Zahlenwert der nächsten digit hinzuaddiert usw. Die Programmvariable v tritt im Datenflussgraphen also an die Stelle von integer (Bild 1c).
Bild 1: Ableitungsbaum (a) sowie Datenflussgraphen (b) und (c) für das Eingabewort "123"
Mehrstellige ganze Zahlen werten Sie am einfachsten in der angegebenen Weise von links nach rechts aus. Die verwendete Produktion integer
digit digit* ermöglicht in einfacher Weise die Auswertung von links nach rechts.
Die Nachkommastellen einer Kommazahl werten Sie dagegen am einfachsten von rechts nach links aus. Verwenden Sie daher die rechtsrekursive Produktion
| fraction | ![]() | digit | digit fraction |
und faktorisieren diese:
| fraction | ![]() | digit (ε | fraction) |
Die entsprechende Implementierung lautet
Es bleibt nur noch, dass Sie die vollständige Grammatik für mehrstellige Zahlen mit oder ohne Nachkommastellen und mit oder ohne Vorzeichen zusammenstellen und in einen entsprechenden Recursive-Descent-Copiler umsetzen.