def cal(s):
if '+' in s:
return '+= %d'%len(s)
else:
return '-= %d'%len(s)
...
...
...
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 = 1
for i,v in enumerate(s[p+1:]):
if v == '[':
stk += 1
elif v == ']':
stk -= 1
else:
continue
if stk == 0:
print tab+'while mem[%d]:'%ptr
ptr = bf2asm(s[p+1:p+1+i],ptr,tab+'\t')
p += i+1
break
continue
这些比较好实现,这里[]的转义并不是正确的转义,只是根据实际情况简化了
然后是是.和,的转义,这个比较简单,根据程序来写就行了
执行代码,得到如下结果(部分)
while mem[144]:
mem[144] -= 1
while mem[29]:
mem[29] -= 1
while mem[51]:
mem[51] -= 1
mem[144] += 1
mem[29] += 1
while mem[29]:
mem[29] -= 1
mem[51] += 1
虽然得到了转义代码,但是过程相对复杂,需要对其简化,比如上面的代码,仔细分析写就发现其过程就是
mem[144] = mem[51]
mem[29] = 0 #这部分可以不要
所以我们可以化简为
mem[144] = mem[51]
然后同样的对其他地方进行化简,我用到的化简如下
def sym2cal(s):
if '>' in s:
return len(s)
else:
return -len(s)
...
...
...
pattern = re.compile(r'([><]*)\[-([><]*)\[-\]([><]+)\[-\]([><]+)\[-([><]+)\+([><]+)\+([><]+)\]([><]+)\[-([><]+)\+([><]+)\]([><]*)\[-([><]+)\+([><]+)\]([><]*)\]')
match = pattern.match(s[p:])
if match:
p += len(match.group())
groups = match.groups()
ptr1 = ptr + sym2cal(groups[0])
ptr2 = ptr1
for i in xrange(1,4):
ptr2 += sym2cal(groups[i])
ptr3 = ptr2
for i in xrange(4,12):
ptr3 += sym2cal(groups[i])
# print tab+'if mem[%d]:'%ptr1
# print tab+tab+'mem[%d] sub 1'%ptr1
# print tab+tab+'add mem[%d] mem[%d]'%(ptr3,ptr2)
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(3):
ptr1 += sym2cal(groups[i])
ptr2 = ptr1
for i in xrange(3,11):
ptr2 += sym2cal(groups[i])
# print tab+'add mem[%d] mem[%d]'%(ptr2,ptr1)
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[0])
ptr2 = ptr1 + sym2cal(groups[1])
ptr3 = ptr2 + sym2cal(groups[2])
# print tab+'mov mem[%d] mem[%d]'%(ptr1,ptr3)
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+'mov mem[%d] 0'%(ptr)
print tab+'mem[%d] = 0'%(ptr)
continue