Der Bonsai-Compiler

Bei der Beschreibung eines einfachen Compilers für den Bonsai-Computers folgen wir sehr eng dem Kapitel 4, Automatisierte Übersetzung, S.177ff aus Alfred Hermes, Dieter Stobbe, INFORMATIK ZWEI (Klett-Verlag 7385) . Das heißt im einzelnen, daß wir zuerst die Definition unserer Modellsprache angeben, die zwar auch RePas heißt, aber eine andere Syntax besitzt. Dann folgt die Konstruktion des Scanners, hier lehnen wir uns weitgehend an die Vorlage an. Der Parser hängt naturgemäß stärker an der Syntax der Modellsprache, so daß hier die Abweichungen zur Vorlage größer werden. Eigentlich ist es natürlich, daß nach dem Erkennen einer Sprachstruktur durch den Parser sofort eine Umsetzung in Zielcode erfolgen kann. Der Übersichtlichkeit halber haben wir jedoch wie in der Vorlage Parser und Code-Generator getrennt. Als Zielcode wird Bonsai-Assembler verwendet, der Code-Generator erzeugt außer der Bildschirmausgabe ein lauffähiges Bonsai-Assembler- (*.bma) - Programm. Im einzelnen liegen folgende Quelltexte auf Diskette vor:

'boncomp.pas' , eine Unit, die außer gemeinsamen Typen, Konstanten, Prozeduren und Funktionen mehr 'technisches' Beiwerk enthält, das in den einzelnen Programmen den Blick auf das Wesentliche versperrt
'scanner.pas' , erzeugt aus einer Quelldatei '*.pas' (lauffähiges Pascalprogramm, dessen Ein- und Ausgaben durch Kommentarklammern '{' '}' stillgelegt sind) das Tokenfile '*.tok', im Fehlerfall hält die Bildschirmausgabe an der Fehlerstelle mit einer Meldung an
Der Scanner liest aus einer '*.pas'-Datei eine Folge von Zeichen ein und führt dabei eine lexikalische Analyse (reines Erkennen von Wortsymbolen) durch und stellt dem Parser eine Liste von Tokens zur Verfügung.
'parser.pas' , erzeugt aus einem Tokenfile '*.tok' das Parse-Tokenfile (Bezeichner werden als Namen z.B. für Variablen erkannt) '*.ptk'
Der Parser überprüft eine Folge von Tokens auf syntaktische Korrektheit (Vergleich mit Syntaxdiagramm)
'codegen.pas' , erzeugt aus dem Parse-Tokenfile '*.ptk' (die Symboltabelle wird aus dem ptk-File rekonstruiert) das Codefile '*.bma' (im Textformat, wie im Simulations-programm)
Erzeugt mit Hilfe der vom Parser bereitgestellten Token-Liste und der Symboltabelle einen Zielcode

Beispiel für einen Compilerlauf

Es wird folgendes Pascal-Programm , abgelegt in der Datei 'zuw.pas', übersetzt. Es ist zu beachten, daß Ein- und Ausgaben in Kommentarklammern gesetzt werden. Kommentare werden vom Scanner überlesen, sie sind der Einfachheit halber (wie z.B. in Turbo-Pascal auch) nicht in die Sprachdefinition aufgenommen.

      PROGRAM Zuweisung;
      LABEL
           a1,s1,e1;
      VAR
         r1,r2 : integer;
      BEGIN
           
           {write('Zahl einlesen : r1');
           readLn(r1);}
           {writeLn('Ausgabe r1 : ',r1);
           write('r1 wird r2 zugewiesen');}
           
      a1 : IF r1 = 0 THEN GOTO e1 ELSE GOTO s1;
      s1 : Inc(r2); Dec(r1);
           GOTO a1;
      e1 :
           
           {writeLn('Ausgabe r1 : ',r1);
            writeLn('Ausgabe r2 : ',r2);
           readLn}
           
      END.
 

Quelltext downloaden von 'Zuweisung'

Einlesen von 'zuw.pas' in den Scanner (scanner.exe)

Nun werden die wichtigsten Ausgaben abgehandelt

