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 Beschreibung der Syntax durch EBNF.
Danach wird die Programmiersprache deutlich erweitert, so dass sie auch Zuweisungen, Wiederholungen und eine einfache Print-Ausgabe besitzt.