Benutzung des Programm-Pakets:
1. Schritt: Erstellen der Datei gram.asc und comment.txt
In gram.asc steht die regulären Ausdrücke der Tokenklassen drin,
in
Postfix-Notation. Postfix, weil dadurch die Programmierung einfacher
ist. Der ersten Tokenklasse wird die Nummer 1 zugeordnet, der n-ten
die Nummer n usw...
Jeweils 2 reguläre Ausdrücke werden durch 2 Leerzeilen getrennt.
2. Schritt: Estellung des DEA:
Aufruf: nde4 gram.asc
Es wird der Output DEA.OUT erzeugt, der den DEA-Automaten beschreit,
welcher aus den regulären Ausdrücken erzeugt wird.
Die Ausgabe ist mit dem folgenden Programm schreibe abgesprochen worden.
3. Schritt: Erstellung des Source-Code für den Scanner:
Aufruf: schreibe < DEA.OUT > mms_scanner.c
Das Programm schreibe liest die relevanten Daten aus DEA.OUT ein und
erzeugt als Output mms_scanner.c .
Es braucht auch die Datei comment.txt um die Kommentarzeichen zu erhalten.
Ferner werden die Dateien block_a.dat , ... , block_f.dat benötigt,
die den wesentlichen
Teil des Source-Code enthalten.
Während schreibe läuft, werden auch noch block_0.dat und block_1.dat
erzeugt und
ebenfalls in mms_scanner.c verbraten.
( ich habe erst mit der Standard-Ausgabe gearbeitet, aber da kam ein Fehler
auf,
als ich den Umweg mit block_0.dat und block_1.dat gegangen bin, trat
der Fehler
nicht mehr auf .....????? darum also die beiden Dateien block_0.dat und
block_1.dat )
4. Schritt: Compiliere den Scanner:
Aufruf: cc mms_scanner.c -o mms_scanner
Mache aus dem Source-Code ein lauffähiges Programm!
5. Schritt: Erzeuge den Tokenstrom:
Aufruf: mms_scanner < quicksort.mms > tokenliste
Der Sanner erzeugt die Tokenliste entsprechend den Vereinbarungen mit der
2.
Gruppe : Tokenklasse Argument Spalte Zeile
Allerdings sind hier die Tokennummern noch falsch, da keine Sprünge
der
Tokennummern brücksichtigt werden konnten.
6.Schritt: Korrigiere die Tokennummern:
Aufruf: perl filter.ph tokenliste > tokenstrom.filter
Das Perl-Programm erzeugt einen Output, der die Tokennummern entsprechend
der Vereinbarungen mit den anderen Gruppen enthält.
Schnittstellen-Absprache:
gram.asc sieht auszugsweise prinzipiell so aus:
IF+
TH+E+N+
EL+S+E+
Kommentar zu gram.asc:
Die Reihenfolge der Regulaeren Ausdruecke ist wichtig, denn falls z.b.
im Programm
das Wort PROGRAM steht, dann soll es der Tokenklasse Program zugeordnet
werden
und nicht der Tokenklasse Identifier, obwohl auch diese das Wort akzeptiert.
Darum
ist der regulaere Ausdruck, der die Identifikatoren beschreibt, ganz
zum Schluss.
comment.txt so:
kommentaranfang: **
kommentarende. **
DEA.OUT sieht teilweise folgendermassen aus:
anzahl_der_zustaende: 100
anzahl_der_endzustaende: 45
40 1
20 2
...
12 34
anzahl_der_abbildungen: 1200
0 40 1
...
45 100 3
Kommentar zu DEA.OUT
Die Pärchen geben an, welcher Endzustand welcher Tokenklasse zugeordnet
wird.
z.b. : Zustandsnummer 40 wird der Tokenklasse 1 zugeordnet usw.
Die 3er Tupel beschreiben die Zustandsuebergangsfunktionen:
0 40 1 bedeutet, dass von Zusatnd 0 zu Zustand 1 übergegangen
wird, wenn das
Zeichen mit dem ASCII-Wert 40 eingelesen wird.
Wir haben den ASCII-Wert genommen, da wir glauben, so weniger
Probleme mit
Sonderzeichen für andere Grammatiken als MML zu haben.
Die obigen Daten werden durch schreibe eingelesen und entsprechend in
mms_scanner.c
ausgegeben.
Beschreibung des SCANNER-Programmes:
Die Daten wie Zustände, Ableitunsfunktionen sind als Konstanten
vordeffiniert.
Dies hat das Programm schreibe gemacht.
SCANNER liest eine Zeile aus dem zu scannenden Programm ein.
Dann wird entsprechend der Ableitungsregeln versucht in einen anderen
Zustand zu kommen, in dem Buchstabe fuer Buchstabe durchgegangen wird
und entsprechend die Ableitungsregeln angewendet werden. Wenn der erreichte
Zustand ein Endzustand ist, dann wird die Länge des bisher
akzeptierten Wortes gespeichert, solange bis keine Zustandsänderung
statt findet.
Wenn die Länge > 0 ist, dann wird entsprechend des Endzustandes
die
Tokenklasse, der Ausdruck und Zeile, Spalte asugegeben. Wenn die Länge
0 ist,
dann ist wohl ein Fehler aufgetreten und dieses wird dann ausgegeben.
Tokenstrom:
Der Tokenstrom, der von dem Scanner erzeugt wird, sieht beispielsweise
folgendermassen aus:
14 DO 61 4
2 BEGIN 61 7
23 OUT 61 13
32 ( 61 16
39 A 61 17
35 [ 61 18
39 N 61 19
36 ] 61 20
33 ) 61 21
28 ; 61 22
39 N 61 23
31 : 61 24
34 = 61 25
39 N 61 26
26 + 61 27