The L₃ compiler
Introduction
This directory contains the source code of the L₃ compiler, written in Scala. All interactions with the compiler should be done through sbt, a Scala build tool.
Sbt
can either be run in interactive mode, by simply typing sbt
and then entering commands at the prompt, or in batch mode. The following sections use batch mode for illustration, but in practice interactive mode is often to be preferred as it avoids repeated startup of sbt
itself.
Compiling
To compile the compiler, use the compile
command:
$ sbt compile
(the dollar sign $
represents the shell prompt and should not be typed).
Testing
To test the compiler (and compile it beforehand, if necessary), use the test
command:
$ sbt test
Running
To run the compiler (and compile it beforehand, if necessary), use the run
command, followed by arguments for the compiler, e.g.:
$ sbt 'run ../library/lib.l3m ../examples/queens.l3'
The compiler accepts a list of files to compile as arguments. These files can have one of the following extensions:
-
.l3
- A normal source file, containing L₃ code.
-
.l3m
- A module file, containing a list of other files, which must also be either source files (with a
.l3
extension) or other module files (with a.l3m
extension).
Modules are expanded recursively, until only .l3
files remain. Then, duplicate file names are removed, with only the first occurrence kept. Finally, this list of files is fed to the compiler.
As an example, assume that the file lib.l3m
references characters.l3m
and integers.l3m
, and that characters.l3m
references characters.l3
while integers.l3m
references both characters.l3m
and integers.l3
. Then, a command line consisting of lib.l3m
and helloworld.l3
is expanded as follows:
lib.l3m
helloworld.l3
(original command line),characters.l3m
integers.l3m
helloworld.l3
(expansion oflib.l3m
),characters.l3
characters.l3m
integers.l3
helloworld.l3
(expansion ofcharacters.l3m
andintegers.l3m
),characters.l3
characters.l3
integers.l3
helloworld.l3
(expansion of the secondcharacters.l3m
),characters.l3
integers.l3
helloworld.l3
(removal of duplicates).