隨筆 - 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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 榆林市| 鄱阳县| 海口市| 乌拉特中旗| 安顺市| 福鼎市| 乐亭县| 原阳县| 宜兰市| 客服| 肥城市| 阜新| 滨海县| 太康县| 蓬安县| 东乡族自治县| 从江县| 平定县| 农安县| 原阳县| 郑州市| 蚌埠市| 宣化县| 略阳县| 筠连县| 嵊州市| 利辛县| 德化县| 田阳县| 根河市| 四子王旗| 施甸县| 平潭县| 青海省| 磐石市| 沁阳市| 芦山县| 札达县| 河北区| 保靖县| 措美县|