import re def sym2cal(s):
if '>' in s:
return len(s)
else:
return -len(s) def cal(s):
if '+' in s:
return '+= %d'%len(s)
else:
return '-= %d'%len(s) def bf2asm(s,ptr,tab):
p =
l = len(s)
while(p<l):
pattern = re.compile(r'([><]*)\[-([><]*)\[-\]([><]+)\[-\]([><]+)\[-([><]+)\+([><]+)\+([><]+)\]([><]+)\[-([><]+)\+([><]+)\]([><]*)\[-([><]+)\+([><]+)\]([><]*)\]')
match = pattern.match(s[p:])
if match:
p += len(match.group()) groups = match.groups()
ptr1 = ptr + sym2cal(groups[])
ptr2 = ptr1
for i in xrange(,):
ptr2 += sym2cal(groups[i])
ptr3 = ptr2
for i in xrange(,):
ptr3 += sym2cal(groups[i])
print tab+'mem[%d] += mem[%d]*mem[%d]'%(ptr3,ptr2,ptr1) for v in groups:
ptr += sym2cal(v)
continue pattern = re.compile(r'([><]*)\[-\]([><]+)\[-\]([><]+)\[-([><]+)\+([><]+)\+([><]+)\]([><]+)\[-([><]+)\+([><]+)\]([><]*)\[-([><]+)\+([><]+)\]')
match = pattern.match(s[p:])
if match:
p += len(match.group()) groups = match.groups()
ptr1 = ptr
for i in xrange():
ptr1 += sym2cal(groups[i])
ptr2 = ptr1
for i in xrange(,):
ptr2 += sym2cal(groups[i])
print tab+'mem[%d] += mem[%d]'%(ptr2,ptr1) for v in groups:
ptr += sym2cal(v)
continue pattern = re.compile(r'([><]*)\[-\]([><]+)\[-\]([><]+)\[-([><]+)\+([><]+)\+([><]+)\]([><]+)\[-([><]+)\+([><]+)\]([><]+)')
match = pattern.match(s[p:])
if match:
p += len(match.group()) groups = match.groups()
ptr1 = ptr + sym2cal(groups[])
ptr2 = ptr1 + sym2cal(groups[])
ptr3 = ptr2 + sym2cal(groups[])
print tab+'mem[%d] = mem[%d]'%(ptr1,ptr3) for v in groups:
ptr += sym2cal(v)
continue pattern = re.compile(r'\[-\]')
match = pattern.match(s[p:])
if match:
p += len(match.group())
print tab+'mem[%d] = 0'%(ptr)
continue pattern = re.compile(r'>+')
match = pattern.match(s[p:])
if match:
p += len(match.group())
ptr += len(match.group())
continue pattern = re.compile(r'<+')
match = pattern.match(s[p:])
if match:
p += len(match.group())
ptr -= len(match.group())
continue pattern = re.compile(r'\++')
match = pattern.match(s[p:])
if match:
p += len(match.group())
print tab+'mem[%d] %s'%(ptr,cal(match.group()))
continue pattern = re.compile(r'-+')
match = pattern.match(s[p:])
if match:
p += len(match.group())
print tab+'mem[%d] %s'%(ptr,cal(match.group()))
continue c = s[p]
if c == '[':
stk =
for i,v in enumerate(s[p+:]):
if v == '[':
stk +=
elif v == ']':
stk -=
else:
continue
if stk == :
print tab+'while mem[%d]:'%ptr
ptr = bf2asm(s[p+:p++i],ptr,tab+'\t')
p += i+
break
continue elif c == ',':
if input_ptr < :
print tab+'mov mem[%d] input[input_ptr]'%ptr
else:
if bit_add >= :
print tab+'mov mem[%d] 0x30'%ptr
else:
print tab+'mov mem[%d] 1'%ptr
elif c == '.':
print tab+'cmp mem[%d] data[data_ptr]'%ptr
p +=
return ptr s = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>[->+<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>>>>>>>>>>>>>,>>>>>>[-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<[-]>>>>>>>>>>>>>>>>>>>>>>[->>>>>>+<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>]"
input_ptr =
bit_add =
bf2asm(s,,'')
会简化一些代码流程,比如
while mem[]:
mem[] -=
while mem[]:
mem[] -=
while mem[]:
mem[] -=
mem[] +=
mem[] +=
while mem[]:
mem[] -=
mem[] +=
上面这段代码,分析后其实就是
mem[] = mem[]