README.md 4.99 KB
Newer Older
1
2
3
4
# Curry Frontend
The Curry frontend parses source files (`.curry`), emits errors and
warnings, performs various checks and transformations and 
generates FlatCurry (`.fcy`, `.fint`) or AbstractCurry (`.acy`, `.uacy`).
5

6
7
The project originated from a modified version of the
Münster-Curry-Compiler (MCC) for use as a frontend in PAKCS.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
8

9
## 1 Installation
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
10

11
### 1.1 Installation der Binary-Distribution
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
12
13
14
15
16
17

Die Binary-Distribution befindet sich in einem tar-Archiv und wird
durch folgendes Kommando entpackt:

	tar zxvf <Distribution>.tar.gz

18
Danach steht der Compiler im Verzeichnis 'mcc' zur Verfügung.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
19

20
### 1.2 Installation der Source-Distribution
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
21
22
23
24
25
26

Nach dem Entpacken des tar-Archivs mittels

	tar zxvf <Distribution>.tar.gz

kann der Compiler durch Aufruf von 'make' im Verzeichnis 'mcc' installiert
27
28
werden. Bei Recompilierung (z.B. nach Änderungen in der Quelldateien)
wird empfohlen vor einer erneuten Installation 'make clean' auszuführen.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
29

30
31
Nach erfolgreicher Installation befindet sich in beiden Fällen im Verzeichnis 
'mcc/bin/' folgende ausführbare Datei:
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
32
33
34

	cymake		- der Curry-Programm-Builder

35
36
Dieses Tool übersetzt Curry-Programme unter Berücksichtigung der Import-
abhängigkeiten.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
37

38
## 2 Kommandoübersicht
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
39
40

In der folgenden Tabelle sind die Optionen zur Generierung der jeweiligen
41
Darstellungen für das Kommando 'cymake' aufgelistet:
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
42
43
44
45
46
47

	--flat		: Erzeugt FlatCurry- und FlatInterface-Datei
	--xml		: Erzeugt FlatXML-Datei
	--acy		: Erzeugt (typinferierte) AbstractCurry-Datei
	--uacy		: Erzeugt ungetypte AbstractCurry-Datei

48
## 3 Erzeugung von FlatCurry- und FlatXML-Programmen
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
49

50
Die Übersetzung eines Curry-Programms 'file.curry', sowie sämtlicher
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
51
52
53
54
55
56
57
58
59
importierter Module nach FlatCurry bzw. FlatInterface, bewirkt folgendes
Kommando:

	cymake --flat <filename>

Hierdurch werden die Dateien mit den entsprechenden Endungen ".fcy" und
".fint" generiert. Der Dateiname <filename> kann hierbei mit oder ohne 
Endung ".curry" bzw. ".lcurry" angegeben werden.

60
Die analogen Übersetzungen in die FlatXML-Darstellung bewirkt folgendes
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
61
62
63
64
65
66
Kommando:

	cymake --xml <file name>

Die hierdurch generierte Flat-XML-Datei hat die Endung '_flat.xml'.

67
## 4 Erzeugung von AbstractCurry-Programmen
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
68

69
Die Übersetzung eines Curry-Programms 'file.curry' nach (typgeprüftem)
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
AbstractCurry bewirkt folgendes Kommando:

	cymake --acy <filename>

Hierdurch wird die entsprechende Datei (mit der Endung ".acy") generiert.
Der Dateiname <filename> kann hierbei mit oder ohne Endung ".curry" bzw.
".lcurry" angegeben werden.

Ungetypte, bzw. typsignierte AbstractCurry-Programme werden mit folgendem
Kommando generiert:

	cymake --uacy <filename>

Die hierdurch generierte Datei besitzt die Endung ".uacy".

Die Generierung des ungetypten AbstractCurry-Programms findet ohne
86
Typüberprüfung statt (d.h. auch Programme mit Typfehlern werden übersetzt).
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
87
88
89
Alle Funktionen besitzen entweder die im Quellprogramm angegebenen Typsignatur,
oder, sofern diese nicht vorhanden ist, den Dummy-Typ "prelude.untyped".

90
91
92
93
In beiden Fällen werden für die Übersetzung FlatCurry-Dateien 
für alle importierten Module erzeugt. Dies ist notwendig, da die 
entsprechenden Interfaces für die Typinferenz (nur im Fall der getypten 
AbstractCurry-Generierung) und die statisch-semantische Analyse benötigt 
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
94
95
werden.

96
## 5 Anmerkungen
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
97

98
99
- Um die PAKCS-Bibliotheken (insbesondere die Prelude) für Übersetzungen 
  nutzen zu können muß die Umgebungsvariable 'PAKCS_LIB' auf die
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
100
101
102
103
104
  entsprechenden Pfade verweisen, z.B. mittels

	export PAKCS_LIB=<pakcs path>/pacs/lib:<pakcs path>/pacs/lib/meta:...

  wobei <pakcs path> das Verzeichnis ist, das die PAKCS-Distribution
105
  enthält.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
106
107
108
109
110
111
112

- Im Gegensatz zu PAKCS erlaubt das Frontend die Verwendung anonymer
  Variablen (dargestellt durch dem Unterstrich '_') in Typdeklarationen,
  z.B.

	data T _ = C

113
## Bekannte Probleme
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
114

115
116
- Lambda-, do-, if-, case-, oder let-Ausdrücke, die in Argumenten von
  Funktionsaufrufen verwendet werden, müssen immer geklammert werden.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
117

118
- 'let'-Anweisungen dürfen nicht folgendes Layout besitzen:
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
119
120
121
122

           let x = <expr>
               in ...

123
- Die Regeln einer Funktionsdeklaration müssen immer zusammenstehen, d.h.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
124
125
  nicht durch andere Deklarationen unterbrochen werden.

126
127
- Es ist bislang nicht möglich, den Konstruktor für leere Listen [], sowie 
  den Unit-Konstruktor () zu qualifizieren (z.B. führt 'prelude.[]' zu 
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
128
129
130
  einem Fehler). Der Listenkonstruktor (:), sowie Tupel-Konstruktoren
  dagegen sind qualifizierbar.

131
- FlatXML-Übersetzungen können derzeit mittels der Funktionen aus dem
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
132
133
134
  PAKCS-Modul "FlatXML" noch nicht eingelesen werden, da es Unstimmigkeiten
  zwischen dem generierten und den erforderlichen Formaten gibt.

135
136
137
- Bei der Erzeugung von typgeprüftem AbstractCurry können die im Quelltext
  verwendeten Bezeichner für Typvariablen nicht ins AbstractCurry-Programm
  übernommen werden. Stattdessen generiert der Übersetzer neue
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
138
139
140
141
142
143
  Bezeichner.

- Bei der Erzeugung von ungetyptem AbstractCurry werden Typsynonyme in
  Typsignaturen von Funktionen nicht dereferenziert.

- Das Frontend gibt derzeit noch keinerlei Warnungen aus.