HSG |
|
Bei der systematischen Entwicklung von Assembler-Programmen bemerkt man die häufige Wiederholungen verhältnismäßig einfacher Schemata. Der Gedanke liegt nahe, diese Übersetzung einer Maschine bzw. einem Programm zu überlassen. Ein solcher Compiler übersetzt Programme einer Quellsprache so in eine Zielsprache, dass die Bedeutung erhalten bleibt.
Als Quellsprache soll eine sehr stark reduzierte Untermenge von Pascal verwendet werden. Wir nennen die Sprache RePas. Sie muss präzise definiert werden, was zum Beispiel durch Syntaxdiagramme erfolgen kann.
Die Zielsprache ist Bonsai-Assembler.
Ein Compiler besteht aus den drei Teilen:
|
Bonsai-Compiler downloaden |
Ihre Funktion soll nun an Beispielen erläutert werden.
Der Scanner soll folgende Datei 't0.pas' auf ihre lexikalische Richtigkeit hin untersuchen.
;var,,goto label 123 Stuhl # Tisch usw.
Bei der Analyse hat der Scanner verschiedene korrekte Bestandteile, sogenannte Token, der Sprache RePas erkannt wie ein Semikolon-Symbol Semikolon_S oder ein var-Symbol. Dass nun zwei Komma-Symbole folgen stört ihn nicht, die Zahl 123 hingegen ist kein erlaubtes Token. Die Verwendung eines unerlaubten Zeichen # schließlich bringt ihn vollends aus der Fassung, das Scannen wird mit einem Fehler abgebrochen.
Die Datei 't1.pas'
PROGRAM p123; BEGIB dec(a); END.
wird wie man sieht vom Scanner ohne Murren geschluckt. Er erzeugt daraus die Tokendatei t1.tok, die nun dem Parser vorgelegt wird. Der Parser untersucht anhand der Syntaxdiagramme, ob die Token in einer zulässigen Reihenfolge vorliegen.
Wie man sieht, hat der Parser den Syntax-Fehler entdeckt und das Parsing abgebrochen.
Die folgende Datei 'addition.pas' wurde aus einem Delphi-Projekt entnommen und durch Auskommentieren und Hinzufügen an die RePas-Syntax angepasst.
{procedure TForm1.bProgramm3Click(Sender: TObject);} program p; label SB,SK,SE; var a,b,r1,r2 : integer; begin {eS.Text := ''; a := StrToInt(eA.Text); b := StrToInt(eB.Text); r1 := a; r2 := b;} SB: if r2 = 0 { tst 2 } then goto SE { jmp SK } else goto SK; { jmp SE } SK: inc(r1); { inc 1 } dec(r2); { dec 2 } goto SB; { jmp SB } SE: { hlt } {eS.Text := IntToStr(r1);} end{;} .
Der Scanner hat schon die Kommentare entfernt und erfolgreich die Token-Datei 'addition.tok' erzeugt. Der Parser erzeugt daraus folgende Bildschirmausgaben und die Datei 'addition.ptk'.
In der Symboltabelle verwaltet der Parser die Variablenbezeichner und Labels. Als Adressen werden vorläufig Nullen eingetragen.
Schließlich kann aus der 'addition.ptk' der Assemblercode durch den Code-Erzeuger erzeugt werden. Das fertige Programm wird in 'addition.bon' abgelegt.
Nach und nach konnte der Code-Erzeuger die Symboladresse mit den richtigen Adressen füllen, die in einem zweiten Durchgang (2-pass-compiling) statt der symbolischen Labels verwendet werden.
Das nun erstellte Programm kann nun im Bonsai-Assembler geöffnet und ausprobiert werden.
Das Programm hat 27+15 = 42 errechnet.
Der beschriebene Compiler für den Bonsai-Computers folgt eng dem Kapitel 4, Automatisierte Übersetzung, S.177ff aus Alfred Hermes, Dieter Stobbe,INFORMATIK ZWEI (Klett-Verlag 7385)
Carola Rauch hat den Compiler in ihrer Facharbeit gründlich überarbeitet.