算法:模拟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) # 判断是否接受