Brain**** 在 C 中的实现

Brain**** implementation in C

我正在尝试 运行 一个 hello world 程序,其中包含我本周制作的 brainfuck 实现,但我得到了一个奇怪的输出。

这是我正在尝试 运行 的 hello world 文件。

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.------- 
-.>>+.>++.

我已经保存到hello.txt,正在程序的main函数中解析

输出为

1 -3 4 4 7 0 -1 7 10 4 -4 1 2

其中,当您添加 72 并转换为字符 时,得到

I E L L O H G O R L D I J

所以我似乎遗漏了一些东西,尽管它有点接近正确的解决方案。

不过我还是要深入一下结构,大致思路如下:

我们有两个 'tapes',一个要遵循的程序,我标记为 'parsed',它有一个指针 'attached' 指向它,还有一个要写入的空磁带,我标记为 'mem',它还有一个指向它的指针 'attached'。我们还有一个结构列表,可用于在括号位置之间跳转。

在main函数中,分为三个部分:首先我解析程序并将其存储在一个数组中。然后我 运行 通过这个解析和匹配括号,然后我开始 brainfuck 循环并将输出写入空数组,直到到达最后一个字符。

在 brainfuck 循环中,当我们找到一个括号时,我们 运行 通过对列表找到它的匹配项,然后跳转到那个位置。

可能有点笨拙,但我希望它有意义。

    #include <stdio.h>
    #include <stdlib.h>

    #define MAX 30000

    //input tape
    char parsed[MAX];
    char * ptr;

    //bracket matching
    struct bracketlinks{
        char * bracket_1;
        char * bracket_2;
    };
    struct bracketlinks * pairslist;
    int bracket_count;

    //output tape
    char mem[MAX] = {0};
    int * mptr;

    int main(){
        mptr = malloc(sizeof(int));

        //parse text file and make list of tokens
        FILE * parsecode;
        parsecode = fopen("helloworldbf.txt", "r");
        int count = 0;
        char buffer;
        while(!feof(parsecode)){
            buffer = fgetc(parsecode);
            if(buffer == 10){break;}
            if(buffer == 32){continue;}
            else{
                parsed[count] = buffer;
                if(buffer == 91 || buffer == 93){
                    bracket_count++;
                }
                count++;
            }
        }
        fclose(parsecode);

        pairslist = malloc(bracket_count * sizeof(char*));

        //creates array of structures which match brackets so we can perform memory jumps
        int reset_count;
        int list_counter = 0;
        for(int i = 0; i < count; i++){
            if(parsed[i] == '['){
                reset_count = 0;
                for(int j = 0; j < count - i + 1; j++){
                    if(parsed[i + j] == '['){reset_count++;}
                    if(parsed[i + j] == ']'){reset_count--;}
                    if(reset_count == 0){
                        struct bracketlinks new;
                        new.bracket_1 = &parsed[i];
                        new.bracket_2 = &parsed[i + j];
                        pairslist[list_counter] = new;
                        list_counter++;
                        break;
                    }
                    else{continue;}
                } 
            }
            else{continue;}
        }

        //runs through the input tape and performs operations on the output tape
        ptr = parsed;
        char final_token = ptr[count];
        while(ptr[0] != final_token){
            if(ptr[0] == '['){
                if(mem[mptr[0]]){++ptr;}
                if(!mem[mptr[0]]){
                    for(int i = 0; i < bracket_count/2; i++){
                        if(pairslist[i].bracket_1 == &ptr[0]){
                            ptr = ++pairslist[i].bracket_2;
                        }
                        if(pairslist[i].bracket_2 == &ptr[0]){
                            ptr = ++pairslist[i].bracket_1;
                        }
                        else{continue;}
                    }
                }
            }
            if(ptr[0] == ']'){
                if(!mem[mptr[0]]){
                    for(int i = 0; i < bracket_count/2; i++){
                        if(pairslist[i].bracket_1 == &ptr[0]){
                            ptr = ++pairslist[i].bracket_2;
                        }
                        if(pairslist[i].bracket_2 == &ptr[0]){
                            ptr = ++pairslist[i].bracket_1;
                        }
                        else{continue;}
                    }
                }
                if(mem[mptr[0]]){++ptr;}
                else{continue;}
            }
            if(ptr[0] == '+'){++ptr;++mem[mptr[0]];}
            if(ptr[0] == '-'){++ptr;--mem[mptr[0]];}
            if(ptr[0] == '>'){++ptr; mptr[0]++;}
            if(ptr[0] == '<'){mptr[0]--;++ptr;}
            if(ptr[0] == '.'){++ptr; printf("%c %d \n", mem[mptr[0]] + 72, mem[mptr[0]]);}
            else{continue;}
        }
        free(pairslist);
        free(mptr);
        return 0;
    }

如有任何帮助,我们将不胜感激,

干杯..

好的,这是对主要错误的修复:基本上只是切换感叹号,不要是一个麻木的人。

 if(ptr[0] == ']'){
            if(mem[mptr[0]]){
                for(int i = 0; i < bracket_count/2; i++){
                    if(pairslist[i].bracket_1 == &ptr[0]){
                        ptr = ++pairslist[i].bracket_2;
                    }
                    if(pairslist[i].bracket_2 == &ptr[0]){
                        ptr = ++pairslist[i].bracket_1;
                    }
                    else{continue;}
                }
            }
            if(!mem[mptr[0]]){++ptr;}
            else{continue;}
        }

仍在处理 !feof 的问题,但也会随之更新