PL0-Compiler - Einführung

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:

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:


Scanner und Parser next


Valid HTML 4.01!