Home

Awesome

Paskell

Build Status A (reduced) Pascal compiler in Haskell that compiles to LLVM

Features

Progress

Usage

Once the executable is built, it can be used to compile Pascal source files to llvm-ir, or internal IR used by the compiler:

paskell -c src compile to llvm-ir
paskell -c src dest compile to llvm-ir and save in dest
paskell -ir src produce internal IR
paskell -x src execute pascal source. Equivalent to paskell -c src | lli
paskell -h (for help)

Demo:

The compiler is complemented with the llvm utilities

$ paskell -c fib.pas fib.ll

Since the output is llvm-ir, we can leverage the many tools LLVM provide to:

Building

With docker
$ make bash

to build the compiler and launch a shell session where the compiler and llvm utitlies are in $PATH and ready out-of-the-box.

Alternatively
$ make build

will build the same image tagged paskell which can be used with docker run and volumes. For example:

$ docker run -v /path/to/original_file.pas:/path/to/file.pas paskell paskell -c /path/to/file.pas
Without docker

You need to have llvm installed

$ sudo apt-get install llvm-5.0

lli should be in $PATH to be able to execute Pascal programs

Then, you can use Cabal or Stack.
To build using Cabal:

$ cd Paskell/
$ cabal install -j

this will install all dependencies and produce an executable in dist/build/Paskell/

You can also build using Stack.

Tests

$ make test

to run the test suite using docker.

Implementation

This is a 4-pass compiler:

pass 1: lex/parsing
pass 2: type checking
pass 3: constructing IR: type-annotation, type resolution, (future: identifier-renaming, nested-function extraction)
pass 4: code generation

TODO

Contributions

Bug reports, added features, etc are welcome

References