ant_language provides :
- A compiler for a simple educative language :
Ant
.Ant
language aims at teaching basic compilation skills.- Based on
ocamllex
andocamlyacc
. - Outputs a custom assembly code.
- A virtual machine
antvm.html
:- Written in very vanilla
javascript
. - Runs the custom assembly code.
- Written in very vanilla
Test the virtual machine at : https://3r10.github.io/Ant-language/antvm/antvm.html
Ant
language is inspired by Langton's ant :
https://en.wikipedia.org/wiki/Langton%27s_ant
It provides several primitives (paint
, pick
, move
, turn
, ...) that allow
to control a single ant on a pixel map.
The custom assembly code is based on a machine with an infinite number of registers.
./make_all.sh
./make_samples.sh
./antcc < file.ant > file.s
The destination file contains :
- An abstract syntax tree in ASCII format.
- The assembly code itself to be run on the virtual machine
antvm.html
<top>::= <statement_eol>* EOF
<statement_eol>::=
| EOL
| <statement> EOL
<statement>::=
| ID := <expression>
| ID @ <value>
| if <condition> then EOL <statements_eol>* end
| if <condition> then EOL <statements_eol>* else EOL <statements_eol>* end
| while <condition> do EOL <statements_eol>* end
| for ID in <expression>:<expression>:<expression> do EOL <statements_eol>* end
<condition>::=
| <expression> == <expression>
| <expression> != <expression>
| <expression> >= <expression>
| <expression> <= <expression>
| <expression> > <expression>
| <expression> < <expression>
<expression>:
| <value>
| - <value>
| <expression> + <value>
| <expression> - <value>
<value>:
| INT
| ID
Langton's ant
right := -1
left := 1
for step in 1:1:30000 do
pick @ color
if color==0 then
turn @ right
paint @ 1
else
turn @ left
paint @ 0
end
move @ 1
end
Other examples
See .ant
files in the samples
directory for some other examples.
This custom assembly code is based on a machine with an infinite number of
registers r0
, r1
, r2
...
Immediate values are indicated with a #
.
In the following instructions :
<name>
parameter should be a valid name[a-zA-Z_][a-zA-Z0-9_]*
- value parameters (i.e.
<value>
,value1
,value2
) may be either an immediate value#...
or a register contentr...
. <dest>
is the destination register number.
Instructions :
label <name>
: sets a label with unique name<name>
.goto <name> <value>
: instruction pointer will be set tolabel <name>
iff<value>
is 0call <name> <value>
: calls the function<name>
with the parameter<value>
(if the function is a getter)call <name> r<dest>
: calls the function<name>
and puts its result in register<dest>
(if the function is a setter)stop
: stops the machine
function <name>
should be one of the predefined external functions (see infra)
set r<dest> <value>
: sets register<dest>
with a value.add r<dest> <value1> <value2>
: sets register<dest>
with the sum of 2 values.sub r<dest> <value1> <value2>
: sets register<dest>
with the differences between 2 values.test_eq r<dest> <value1> <value2>
: sets register<dest>
to1
iff the 2 values are equal, else to0
.test_ne r<dest> <value1> <value2>
: sets register<dest>
to1
iff the 2 values are different, else to0
.test_ge r<dest> <value1> <value2>
: sets register<dest>
to1
iff the<value1>
is greater or equal to<value2>
, else to0
.test_gt r<dest> <value1> <value2>
: sets register<dest>
to1
iff the<value1>
is greater than<value2>
, else to0
.test_le r<dest> <value1> <value2>
: sets register<dest>
to1
iff the<value1>
is less or equal to<value2>
, else to0
.test_lt r<dest> <value1> <value2>
: sets register<dest>
to1
iff the<value1>
is less than<value2>
, else to0
.
Getters :
call paint <value>
: paints current ant's cell with color<value>
.call move <value>
: makes<value>
steps in current direction.call turn <value>
: turns<value>
times 90° to the left.
Setters :
call random r<dest>
: puts a random bit (either0
or1
) in register<dest>
call pick r<dest>
: puts the current color in register<dest>
You can run the examples with : https://3r10.github.io/Ant-language/antvm/antvm.html
Langton's ant (compiled from code above)
label start
set r0 #1
sub r0 #0 r0
set r1 r0
set r2 #1
set r3 r2
set r5 #1
set r6 #1
set r7 #30000
set r4 r5
label cond0
test_le r8 r4 r7
goto end0 r8
call pick r9
set r10 r9
set r11 #0
test_eq r12 r10 r11
goto else1 r12
call turn r1
call paint #1
goto end1 #0
label else1
call turn r3
call paint #0
label end1
call move #1
add r4 r4 r6
goto cond0 #0
label end0
stop
Other examples
See .s
files in the samples
directory for some other examples.