====== Aufruf/Verwendung von Lexer, Parser und Interpreter ======
Wie man die Klassen ''Lexer'', ''Parser'' und ''Interpreter'' benutzt, ist aus folgendem Testprogramm leicht ersichtlich:
public class InterpreterTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
/**
* Der Text wird hier Stringkonstante definiert. Er könnte ebenso
* gut gerade vom Benutzer eingegeben worden sein. Wichtig ist: Der
* Java-Compiler compiliert hier nichts. Es wird alles durch Lexer,
* Parser und Interpreter erledigt.
*/
String text = "1 + 2*(3 + a) - (7-b)";
System.out.println("Eingabetext:\n" + text);
/**
* Zerlegung des Programmtextes in Tokens:
*/
Lexer l = new Lexer(text);
l.lex();
System.out.println("\nTokens:\n" + l.toString());
/**
* Bauen des Abstract Syntax Tree:
*/
Parser p = new Parser(l.getTokenListe());
p.parse();
System.out.println("\nParsebaum (abstract syntax tree):\n" + p.toString());
/**
* Berechnung eines Termwerts für die Belegung a = 5 und b = 1
*/
Interpreter i = new Interpreter();
i.belegeVariable("a", 5);
i.belegeVariable("b", 1);
System.out.println("\nVariablenbelegung:\n"
+ i.getBelegungAlsString());
System.out
.println("\nTermwert:\n" + i.interpretiere(p.getWurzel()));
} catch (Exception e) {
// Falls ein Fehler bei der Übersetzung aufgetreten ist:
e.printStackTrace();
}
}
}
Die Ausgabe des Beispielprogramms sieht so aus:
Eingabetext:
1 + 2*(3 + a) - (7-b)
Tokens:
zahl[1.0] plus zahl[2.0] mal klammerAuf zahl[3.0] plus text[a] klammerZu minus klammerAuf zahl[7.0] minus text[b] klammerZu
Parsebaum (abstract syntax tree):
minus
plus
zahl[1.0]
mal
zahl[2.0]
plus
zahl[3.0]
text[a]
minus
zahl[7.0]
text[b]
Variablenbelegung:
b = 1.0
a = 5.0
Termwert:
11.0
Hier geht's weiter mit der [[programmieren:ebnf:start|Beschreibung der Syntax durch EBNF]]. \\
Danach wird die [[programmieren:erweiterung:start|Programmiersprache deutlich erweitert]], so dass sie auch Zuweisungen, Wiederholungen und eine einfache Print-Ausgabe besitzt.