README.md 4.43 KB
Newer Older
1
# Curry Frontend
2

3
4
The Curry frontend parses source files (`.curry`), emits errors and
warnings, performs various checks and transformations and 
5
generates FlatCurry (`.fcy`, `.fint`) or AbstractCurry (`.acy`, `.uacy`) amonst other formats.
6

7
8
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
9

10
## Requirements
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
11

12
13
* `cabal-install`
* A recent version of the `curry-base` package, installed locally
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
14

15
## Building
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
16

17
To build the project, run
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
18

19
> cabal v1-build
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
20

21
## Running
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
22

23
To run the project, you can use
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
24

25
> cabal v1-run
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
26

27
Alternatively, you can launch the built executable manually from `dist/build/curry-frontend`.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
28

29
## Usage
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
30

31
For a detailed overview of the available options, you can use:
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
32

33
> curry-frontend --help
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
34

35
### Available Formats
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
36

37
38
39
40
41
42
```
--flat  : Generate a FlatCurry and FlatInterface file
--xml   : Generate a FlatXML file
--acy   : Generate a (type-inferred) AbstractCurry file
--uacy  : Generate an untyped AbstractCurry file
```
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
43

44
#### Generation of FlatCurry and FlatXML files
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
45

46
Die Übersetzung eines Curry-Programms 'file.curry', sowie sämtlicher
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
47
48
49
50
51
52
53
54
55
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.

56
Die analogen Übersetzungen in die FlatXML-Darstellung bewirkt folgendes
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
57
58
59
60
61
62
Kommando:

	cymake --xml <file name>

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

63
#### Generation of AbstractCurry files
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
64

65
Die Übersetzung eines Curry-Programms 'file.curry' nach (typgeprüftem)
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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
82
Typüberprüfung statt (d.h. auch Programme mit Typfehlern werden übersetzt).
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
83
84
85
Alle Funktionen besitzen entweder die im Quellprogramm angegebenen Typsignatur,
oder, sofern diese nicht vorhanden ist, den Dummy-Typ "prelude.untyped".

86
87
88
89
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
90
91
werden.

92
## Remarks
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
93

94
95
- 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
96
97
98
99
100
  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
101
  enthält.
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
102
103
104
105
106
107
108

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

	data T _ = C

109
## Known Issues
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
110

111
112
- 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
113

114
- 'let'-Anweisungen dürfen nicht folgendes Layout besitzen:
Bjoern Peemoeller's avatar
Bjoern Peemoeller committed
115
116
117
118

           let x = <expr>
               in ...

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

122
123
- 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
124
125
126
  einem Fehler). Der Listenkonstruktor (:), sowie Tupel-Konstruktoren
  dagegen sind qualifizierbar.

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

131
132
133
- 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
134
135
136
137
138
139
  Bezeichner.

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

- Das Frontend gibt derzeit noch keinerlei Warnungen aus.