Python实现模拟DFA算法

算法:模拟DFA
输入: DFA D和输入字符串x,D的初态为s0, 终态集为F。
输出: 若D接受x,回答‘yes’,否则回答‘no’


# 构造DFA
class DFA:
    # 初始化DFA
    def __init__(self, S, s0, F, move):
        self.S = S  # 状态集(list)
        self.s0 = s0  # 初态(int)
        self.F = F  # 终态(int)
        self.move = move  # 状态转移函数(list套dict)

    # 判断是否接受x
    def isAccept(self,x):
        print('开始判断是否接受输入的字符串x')
        for ch in x:
            # 如果能转换(判断字典中是否存在key为'ch')
            if ch in move[self.s0]:
                self.s0=move[self.s0][ch]
            #如果不能转换,直接返回拒绝
            else:
                print('输入被拒绝~~')
                return 0

        #判断是否达到终态
        if self.s0==self.F:
            print('输入被接受~~')
        else:
            print('输入被拒绝~~')
        return 0

if __name__ == '__main__':
    print("---------本程序用于识别正规式为'(a|b)*abb'的字符序列---------")
    #手动输入DFA元素
    #S = [0, 1, 2, 3]
    S = eval(input("请输入DFA的状态集S,输入格式为List,如'[0, 1, 2, 3]' :"))#动态输入成功
    #s0 = 0
    s0 = int(input("请输入DFA的初态s0,如'0' :"))#动态输入成功
    #F = 3
    F = int(input("请输入DFA的终态F,如'3' :"))#动态输入成功

    #move = [{'a': 1, 'b': 0}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}, {'a': 1, 'b': 0}]
    print("请输入DFA的状态转移矩阵,输入格式为List嵌套Dict,如'[{'a': 1, 'b': 0}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}, {'a': 1, 'b': 0}]' ")
    move = eval(input(":"))
    #动态获取DFA元素

    D = DFA(S, s0, F, move)
    while True:
        print(' ')
        x = input('请输入要识别的字符串x:')#提示输入
        if x=='quit':
            print('程序结束运行')
            break
        D.isAccept(x)  # 判断是否接受
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章