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.