[编译原理随记]NFA转DFA子集构造算法

上级文章

[编译原理随记]正则表达式记号和状态图:https://blog.csdn.net/qq_28033719/article/details/107067798


准备知识

Lex程序的组成部分:

声明部分 - 就是声明变量命名、符号、常量、正则定义这些;

转换规则 - 就是类似于状态图的状态转换一样,每一个输入字符都会进行一个代码块处理,这个处理就叫转换规则。

比如:

p1  {action1}
p2  {action2} ..... 

每一个 P 代表一个正则表达式(可复杂可简单), action 就代表执行程序代码块。

辅助过程 - 比如需要依赖什么方法,外部包,第三方等等的东西,引进来就行。

有穷自动机:

可以理解为更加一般化的状态转换图,分为确定有穷自动机(DFA),不确定有穷自动机(NFA)。作用就是把正则表达式引导并编译成识别器,可以理解为一种抽象化框架来完成识别器的编码,从而做出识别器功能。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现DFA化简的一般步骤为: 1. 对于给定的DFA,将其状态划分为两个等价类,一个是终态集合,一个是非终态集合。 2. 将每个等价类看作一个新的状态。 3. 构造一个新的DFA,其中状态为等价类,移函数和原DFA相同,但终态集合为新构造状态中包含原终态集合的那些状态。 4. 对于新构造DFA,重复步骤1-3,直到不能再进行状态的划分为止。 下面是一个利用Python实现DFA化简的示例代码: ```python def dfa_minimization(dfa): # 初始化状态划分 states = dfa.states final_states = dfa.final_states non_final_states = set(states) - set(final_states) partitions = [final_states, non_final_states] # 重复执行状态划分,直到不能再进行划分为止 while True: new_partitions = [] for partition in partitions: # 如果该等价类中只有一个状态,则不需要再划分 if len(partition) == 1: new_partitions.append(partition) continue # 根据当前等价类的状态进行划分 sub_partitions = {} for state in partition: next_state = dfa.transitions[state] next_partition = None for p in partitions: if next_state in p: next_partition = p break if next_partition not in sub_partitions: sub_partitions[next_partition] = set() sub_partitions[next_partition].add(state) # 将划分后的等价类加入新的状态划分中 for sub_partition in sub_partitions.values(): new_partitions.append(sub_partition) # 如果新的状态划分与原状态划分相同,则停止循环 if new_partitions == partitions: break else: partitions = new_partitions # 构造新的DFA new_states = [] new_transitions = {} new_final_states = set() for i, partition in enumerate(partitions): new_state = "S{}".format(i) new_states.append(new_state) for state in partition: if state in final_states: new_final_states.add(new_state) for symbol, next_state in dfa.transitions[state].items(): for j, sub_partition in enumerate(partitions): if next_state in sub_partition: new_next_state = "S{}".format(j) if new_state not in new_transitions: new_transitions[new_state] = {} new_transitions[new_state][symbol] = new_next_state return DFA(new_states, dfa.alphabet, new_transitions, "S0", new_final_states) ``` 在该代码中,`dfa`表示原始的DFA,其中包含状态、字母表、移函数和起始状态等信息。`dfa_minimization`函数的返回值是一个新的DFA,该DFA已经化简后的。在该函数中,利用状态划分算法DFA进行了化简,并且构造了新的状态集合、移函数和终态集合等信息。最终返回的新的DFA即为化简后的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值