brainfuck解释器的实现(一)
Brainfuck,是一种极小化的,符合图灵完全思想的编程语言。更多资料Brainfuck
这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
开始实现(使用nim): 1 . 读取输入的代码
1import os
2
3let code = if paramCount() > 0: readFile paramStr(1)
4 else: readAll stdin
2 . 创建初始值为0的数组,并初始一个指向它的指针
1var
2 tape: seq[char] = newSeq[char]()
3 codePos: int = 0
4 tapePos: int = 0
3 . 根据输入来做相应操作
1case code[codePos]
2of '+': inc tape[tapePos]
3of '-': dec tape[tapePos]
4of '>': inc tapePos
5of '<': dec tapePos
6of '.': stdout.write tape[tapePos]
7of ',': tape[tapePos] = stdin.readChar
8else: discard
4 . 处理“[”跟“]”
1if code[codePos] == '[':
2 inc codePos
3 let oldPos = codePos
4 while run(tape[tapePos] == '\0'):
5 codePos = oldPos
6elif code[codePos] == ']':
7 return tape[tapePos] != '\0'
至此,解释器完成,但是处理速度相当慢…
完整代码如下:
1import os
2
3let code = if paramCount() > 0: readFile paramStr(1)
4 else: readAll stdin
5
6var
7 tape: seq[char] = newSeq[char]()
8 codePos: int = 0
9 tapePos: int = 0
10
11proc run(skip = false): bool =
12 # echo "codePos: ", codePos, " tapePos:", tapePos
13 while tapePos >= 0 and codePos < code.len:
14 if tapePos >= tape.len:
15 tape.add '\0'
16 if code[codePos] == '[':
17 inc codePos
18 let oldPos = codePos
19 while run(tape[tapePos] == '\0'):
20 codePos = oldPos
21 elif code[codePos] == ']':
22 return tape[tapePos] != '\0'
23 elif not skip:
24 case code[codePos]
25 of '+': inc tape[tapePos]
26 of '-': dec tape[tapePos]
27 of '>': inc tapePos
28 of '<': dec tapePos
29 of '.': stdout.write tape[tapePos]
30 of ',': tape[tapePos] = stdin.readChar
31 else: discard
32
33 inc codePos
34
35discard run()