兩年前就認識了BrainFuck語言 當時一笑而過
今天看到CU上的C版斑竹的
帖子,他作了個BrainFuck的自舉編譯器 。不知到各位看了他的bf代碼后感覺如何,我頓時即被他強烈的腦殘主意所感染,模仿他的c代碼 寫個了Python版本
#!/usr/bin/env python
import sys
class VM():
def __init__(self):
self.stack=[0 for i in range(256)]
self.stackLen=0;
self.pool=[ 0 for i in range(4096)]
self.pointer=0
self.currentInstructIndex=0
self.codeLen=0
self.code=''
def run(self,reader):
self.code=reader.read()
print "Run:",self.code
self.codeLen=len(self.code)
while self.currentInstructIndex<self.codeLen:
self.bfInterpreter(self.code[self.currentInstructIndex])
self.currentInstructIndex+=1
def dump(self,size=10):
pool=self.pool[:size]
stack=self.stack[:size]
print '============================================================================'
print 'pool',pool
print 'stack',stack
print 'CurrentInstructIndex:%d,%s'%(self.currentInstructIndex,self.code[self.currentInstructIndex])
def bfInterpreter(self,instruct):
if instruct=='+':
self.pool[self.pointer]+=1
elif instruct=='-':
self.pool[self.pointer]-=1
elif instruct=='>':
self.pointer+=1
elif instruct=='<':
self.pointer-=1
elif instruct=='.':
try:
sys.stdout.write(chr(self.pool[self.pointer]))
except:
print r"can't print:",self.pool[self.pointer]
elif instruct==',':
self.pool[self.pointer]=ord(sys.stdin.read())
elif instruct=='[':
if self.pool[self.pointer]!=0:
try:
self.stack[self.stackLen]=self.currentInstructIndex
self.stackLen+=1
except:
print self.stackLen
raise IndexError
else:
j=0;k=0
for k in range(self.currentInstructIndex,self.codeLen):
if self.code[k]=='[':
j+=1
if self.code[k]==']':
j-=1
if j==0:break
if j==0:
self.currentInstructIndex=k
else:
print 'Error'
return None
elif instruct==']':
self.stackLen-=1
self.currentInstructIndex=self.stack[self.stackLen]-1
if __name__=='__main__':
if len(sys.argv)<=1:
import StringIO
sample='++++++++++[>+++++++>++++++++++>+++>+\
<<<<-]>++.>+.+++++++..+++.>++.<<++++++++++++++\
+.>.+++.------.--------.>+.>.'
reader=StringIO.StringIO(sample)
else:
print 'Run file',sys.argv[1]
reader=open(sys.argv[1])
vm=VM()
vm.run(reader)
輸入如下代碼 ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
可以得到Hello World!
當然也可以試一下CU上的那段
# Here is an example BF program
#
# +[>>+++++[<++++++>-]<[>++++[>++++++++<-]<[->+>.<<]>[-<+>]+++++
# [>+++++<-]>+++.-.<+++[>------<-]>.---------.<+++++[>++++++<-]>
# .--.[-]++++++++++.[-]<<-]>+++++[<++++++>-]>>[-]<<<[>++++[>++++
# ++++<-]>>[<.>>+<-]>[-<+>]<+<<+++++[->++++++<]>.--.<++++[>-----
# --<-]>.++++++++.<+++[>++++++<-]>.++++.[-]++++++++++.[-]<<-]<]
下一個目標 寫Python版的編譯器
以下抄自cu
BrainFuck語言一共只有8個符號
+-><.,[]
brainfuck的程序全部都由這8個符號構成
初始化的時候,有一個連續的兩個方向都無限長的內存,內存的每個字節值是0。
有一個指針p,指向其中一個字節。
每個符號的意義如下:
+ 指針指向的這個字節自加
- 指針指向的這個字節自減
> 指針向右移一個字節
< 指針向左移一個字節
. 輸出指針指向的這個字節
, 輸入這個字節,存在指針指向的這個字節
[ 如果指針指向的這個字節,則進入循環節
] 回到匹配的[(比如[--.[++>.[+]---].-],^指著的兩個是匹配的])
^ ^
posted on 2008-06-05 13:25
zarra 閱讀(197)
評論(0) 編輯 收藏