题目预览

编译原理2.1.png
本来是准备直接在网上找代码修改一下,写到实验报告算了,结果发现网上的代码都没有什么很详细的解释,只有代码,而且不是交互式的输入,所以自己用Python写了一个模拟DFA。
代码里面的注释很详细了,在这里就不做过多解释。上代码!

代码实现

class DFA:
    # 初始化函数,传入状态集、输入集、转移函数集、初态、终态
    def __init__(self, states, my_inputs, move, s, e):
        self.states = states
        self.my_inputs = my_inputs
        self.move = move
        self.s = s
        self.e = e

    # 判断是否接受输入字符串x
    def is_accept(self):
        count = 0
        while self.my_inputs[count] is not '#':
            # 先判断遇到该字符当前状态是否能够转移到下一状态
            if self.my_inputs[count] in self.move[self.s].keys():
                # 有下一状态,将下一状态赋值给s0
                self.s = self.move[self.s][self.my_inputs[count]]
                count += 1
            else:
                # 如果没有下一状态,说明出错,不接受该输入串
                return 0
        # 如果上述循环成功执行,最后的状态是否为终态,如果不是,返回0
        if self.s is not self.e:
            return 0
        return 1


if __name__ == '__main__':
    '''
        首先让用户输入初始数据,包括:
        1)状态总数states:此程序中所有状态均由数字表示,如果用户输入4,则states = [0, 1, 2, 3]
        2)输入字符串my_inputs: 字符串形式
        3)转移状态集move:形式如:[dict1, dict2, dict3……],转移状态集是一个列表,有几个状态里面就包含几个字典。
        比如[dict1, dict2, dict3]就表示当前有三个状态dict1里面存储的就是0状态会转移的状态,dict2存储的是1状态
        会转移的状态。假如现在0状态遇到字符a会转移到1状态,那么dict1 = {'a': 1}
        4)初态s:数字形式表示
        5)终态e:数字形式表示
    '''
    # 用户输入状态总数
    statu_number = int(input("请输入状态总数:"))
    # 用户输入转移规则,顺带着一块创建
    states = []
    move = []
    # 用户输入初态和终态
    s = int(input("请输入初态:"))
    e = int(input("请输入终态:"))
    # 用户输入待检测的字符串
    my_inputs = input("请输入待检测的字符串,以#结尾:")
    # 用户输入字符的种类
    types = input("请输入字符串中不同的字符,比如aba就输入a,b、abca就输入a,b,c:")
    type_results = types.split(',')
    for i in range(0, statu_number):
        states.append(i)
        dict = {}
        for j in type_results:
            next_state = int(input("请输入状态" + str(i) + "遇到字符" + j + "时转移的状态").replace(' ', ''))
            dict[j] = next_state
        move.append(dict)
    # 创建一个DFA,并调用is_accept函数
    dfa = DFA(states, my_inputs, move, s, e)
    result = dfa.is_accept()
    if result == 1:
        print("Congratulations,DFA接受此字符串!")
    else:
        print("Sorry, DFA不接受此字符串")
最后修改:2019 年 12 月 06 日
如果觉得我的文章对你有用,请随意赞赏