Initial commit

This commit is contained in:
Random936 2024-12-01 15:54:04 -08:00
commit 7ed58a61b2
6 changed files with 68 additions and 0 deletions

6
Makefile Normal file
View File

@ -0,0 +1,6 @@
SRC_Files=$(wildcard src/*.c)
CC=clang
CF=-Wall -g
install:
$(CC) $(CF) $(SRC_Files) -o brainfuck

BIN
brainfuck Normal file

Binary file not shown.

1
examples/helloworld.bf Normal file
View File

@ -0,0 +1 @@
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

3
rules.txt Normal file
View File

@ -0,0 +1,3 @@
INST = + | - | < | > | . | , | LOOP
LOOP = [INST]

57
src/main.c Normal file
View File

@ -0,0 +1,57 @@
#include <stdio.h>
#include <stdlib.h>
unsigned char cells[1024];
unsigned char *ptr = cells;
void error(char c) {
fprintf(stderr, "ERROR: Unexpected token, %c\n", c);
exit(1);
}
char *parse(char *src) {
char *start = src;
while (*src != '\0') {
switch (*src) {
case 0: return NULL;
case '.': printf("%c", (*ptr)); break;
case ',': *ptr = getc(stdin); break;
case '+': (*ptr)++; break;
case '-': (*ptr)--; break;
case '>': ptr++; break;
case '<': ptr--; break;
case '[': src = parse(++src); break;
case ']':
if (*ptr == 0) return src;
src = start;
continue;
}
src++;
}
return NULL;
}
int main(int argc, char *argv[]) {
if (argc != 2) return 1;
FILE *file = fopen(argv[1], "r");
if (!file) return 1;
fseek(file, 0, SEEK_END);
size_t size = ftell(file);
rewind(file);
char *src = malloc(size);
fread(src, 1, size, file);
if (parse(src) != NULL) {
error('[');
}
return 0;
}

1
test.bf Normal file
View File

@ -0,0 +1 @@
,.