Problem Description
已知正规式: 1(1010*|1(010)*1)*0
- 构造正规文法的NFA
- 编写NFA程序,识别单词是否合法。
Input 输入多行单词,输入EOF结束
Output 第1行输出识别单词过程的通路
第2行,如果通路的最后一个状态集中包含终止状态,表示单词被正规式识别, 输出"accept",否则,输出"not accept"。
Sample Input
10
110110100110
1101001
Sample Output
{0}-1->{1,9}-0->{10}
accept
{0}-1->{1,9}-1->{2,5,8}-0->{3,6}-1->{1,4,7,9}-1->{2,5,8}-0->{3,6}-1->{1,4,7,9}-0->{1,10,4,5,8,9}-0->{1,10,4,6,9}-1->{2,5,7,8}-1->{1,9}-0->{10}
accept
{0}-1->{1,9}-1->{2,5,8}-0->{3,6}-1->{1,4,7,9}-0->{1,10,4,5,8,9}-0->{1,10,4,6,9}-1->{2,5,7,8}
not accept
python代码实现
def NFA(s,t):
t=int(t)
if s==0 and t==1:
return (1,9)
if s==1 and t==0:
return (10,-1)
if s==1 and t==1:
return (2,5,8)
if s==2 and t==0:
return (3,-1)
if s==5 and t==1:
return (9,1)
if s==5 and t==0:
return (6,-1)
if s==6 and t==1:
return (7,-1)
if s==3 and t==1:
return (1,4,9)
if s==4 and t==0:
return (1,4,9,10)
if s==7 and t==0:
return (5,8)
if s==8 and t==1:
return (1,9)
if s==8 and t==0:
return (6,-1)
if s==9 and t==0:
return (10,-1)
if s==9 and t==1:
return (2,5,8)
return (-1,-1)
while True:
try:
k=input()
k=k.split()
for str1 in k:
s = []
s.append(0)
print("{0}", end='')
for i in str1:
tem = []
for j in s:
if j == -1:
continue
p = list(NFA(j, i))
tem += p
print("-", end='')
print(i, end='')
print("->{", end='')
tem1 = list(set(tem))
tem=[]
for i in tem1:
tem.append(str(i))
tem.sort()
tem1 = []
for i in tem:
tem1.append(int(i))
tem=tem1
flag = 0
for l in range(0, len(tem)):
if tem[l] == -1:
continue
if flag == 0:
flag = 1
print(tem[l], end='')
else:
print(",", end='')
print(tem[l], end='')
print("}", end='')
s = tem
print()
for i in s:
if i == 10:
print("accept")
s = 1
break
if type(s) != int:
print("not accept")
except EOFError:
break