Add documentation

This commit is contained in:
Juhani Krekelä 2018-05-22 19:39:48 +03:00
parent aa34ac6470
commit fb50e68e85
3 changed files with 122 additions and 0 deletions

12
brainfuck.md Normal file
View File

@ -0,0 +1,12 @@
Commands
--------
Gir brainfuck has only the base 8 commands `+-<>[].,`
Tape
----
Gir's tape is unbounded in both directions and made out of unsigned 8-bit
cells that wrap around
IO
--
`.` and `,` operate on a utf-8 stream. `,` produces `0` on EOF

72
ir.md Normal file
View File

@ -0,0 +1,72 @@
Gir uses two types of IR, with and without offsets
Without offsets
---------------
This is produced by `parse`. Each subsection shows the properties the
command object of that type has in IR without offsets
### add
type | `add`
value | The number to add to current cell
Generated on `+` and `-`
### moveHead
type | `moveHead`
value | The number of steps to move the tape head right
Generated on `<` and `>`
### writeByte
type | `writeByte`
Generated on `.`
### readByte
type | `readByte`
Generated on `,`
### loop
type | `loop`
contents | An array of the commands making up the loop body
Generated on `[`…`]`
### clear
type | `clear`
Not generated by the parser directly, but generated by optimizations
With offsets
------------
This is produced by the optimization pass `addOffsetProperties`. Each
subsection shows the properties the command object of that type has in IR
with offsets
### add
type | `add`
value | The number to add to the cell
offfset | The location of the cell relative to current tape position
### moveHead
type | `moveHead`
value | The number of steps to move the tape head right
### writeByte
type | `writeByte`
offset | The location of the cell relative to current tape position
### readByte
type | `readByte`
offset | The location of the cell relative to current tape position
### loop
type | `loop`
contents | An array of the commands making up the loop body
isBalanced | Whether execution of the loop body ends in same cell it started in
### clear
type | `clear`
offset | The location of the cell relative to current tape position

38
optimizations.md Normal file
View File

@ -0,0 +1,38 @@
Gir has three optimization passes.
joinAdjacentOps
---------------
consumes | commands without offsets
produces | commands without offsets
unknown commands | passed through unmodified
acts on | `moveHead`, `add`
`joinAdjacentOps` joins adjacent `moveHead`s and `add`s together. Normally
`parse` joins runs of `<>` or `+-` into one command, but if the runs are
interrupted by another character two commands get generated. `moveHead`s are
joined first, before the pass goes over the generated commands again and
joins `add`s.
transformClearLoops
-------------------
consumes | commands without offsets
produces | commands without offsets
unknown commands | passed through unmodified
acts on | `loop` with one command, which is `add 1` or `add -1`
`transformClearLoops` changes loops of the form `[-]` or `[+]` into a single
`clear` command.
addOffsetProperties
-------------------
consumes | commands without offsets
produces | commands with offsets
unknown commands | raise UnknownIRError
acts on | `moveHead`, `add`, `clear`, `writeByte`, `readByte`, `loop`
`addOffsetProperties` adds an `offset` property to `add`, `clear`,
`writeByte`, and `readByte`. The `offset` tells the offset at which from the
current tape head location the operations are performed. It also adds an
`isBalanced` property to loops. This property tells if execution of loop
body ends at the same cell where it began, which is useful for performing
further optimizations.