zoukankan      html  css  js  c++  java
  • Brainfuck解析器(Python)

    global cs
    global ip
    
    global ss
    #global sp
    
    global ds
    global bp
    
    global tab
    global out
    
    cs='++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
    ip = 0
    
    ss = []
    #sp = 0
    
    ds = []
    bp = 0
    
    tab = 0
    out = []
    
    def tab_():
        i = tab
        stab = ''
        while i > 0:
            stab += '	'
            i -= 1
        return stab
    
    def push(var):
        global ss
        ss.append(var)
    
    def pop():
        global ss
        return ss.pop()
    
    def op_inc_val():
        global ip
        count = 0
        while True:
            op = cs[ip]            
            ip = ip + 1
            if op == '+':
                count = count + 1
            else:
                break
        l = len(ds)
        if l <= bp:
            ds.append(0)
        old = ds[bp]
        old += count
        ds[bp] = old
        print tab_()+'ds[%d] += %d                  (%d)'%(bp, count, old)
    
    def op_dec_val():
        global ip    
        count = 0
        while True:
            op = cs[ip]            
            ip = ip + 1
            if op == '-':
                count = count + 1
            else:
                break
        old = ds[bp]
        old -= count
        ds[bp] = old
        print tab_()+'ds[%d] -= %d                  (%d)'%(bp, count, old)
    
    def op_inc_dp():
        global bp
        bp = bp + 1
    
    def op_dec_dp():
        global bp
        bp = bp - 1
    
    def op_jmp_fwd():
        global tab
        global ip
        print tab_()+'while ds[%d]=%d:'%(bp, ds[bp])
        tab=tab + 1
        if ds[bp] != 0:
            curip = ip - 1
            push(curip)
        else:
            c = 1; 
            while c > 0:
                op = cs[ip]
                if op == '[':
                    c += 1
                elif op == ']':
                    c -= 1
                ip += 1
    
    def op_jmp_bck():
        global tab
        global ip
        tab = tab - 1
        if ds[bp] != 0:
            ip = pop()
    
    def op_out():
        print tab_()+'putchar(ds[%d])                  (%d)'%(bp, ds[bp])
        out.append(ds[bp])
    
    def op_in():
        print tab_()+'getchar'
    
    end = len(cs)
    while ip < end:
        op = cs[ip]
        ip = ip + 1
        if op == '+':
            ip = ip - 1
            op_inc_val()
            ip = ip - 1
        elif op == '-':
            ip = ip - 1
            op_dec_val()
            ip = ip - 1
        elif op == '>':
            op_inc_dp()
        elif op == '<':
            op_dec_dp()
        elif op == '[':
            op_jmp_fwd()
        elif op == ']':
            op_jmp_bck()
        elif op == '.':
            op_out()
        elif op == ',':
            op_in()
        else:
            print 'invalid opcode'
            break
        
    print out
    str = ''
    for c in out:
        str += '%c'%(c)
    print str
  • 相关阅读:
    CodeForces 660D Number of Parallelograms
    【POJ 1082】 Calendar Game
    【POJ 2352】 Stars
    【POJ 2481】 Cows
    【POJ 1733】 Parity Game
    【NOI 2002】 银河英雄传说
    【NOI 2015】 程序自动分析
    【POJ 1704】 Georgia and Bob
    【HDU 2176】 取(m堆)石子游戏
    【SDOI 2016】 排列计数
  • 原文地址:https://www.cnblogs.com/qintangtao/p/7100191.html
Copyright © 2011-2022 走看看