-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
81 lines (68 loc) · 3.25 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
Compilerbau (CB) - Programmieraufgabe CS2103
==================
Problemstellung
---------------
Programmierung des Codegenerators sowie gruendliches
Testen aller Module des Compilers im Zusammenspiel.
Vorgegebene Dateien
-------------------
README - die Beschreibung, die Sie gerade lesen
main.c - das Hauptprogramm des entstehenden Compilers
codegen.h - Interface zum Codegenerator
codegen.c - der Codegenerator: das ist Ihre Aufgabe
Aufgaben
--------
Zunaechst ein Hinweis: Der Code, den Ihr Compiler erzeugt, muss in
keiner Hinsicht so aussehen, wie der Code der Referenzimplementierung.
Sie duerfen sich zwar gerne diesen Code ansehen; versuchen Sie aber
nicht, unter allen Umstaenden gleichen Code zu erzeugen. Wichtigstes
Ziel in dieser Phase ist korrekter Code, d.h. Code, der genau das
Verhalten zeigt, das laut Sprachdefinition von ihm gefordert wird.
1. Programmieren Sie einen rekursiven Durchgang durch die abstrakte
Syntax. Sie koennen zur Vereinfachung der folgenden Aufgabenteile
an jedem besuchten Knoten einen kurzen String ausgeben, der den
Knotentyp benennt (in Postorder-Reihenfolge). Wenn Sie diesen als
Assembler-Kommentar (eingeleitet mit einem Semikolon) "tarnen",
kann Ihre Ausgabe sogar in der erzeugten Assembler-Ausgabedatei
stehen bleiben.
2. Ergaenzen Sie nun die Traversierungsfunktionen der einzelnen
Knotentypen um die Ausgabe von ECO32-Assemblercode. Entwerfen
Sie zunaechst jeweils ein ganz kurzes SPL-Programm, das den
ins Auge gefassten Knotentyp beim Uebersetzen produziert (so
etwas sollte eigentlich aus Loesungen zu frueher gestellten
Aufgaben schon zur Verfuegung stehen). Programmieren Sie dann
die Codegenerierung fuer diesen Knotentyp. Pruefen Sie zuletzt,
ob der erzeugte Code fuer Ihr SPL-Programm korrekt ist.
Hier ist ein Vorschlag fuer die Reihenfolge der Knotentypen:
- StmList (ausser dem rekursiven Abstieg ist hier nichts zu tun)
- IntExp
- OpExp (nur Arithmetik, keine Vergleiche)
- SimpleVar (ohne Beruecksichtigung von Referenzvariablen)
- VarExp
- AssignStm
- ArrayVar (nicht vergessen: Indexgrenzen-Ueberpruefung, s.u.)
- WhileStm
- OpExp (nur Vergleiche, keine Arithmetik)
- IfStm
- CallStm (ohne Beruecksichtigung von Referenzvariablen)
- ProcDec mit folgenden Teilaufgaben:
Framegroesse berechnen
Prozedur-Prolog ausgeben
Code fuer Prozedurkoerper erzeugen
Prozedur-Epilog ausgeben
Hinweise:
- Falls die Indexgrenzen-Ueberpruefung fehlschlaegt, lassen
Sie den Code zum Label "_indexError" verzweigen. Das ist eine
Bibliotheksfunktion, die das Programm mit einer Fehlermeldung
abbricht.
- Denken Sie an die Ueberpruefung, ob genuegend Register
fuer Hilfsvariable zur Verfuegung stehen. Brechen Sie die
Uebersetzung ggf. mit einer geeigneten Fehlermeldung ab.
3. Untersuchen Sie, an welcher Stelle ein Programm, das Referenz-
variablen benutzt, noch fehlerhaft ist. Ergaenzen Sie den Code-
generator so, dass auch SPL-Programme mit Referenzvariablen
richtig uebersetzt werden.
4. Ueberzeugen Sie sich von der Korrektheit des erzeugten Codes
fuer die etwas groesseren Testprogramme (Queens, Sierpinski,
Sortieren eines Arrays).
5. Glueckwunsch: Ihr SPL-Compiler ist fertig!