# PL0-Compiler - Einführung

- Einführung
  - Aufgabenstellung
  - Geplantes Vorgehen und gesetzte Ziele
- Scanner und Parser
- Die Symboltabelle
- Übersetzung in Zwischencode
- Linearisierung des Zwischencodes
- Optimierung des Zwischencodes
- Das Linux-Backend
- Der Interpreter
- Downloads und Informationen

## 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