Brainfuck解析器(Python)
2024-10-18 22:38:23
global cs
global ip global ss
#global sp global ds
global bp global tab
global out cs='++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
ip = ss = []
#sp = ds = []
bp = tab =
out = [] def tab_():
i = tab
stab = ''
while i > :
stab += '\t'
i -=
return stab def push(var):
global ss
ss.append(var) def pop():
global ss
return ss.pop() def op_inc_val():
global ip
count =
while True:
op = cs[ip]
ip = ip +
if op == '+':
count = count +
else:
break
l = len(ds)
if l <= bp:
ds.append()
old = ds[bp]
old += count
ds[bp] = old
print tab_()+'ds[%d] += %d (%d)'%(bp, count, old) def op_dec_val():
global ip
count =
while True:
op = cs[ip]
ip = ip +
if op == '-':
count = count +
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 + def op_dec_dp():
global bp
bp = bp - def op_jmp_fwd():
global tab
global ip
print tab_()+'while ds[%d]=%d:'%(bp, ds[bp])
tab=tab +
if ds[bp] != :
curip = ip -
push(curip)
else:
c = ;
while c > :
op = cs[ip]
if op == '[':
c +=
elif op == ']':
c -=
ip += def op_jmp_bck():
global tab
global ip
tab = tab -
if ds[bp] != :
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 +
if op == '+':
ip = ip -
op_inc_val()
ip = ip -
elif op == '-':
ip = ip -
op_dec_val()
ip = ip -
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
最新文章
- 玩转JavaScript OOP[2]&mdash;&mdash;类的实现
- Linux添加主机路由
- DeviceOne接受了DevStore的专访
- JS调用自定义弹窗【bootstrap】
- 快速替换dll命名空间
- DDD学习笔记二
- 容器适配器之queue
- 【完结】利用 Composer 完善自己的 PHP 框架(三)——Redis 缓存
- mirantis fuel 学习
- iOS开发——OC篇&;OC高级语法
- 解决使用Touch ID API在回调时界面“长时间卡住”的问题
- web乱码问题
- 关于Coursera上的斯坦福机器学习课程的编程作业提交问题
- 剑指offer编程题Java实现——替换空格
- gawk的用法
- Android逆向工程
- JS引擎线程的执行过程的三个阶段(一)
- lavarel 中间件
- selenium 校验文件下载成功
- sql两列相除,保留n位小数