6.6 Einen Parser in Java implementieren
Ich möchte nun eine kontextfreie Grammatik für arithmetische Ausdrücke der
Form ((31+402)*83) entwerfen. Der Einfachheit halber bestehe ich
auf strenger Klammerung, so wäre (2*(1+2+3)) zum Beispiel nicht erlaubt.
Unsere Grammatik soll allgemeine Dezimalzahlen darstellen können.
Das Alphabet ist somit
Die Nichtterminale sind also
Wie wir diesen Baum in Java repräsentieren, darüber sprechen wir in einer Minute.
Zuerst aber: wir wollen mit diesem Baum etwas Sinnvolles tun. Zum Beispiel
auswerten, so dass am Ende eine Zahl rauskommt, im obigen Beispiel
also
Eine Datenstruktur für Ableitungsbäume
Für meine Implementierung in Java erschaffe ich für jedes Nichtterminal
- interface Expression wird implementiert von
- class Sum, die als Klassenvariable Exrepssion e1, e2 enthält,
- class Product, die als Klassenvariable Exrepssion e1, e2 enthält,
- class JustNumber, die als Klassenvariable nur eine Number number enthält;
- interface Number wird implementiert von
- class MultiDigitNumber, die als Klassenvariable eine Number und eine Digit erhält und
- class SingleDigitNumber, die als Klassenvariable ein Digit enthält;
- interface Digit wird implementiert von class DigitOne, class DigitTwo, class DigitThree, class DigitFour, class DigitFive, class DigitSix, class DigitSeven, class DigitEight und class DigitNine.