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 |
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. |
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 |
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 |
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.
TSTR1 JMPS1 JMPE1 INCR2 DECR1 JMPA1 HLT
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