【编译原理08】编写复杂NFA程序

Problem Description

已知正规式: 1(1010*|1(010)*1)*0

  1. 构造正规文法的NFA
    在这里插入图片描述
  1. 编写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
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值