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.