我已经写了一个关于brainfuck ide的alpha版本。我写了自己的翻译,虽然我得到了老师关于代码循环的大量帮助,因为我很难用“IT方式”理解它。现在,对于我的报告,我需要一个解释器算法的状态图表,他如何处理每个字符。
我提出了下面的图表,唯一缺少的是解释器如何处理循环。我看着老师几乎自己写的代码,但我不明白。我希望你能在这里指出我正确的方向,我不想要一个完整的答案,只需要注意在代码中遇到[或]时正在做的事情。
codeZeiger = codePointer(通过代码移动的指针)
memoryZeiger = memoryPointer(指针在内存堆栈中移动)
memory =内存堆栈
code =代码作为字符串对象
i = interpre()方法的计数器(从字符串中读取单个字符,然后通过switch语句解析,其状态图如下所示)
答案 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的代码应该非常简单。如果您不理解,请阅读维基百科页面,并尝试解释没有软件在那里给出的程序。让它在纸上运行:)