-
-
Save maxcountryman/1699708 to your computer and use it in GitHub Desktop.
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
// initialize the tape with 30,000 zeroes | |
unsigned char tape[30000] = {0}; | |
// set the pointer to point at the left-most cell of the tape | |
unsigned char* ptr = tape; | |
void interpret(char* input) { | |
char current_char; | |
size_t i; | |
size_t loop; | |
for (i = 0; input[i] != 0; i++) { | |
current_char = input[i]; | |
if (current_char == '>') { | |
++ptr; | |
} else if (current_char == '<') { | |
--ptr; | |
} else if (current_char == '+') { | |
++*ptr; | |
} else if (current_char == '-') { | |
--*ptr; | |
} else if (current_char == '.' ) { | |
putchar(*ptr); | |
} else if (current_char == ',') { | |
*ptr = getchar(); | |
} else if (current_char == '[') { | |
continue; | |
} else if (current_char == ']' && *ptr) { | |
loop = 1; | |
while (loop > 0) { | |
current_char = input[--i]; | |
if (current_char == '[') { | |
loop--; | |
} else if (current_char == ']') { | |
loop++; | |
} | |
} | |
} | |
} | |
} | |
int main() { | |
interpret(",[.[-],]"); // outputs input | |
return 0; | |
} |
Probably true, I haven't tried. Feel free to make edits and I'll be happy to update. :)
Updated version should now supported nested loops.
Awesome!
Also wrote one with dynamic memory allocation and trivial garbage collection: https://gist.github.com/1714336
I don't think that the '[' is right because the spec says [ Jump forward past the matching ] if the byte at the pointer is zero.
but you don't check ptr, you just continue, which turns []
into a do..while
instead of a while
. You can duplicate the body of the ']' case but preincrement i instead of predecrement it: current_char = input[++i];
and flip the square brackets in the conditionals. Tested with Hello World with a [[[]]]
thrown in immediately after the first loop.
Why not turn the chain of if else if's into a single switch statement. would be much more readable.
Why not turn the chain of if else if's into a single switch statement. would be much more readable.
@TheSoftwareGuy that's debatable
@nickdesaulniers you are right, the implementation of [
is not correct
else if (current_char == '[' && *ptr == 0) { loop = 1; while (loop > 0) { current_char = input[++i]; if (current_char == '[') { loop++; } else if (current_char == ']') { loop--; } } }
this is a edit to make it actually work with the [
Hi @maxcountryman, just letting you know I used your code for personal work and did a little update of it, here is my gist.
Thanks for this :)
[ should branch
http://www.muppetlabs.com/~breadbox/bf/
Nice!
I'll borrow your code to create my own repository (I didn't figure out how to convert the gist => github repository, I'm still new here). Here is the link.
[ should branch http://www.muppetlabs.com/~breadbox/bf/
Indeed.
Did you use the tests on http://www.brainfuck.org/tests.b ?
I don't think this is a proper bf interpreter because it doesn't handle nested loops. You need to use a stack to store loop locations instead of just a variable.