<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)

    隨筆檔案

    文章檔案

    相冊(cè)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    兩年前就認(rèn)識(shí)了BrainFuck語(yǔ)言 當(dāng)時(shí)一笑而過(guò)
    今天看到CU上的C版斑竹的帖子,他作了個(gè)BrainFuck的自舉編譯器 。不知到各位看了他的bf代碼后感覺(jué)如何,我頓時(shí)即被他強(qiáng)烈的腦殘主意所感染,模仿他的c代碼 寫(xiě)個(gè)了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!

    當(dāng)然也可以試一下CU上的那段
    # Here is an example BF program
    #
    # +[>>+++++[<++++++>-]<[>++++[>++++++++<-]<[->+>.<<]>[-<+>]+++++
    # [>+++++<-]>+++.-.<+++[>------<-]>.---------.<+++++[>++++++<-]>
    # .--.[-]++++++++++.[-]<<-]>+++++[<++++++>-]>>[-]<<<[>++++[>++++
    # ++++<-]>>[<.>>+<-]>[-<+>]<+<<+++++[->++++++<]>.--.<++++[>-----
    # --<-]>.++++++++.<+++[>++++++<-]>.++++.[-]++++++++++.[-]<<-]<]

    下一個(gè)目標(biāo) 寫(xiě)Python版的編譯器

    以下抄自cu

    BrainFuck語(yǔ)言一共只有8個(gè)符號(hào)
    +-><.,[]
    brainfuck的程序全部都由這8個(gè)符號(hào)構(gòu)成
    初始化的時(shí)候,有一個(gè)連續(xù)的兩個(gè)方向都無(wú)限長(zhǎng)的內(nèi)存,內(nèi)存的每個(gè)字節(jié)值是0。
    有一個(gè)指針p,指向其中一個(gè)字節(jié)。
    每個(gè)符號(hào)的意義如下:
    +  指針指向的這個(gè)字節(jié)自加
    -   指針指向的這個(gè)字節(jié)自減
    >  指針向右移一個(gè)字節(jié)
    <  指針向左移一個(gè)字節(jié)
    .   輸出指針指向的這個(gè)字節(jié)
    ,   輸入這個(gè)字節(jié),存在指針指向的這個(gè)字節(jié)
    [   如果指針指向的這個(gè)字節(jié),則進(jìn)入循環(huán)節(jié)
    ]   回到匹配的[(比如[--.[++>.[+]---].-],^指著的兩個(gè)是匹配的])
                                   ^              ^
    posted on 2008-06-05 13:25 zarra 閱讀(196) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 性色午夜视频免费男人的天堂| 亚洲视频在线观看免费视频| 亚洲日韩中文无码久久| 久久一区二区三区免费播放| 亚洲 欧洲 自拍 另类 校园| 亚洲婷婷国产精品电影人久久| 99久久久国产精品免费牛牛 | 亚洲AV无码欧洲AV无码网站| 日韩在线播放全免费| 特级av毛片免费观看| 亚洲视频在线观看不卡| 在线a亚洲v天堂网2018| 1000部羞羞禁止免费观看视频| 美女黄色毛片免费看| 亚洲欧洲日本天天堂在线观看| 亚洲精品无码专区2| 亚洲免费福利在线视频| 人妻免费一区二区三区最新| 亚洲aⅴ无码专区在线观看春色| 亚洲丁香色婷婷综合欲色啪| 四虎影在线永久免费观看| 100部毛片免费全部播放完整| igao激情在线视频免费| 亚洲日韩精品国产一区二区三区| 亚洲视频精品在线| 亚洲男女内射在线播放| 香蕉视频在线观看免费国产婷婷| 久99久精品免费视频热77| 成年免费a级毛片| 亚洲一卡2卡三卡4卡无卡下载| 亚洲国语精品自产拍在线观看| 亚洲欧洲中文日韩av乱码| 男女交性永久免费视频播放| 在线观看永久免费| a在线观看免费视频| 免费又黄又爽又猛大片午夜| 亚洲精品伦理熟女国产一区二区| 亚洲欧洲日本天天堂在线观看| 亚洲国产精品国自产拍AV| 国产亚洲色视频在线| 亚洲国产成人精品女人久久久 |