-
-
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.