Aufgabenstellung
Im Rahmen des Hauptseminars Übersetzungstechnik im Sommersemester 2004 an der TU Dresden sollte ein Übersetzer geschrieben werden, welcher ein PL/0-Programm als Eingabe akzeptiert. Weitere konkrete Ziele wurden nicht vorgegeben, es sollte aber eine "Visualisierung" eingebaut werden, um die verschiedenen Stufen des Übersetzungsprozesses veranschaulichen zu können.
Die Sprache PL/0
Die Sprache PL/0 ist eine Modellsprache mit sehr eingeschränktem Umfang. Es gibt nur einen einzigen Datentyp, Integer, mit dem die vier Grundrechenarten Addition, Subtraktion, Multiplikation und Division durchgeführt werden können. Desweiteren existieren die wichtigsten Kontrollanweisungen IF-THEN
und WHILE-DO
. Kontrollbedingungen können sein:
- gleich
- ungleich
- kleiner
- kleiner gleich
- größer
- größer gleich
- ist ungerade
Außerdem können Konstanten, Variablen und Prozeduren definiert werden, es wurde festgelegt, dass Prozeduren andere Prozeduren, die erst später im Quelltext definiert werden, aufrufen können (was nicht selbstverständlich ist, in Pascal müssen Prozeduren, die noch nicht deklariert sind, explizit in einer Forward-Deklaration bekanntgemacht werden). Zusätzlich gibt es Anweisungen für die Ein- und Ausgabe.
PL/0 Syntax
Die verwendete PL/0 Syntax sieht in EBNF-Schreibweise folgendermaßen aus:
program = block ".". block = ["CONST" ident "=" number {"," ident "=" number} ";"] ["VAR" ident {"," ident} ";"] {"PROCEDURE ident ";" block ";"} statement. statement = [ident ":=" expression | "CALL" ident | "?" ident | "!" expression | "BEGIN" statement {";" statement} "END" | "IF" condition "THEN" statement | "WHILE" condition "DO" statement]. condition = "ODD" expression | expression ("=" | "#" | "<" | "<=" | ">" | ">=") expression. expression = ["+" | "-"] term {("+" | "-") term}. term = factor {("*" | "/") factor}. factor = ident | number | "(" expression ")". |
Dabei steht ident
für Bezeichner (Variablennamen, Konstantennamen oder Prozedurnamen) und number
für dezimale Zahlen.
Geplantes Vorgehen und gesetzte Ziele
Folgende Entscheidungen wurden von der Gruppe gefällt:
- Die Implementationssprache ist Java.
- Das Frontend soll von einem Generator erzeugt werden.
- Die gewonnene Zeit soll für die Implementierung von Optimierungsalgorithmen verwendet werden.
- Es soll eine möglichst quellsprachen- und maschinenunabhängige Zwischensprache verwendet werden.
- Es soll ausführbarer Binärcode erzeugt werden.
Scanner und Parser |