基于0型文法的二进制加法器
最近学习编译原理,正在学习文法,书上提到0型方法的描述能力相当于图灵机,
于是想验证一下,既然是相当于图灵机,那么应该可以仅通过方法规则来进行运算。。
我就来定义了一个二进制加法器:
P:
A->A0 | A1 | e
A+e->A
e+A->A
A0+A0->A+A0
A0+A1->A+A1
A1+A0->A+A1
A1+A1->A+A+10
如果我们要从111+11+1推导出1011
可以像这样: 111+11+1=>111+1+e+10
=>111+1+10
=>111+e+e+100
=>111+e+100
=>111+100
=>11+101
=>1+111
=>e+e+1011
=>e+1011
=>1011
下面是我用python写的一个简单实现该转换的程序:
#!/usr/bin/python
# a binary adder based on grammar..
# this has nothing to do with compute,
# actually,it's just string operations.
# version: 0.0.1
# usage:
# if you "111+11+1",<7+3+1>in decimal.
# output will be "1011",<11>in decimal.
s=str(raw_input("input a binary expression string:"))
# recursively calculate the binary expression..
def adder(s):
r=""
if '+' not in s: # it's the result format already..
return s
else:
s1=s[:s.index('+')] # split the expression to two parts.
s2=adder(s[s.index('+')+1:])# and process the second first..
s=core(s1,s2) # calculate the normal format:Ax+By..
r=adder(s[:-1])+s[-1]+r # append the last char to the result...
return r
# core(),define the core principles.
# return the result of Ax+By,where x,y belong to {0,1}
# P: A->A0|A1|e
# e+A->A
# A+e->A
# A0+A0->A+A0
# A0+A1->A+A1
# A1+A0->A+A1
# A1+A1->A+A+10
def core(s1,s2):
# correspond to: e+A->A && A+e->A
if len(s1)==0 or len(s2)==0:
return s1+s2
else:
p1=s1[:-1]
p2=s2[:-1]
# correspond to: A0+A0->A+A0
if s1[-1]+s2[-1]=='00':
if len(p1)==0 or len(p2)==0:
return p1+p2+'0'
else:
return p1+'+'+p2+'0'
# correspond to: A0+A1->A+A1 && A1+A0->A+A1
elif s1[-1]+s2[-1]=='01' or s1[-1]+s2[-1]=='10':
if len(p1)==0 or len(p2)==0:
return p1+p2+'1'
else:
return p1+'+'+p2+'1'
# correspond to: A1+A1->A+A+10
else:
if len(p1)==0 and len(p2)==0:
return '10'
elif len(p1)==0 or len(p2)==0:
return p1+p2+'+'+'10'
else:
return p1+'+'+p2+'+'+'10'
print adder(s)
2010年4月16日 05:52
nice!赞一个