4

我写了一个brainfuck ide的alpha版本。我编写了自己的解释器,尽管我的老师在代码中的循环方面提供了很多帮助,因为我很难以“IT 方式”理解它。现在对于我的报告,我需要解释器算法的状态图,他如何处理每个字符。

我想出了下图,唯一缺少的是解释器如何处理循环。我看了老师几乎自己写的代码,但我不明白。我希望你能在这里指出我正确的方向,我不想要一个完整的答案,只是一些旁注在代码中遇到 [ 或 ] 时正在做什么。

在此处输入图像描述

codeZeiger = codePointer(在代码中移动的指针)
memoryZeiger = memoryPointer(在内存堆栈中移动的指针)
memory = 内存堆栈
code = 作为字符串的代码 oject
i = interpre() 方法的计数器(单个字符从字符串中读取,然后通过 switch 语句进行解析,其状态图如下所示)

在此处输入图像描述

4

2 回答 2

4

您应该真正尝试了解循环机制。在brainfuck 中,循环用[and括起来]。这意味着如果满足某个条件,括号内的代码将执行并重新开始。例如:

1: [
2:   cmd1
3:   cmd2
4: ]
5: cmd3

第 1 行检查是否memory[memoryZeiger]等于 0。如果是,则跳转到第 5 行。如果不是,则执行 cmd1、cmd2 等直到第 4 行。如果您的解释器在第 4 行,它会自动跳转到第 1 行(或者它可以检查条件并进一步移动 - 但让我们保持简单并假设它跳转到第 1 行)。然后整个过程重新开始。

所以回答你关于状态图的问题。你需要这样的东西:

     _____________________________
    |   code[codeZeiger] == '['   |
     -----------------------------
            /                  \
           /                    \
memory[memoryZeiger] == 0       memory[memoryZeiger] != 0
          |                               |
   "go to matching ']'"               codeZeiger++

另一种情况]应该是等价的。

顺便说一句,“匹配]”很重要。这些括号可以嵌套!

于 2012-12-18T10:40:13.553 回答
3

1)您不需要状态图,因为您的编译器没有状态(只有内存、内存指针和代码指针,可能还有两个用于查找匹配的括号) - 像维基百科这样的简单表格(德语就像你的变量名)会足够

2)如果您坚持使用状态图,请不要将条件(如code[codeZeiger]=='+')放入状态,而是放入转换中

3)i必须改为codeZeiger改为

4)解释brainfuck的代码应该很简单。如果您不理解它,请阅读例如维基百科页面并尝试在没有软件的情况下解释那里给出的程序。让它在纸上运行:)

于 2012-12-18T11:10:22.797 回答