brainfuck解释器的状态图表

时间:2012-12-18 09:25:56

标签: algorithm uml interpreter brainfuck statechart

我已经写了一个关于brainfuck ide的alpha版本。我写了自己的翻译,虽然我得到了老师关于代码循环的大量帮助,因为我很难用“IT方式”理解它。现在,对于我的报告,我需要一个解释器算法的状态图表,他如何处理每个字符。

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

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

1)你不需要状态图,因为你的编译器没有状态(只有内存,内存指针和代码指针,可能还有两个用于查找匹配的括号) - 像wikipedia (german like your variable names)这样的简单表格会够了

2)如果您坚持使用状态图,请不要将条件(如code[codeZeiger]=='+')置于状态但是应用于转换

3)i必须更改为codeZeiger

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