Dokmentation zur Sacnner-Gruppe

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