PROGRAM_S PROGRAM Der Scanner hat das Schlüsselwort 'Program' festgestellt
Bezeichner_S ZUWEISUNG Der Scanner hat den Bezeichner 'Zuweisung' festgestellt
SEMIKOLON_S ; Der Scanner hat ein Semikolon ';' festgestellt
LABEL_S LABEL Der Scanner hat das Schlüsselwort 'LABEL' festgestellt
KOMMA_S , Der Scanner hat ein Komma ',' festgestellt
VAR_S VAR Der Scanner hat das Schlüsselwort 'VAR' festgestellt
DOPPELPUNKT_S : Der Scanner hat einen Doppelpunkt ':' festgestellt
INTEGER_S INTEGER Der Scanner hat den Datentyp 'Integer' festgestellt
BEGIN_S BEGIN Der Scanner hat das Schlüsselwort 'Begin' festgestellt
IF_S IF Der Scanner hat das Schlüsselwort 'If'
EQU0_S = 0 Der Scanner hat die Bedingung '= 0' festgestellt
THEN_S THEN Der Scanner hat 'THEN' festgestellt
GOTO_S GOTO Der Scanner hat den Befehl 'GOTO' festgestellt
ELSE_S ELSE Der Scanner hat das Schlüsselwort 'ELSE' festgestellt
INC_S INC Der Scanner hat den Befehl 'INC' festgestellt
Kauf_S ( Der Scanner hat eine sich öffnende Klammer '(' festgestellt
Kzu_S ) Der Scanner hat eine sich schließende Klammer ')' festgestellt
DEC_S DEC Der Scanner hat den Befehl 'DEC' festgestellt
END_S END Der Scanner hat das Schlüsselwort 'END' festgestellt

Nach Beendigung des Prozesses wird die Datei 'zuw.tok' erstellt

Einlesen von 'zuw.tok' in den Parser (parser.exe)

Nun werden die wichtigsten Ausgaben abgehandelt

PROGRAM_S PROGRAM Der Parser hat das Schlüsselwort 'Program' festgestellt
ProgName_S ZUWEISUNG Der Parser hat den Programnamen 'Zuweisung' festgestellt
SEMIKOLON_S ; Der Parser hat ein Semikolon ';' festgestellt
LABEL_S LABEL Der Parser hat das Schlüsselwort 'LABEL' festgestellt
LabelName_S A1 Der Parser hat den Labelnamen 'A1' festgestellt
KOMMA_S , Der Parser hat ein Komma ',' festgestellt
VAR_S VAR Der Parser hat das Schlüsselwort 'VAR' festgestellt
VarName_S R1 Der Parser hat den Variablennamen 'R1' festgestellt
DOPPELPUNKT_S : Der Parser hat einen Doppelpunkt festgestellt
INTEGER_S INTEGER Der Parser hat den Datentyp 'INTEGER' festellt
BEGIN_S BEGIN Der Parser hat das Schlüsselwort 'BEGIN' festgestellt
IF_S IF Der Parser hat das Schlüsselwort 'IF' festgestellt
EQU0_S = 0 Der Parser hat die Bedingung '=0' festgestellt
THEN_S THEN Der Parser hat das Schlüsselwort 'THEN' festgestellt
GOTO_S GOTO Der Parser hat den Befehl 'GOTO' festgestellt
ELSE_S ELSE Der Parser hat das Schlüsselwort 'ELSE' festgestellt
INC_S INC Der Parser hat den Befehl 'INC' festgestellt
Kauf_S ( Der Parser hat eine offene Klammer '(' festgestellt
Kzu_S ) Der Parser hat eine geschlossene Klammer ')' festgestellt
DEC_S DEC Der Parser hat den Befehl 'DEC' festgestellt
END_S END Der Parser hat das Schlüsselwort 'END' festgestellt
PUNKT_S . Der Parser hat einen Punkt '.' festgestellt

Nach Beendigung des Prozesses wird die Datei 'zuw.ptk' erstellt.

Einlesen von 'zuw.ptk' in den Codegenerator (codegen.exe)

Diese Prozess verläuft in 2 Schritten.
Im ersten Schritt wird die temporäre Datei zuw.TMP erstellt.
Diese Datei ist eine Vorstufe des zu generierenden Bonsai-Codes und enthält statt Adressen noch Labels.

Die Datei 'zuw.tmp' sieht folgendermaßen aus :
TSTR1
JMPS1
JMPE1
INCR2
DECR1
JMPA1
HLT

Im 2. Schritt werden die Labels durch Adressen ersetzt, der fertige Bonsaicode erstellt und in der Datei 'zuw.bon' gespeichert.
Die Datei 'zuw.bon' sieht folgendermaßen aus :
TST 1
JMP 4
JMP 7
INC 2
DEC 1
JMP 1
HLT
#    0
#    0
;R1
;R2
;
;
;
;
;
;
;
;
Bonsai - Compiler downloaden

Das nun erstellte Programm kann nun im Bonsai-Assembler geöffnet und ausprobiert werden


© Laurent Gräbner und Andreas Franke