diff --git a/README.md b/README.md index d715710..0e464e3 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,6 @@ Gir supports following optimizations: TODO ---- -### gir.js -* Support for other types of EOF? - ### gir.html * Implement a UI diff --git a/brainfuck.md b/brainfuck.md index ee09196..5d55585 100644 --- a/brainfuck.md +++ b/brainfuck.md @@ -11,10 +11,13 @@ cells that wrap around IO -- -`.` and `,` operate on a utf-8 stream. `,` produces `0` on EOF +`.` and `,` operate on a utf-8 stream. `,` produces `0` by default on EOF. +This can be changed by passing a third parameter to newVM, where 0/-1 sets +the cell to that and null keeps it unchanged `:` produces a decimal representation of the current cell. `;` skips any space (U+20) characters in the input stream and then reads 1 or more ASCII digit (U+30 to U+39), clamps the number to the range [0, 255] and sets the -cell to it. If it can't read a digit and EOF has been reached it returns 0, -but if EOF hasn't been reached it raises an error flag and stops execution +cell to it. If it can't read a digit and EOF has been reached it produces an +EOF similarily to `,` (by default sets to 0, but can be changed), but if EOF +hasn't been reached it raises an error flag and stops execution diff --git a/gir.js b/gir.js index addf9e8..a5559c7 100644 --- a/gir.js +++ b/gir.js @@ -573,8 +573,10 @@ function optimize(parsed) { // Virtual machine // ------------------------------------------------------------------ -// ([flatCommandObject], [int]) → girVMState -function newVM(program, input) { +// ([flatCommandObject], [int], int/null) → girVMState +// onEof tells what to set the cell to in case of EOF, or if it null to keep +// the same value +function newVM(program, input, onEof = 0) { return { // Initial state for the machine program: program, @@ -584,7 +586,10 @@ function newVM(program, input) { tapeHead: 0, input: input, - output: [] + output: [], + + // Configuration + onEof: onEof }; } @@ -684,8 +689,15 @@ function runVM(state, maxCycles = null) { case readByte: // Have we reached EOF? if(input.length == 0) { - // Yes, return 0 - memory.set(index, 0); + // Yes + // If state.onEof is null, don't + // change the value + // If it's something else, set the + // cell to that + if(state.onEof !== null) { + memory.set(index, + state.onEof & 0xff); + } } else { // No, return character memory.set(index, input.shift()); @@ -765,9 +777,15 @@ function runVM(state, maxCycles = null) { 0); memory.set(index, number); } else if(input.length == 0) { - // No, but there was an EOF, so set - // the cell to 0 - memory.set(index, 0); + // No, but there was an EOF + // If state.onEof is null, don't + // change the value + // If it's something else, set the + // cell to that + if(state.onEof !== null) { + memory.set(index, + state.onEof & 0xff); + } } else { // No, and there wasn't an EOF, so // signal an error