<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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


    網站導航:
     
    主站蜘蛛池模板: 麻豆一区二区三区蜜桃免费| 在线观看免费无码视频| 亚洲精品成人片在线观看| 热久久这里是精品6免费观看| 久久精品国产亚洲AV无码麻豆| 性感美女视频免费网站午夜| 无码人妻一区二区三区免费视频| 国产亚洲精品岁国产微拍精品 | 一个人在线观看视频免费 | 一本无码人妻在中文字幕免费| 一边摸一边桶一边脱免费视频| 久久亚洲sm情趣捆绑调教| 国产小视频在线观看免费| 95免费观看体验区视频| 老司机午夜在线视频免费观| 亚洲一本综合久久| 亚洲成aⅴ人片久青草影院| 2021在线永久免费视频| 特级av毛片免费观看| 亚洲一区免费视频| 亚洲精品V欧洲精品V日韩精品| 午夜两性色视频免费网站| 四虎国产精品永久免费网址| 在线观看国产一区亚洲bd| 91午夜精品亚洲一区二区三区| 亚洲性猛交XXXX| 国产免费看插插插视频| 性做久久久久久免费观看| 无码人妻久久一区二区三区免费| 国产亚洲福利一区二区免费看| 亚洲国产精品久久网午夜 | 一区二区3区免费视频| 亚洲熟女综合色一区二区三区 | 中文字幕亚洲无线码| 国产乱色精品成人免费视频| 亚洲一区二区三区免费在线观看| 免费无码又爽又刺激一高潮| 免费看又黄又爽又猛的视频软件| 亚洲精品无码一区二区| 亚洲一区中文字幕在线电影网| 亚洲综合国产精品|