首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Brainfuck解释器问题

Brainfuck解释器问题
EN

Stack Overflow用户
提问于 2016-09-22 12:11:12
回答 1查看 212关注 0票数 1

我是C的新手,目前我正试着写一个Brainfuck翻译。到目前为止我已经试过了。

代码语言:javascript
复制
#include <unistd.h>
#include <stdlib.h>

char    *line;
int     curr_pos;

void    interprete(char *coms)
{
    int a;
    int curr_loop;

    a = -1;
    curr_loop = 0;
    while (line[++a])
        line[a] = 0;
    a = -1;
    while (coms[++a])
    {
        if (coms[a] == '+')
            line[curr_pos]++;
        else if (coms[a] == '-')
            line[curr_pos]--;
        else if (coms[a] == '>')
            curr_pos++;
        else if (coms[a] == '<')
            curr_pos--;
        else if (coms[a] == '.')
            write(1, &line[curr_pos], 1);
        else if (coms[a] == '[')
        {
            if (line[curr_pos])
                curr_pos++;
            else
            {
                curr_loop = 1;
                while (curr_loop)
                {
                    ++a;
                    if (coms[a] == '[')
                        curr_loop++;
                    else if (coms[a] == ']')
                        curr_loop--;
                }
            }
        }
        else if (coms[a] == ']')
        {
            if (line[curr_pos])
            {
                curr_loop = 1;
                while (curr_loop)
                {
                    --a;
                    if (coms[a] == '[')
                        curr_loop--;
                    else if (coms[a] == ']')
                        curr_loop++;
                }
            }
            else
                curr_pos++;
        }
    }
}

int main(int ac, char **av)
{
    if (ac == 2)
    {
        curr_pos = 0;
        line = malloc(sizeof(char) * 4096);
        interprete(av[1]);
    }
    write(1, "\n", 1);
}

它只在没有循环("“和"").When的情况下工作,我尝试:

代码语言:javascript
复制
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

它给了我输出

代码语言:javascript
复制
^B^A^H^H^K^B^Q^K^N^H^@^C^@

预期产出:

代码语言:javascript
复制
Hello World!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 15:37:07

我猜问题出现在以下代码块中:

代码语言:javascript
复制
else if (coms[a] == '[')
{
    ...
}
else if (coms[a] == ']')
{
    ...
}

该程序正在寻找另一个括号(并找到它),但是您的代码指针在while-statement中还会增加(第17行)。因此,在搜索循环之后,您必须通过a减少1。第二个问题是,增加数据指针(curr_pos)。

如果com[a] == '['line[curr_pos] != 0

如果com[a] == ']'line[curr_pos] == 0

您必须增加代码指针(a),这仍然是在while-statement中自动递增的。所以实际上你必须通过这个案子。最后,如果当前单元格值不等于零,实际上不必检查两个括号。我建议的代码如下所示:

代码语言:javascript
复制
else if (coms[a] == '[')
{
    if (!line[curr_pos])
    {
        curr_loop = 1;
        while (curr_loop)
        {
            ++a;
            if (coms[a] == '[')
                cur_loop++;
            else if (coms[a] == ']')
                cur_loop--;
        }
        a--;
    }
}
else if (coms[a] == ']')
{
    // You can always jump back to the opening bracket '['
    // because then the program checks again and jumps behind
    // the closing bracket if line[a] != 0
    curr_loop = 1;
    while (curr_loop)
    {
        --a;
        if (coms[a] == '[')
            curr_loop--;
        else if (coms[a] == ']')
            curr_loop++;
    }
    a--;
}

顺便提一句:尝试实现‘,’-命令。它使brainfuck程序变得更有趣;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39638714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档