隨筆 - 67  文章 - 79  trackbacks - 0
          <2008年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          兩年前就認識了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)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 伊金霍洛旗| 五家渠市| 清徐县| 四会市| 永德县| 越西县| 金寨县| 本溪市| 海晏县| 泉州市| 阿克苏市| 武隆县| 遵化市| 青田县| 商城县| 德格县| 南江县| 西平县| 防城港市| 张掖市| 集安市| 乌审旗| 竹北市| 金门县| 定兴县| 东光县| 萨嘎县| 柳江县| 盐源县| 濮阳市| 金寨县| 观塘区| 四川省| 光泽县| 庆城县| 钦州市| 昌江| 呼玛县| 西青区| 常山县| 德昌县|