从NFA到DFA的转换

从NFA到DFA的转换

  • 例1:简单NFA(不带有空边)
  • 例2:从带有空边的NFA到DFA
  • 子集构造法
  • 词法分析阶段的错误处理
      • 查找已扫描字符串中最后一个对应于某终态的字符
      • 错误恢复策略

例1:简单NFA(不带有空边)

从NFA到DFA的转换_第1张图片
DFA的每个状态都是一个由NFA中的状态构成的集合,即NFA状态集合的一个子集。

转换表:

状态\输入 a b c
A {A,B} null null
B null {B,C} null
C null null {C,D}
D null null null

从NFA到DFA的转换_第2张图片

例2:从带有空边的NFA到DFA

从NFA到DFA的转换_第3张图片

转换表:
空边相当于不经过任何符号。

状态\输入 0 1 2
A {A,B,C} {B,C} {C}
B null {B,C} {C}
C null null {C}

从NFA到DFA的转换_第4张图片
正则表达式:
r = 0 ∗ 1 ∗ 2 ∗ r = 0^*1^*2^* r=012

子集构造法

输入:NFA N
输出:接收同样语言的DFA D
方法:
从NFA到DFA的转换_第5张图片
算法中的空闭包计算方法:

将T的所有状态压入stack中:
将ε-closure(T)初始化为T;
while(stack非空) {
	将栈顶元素t给弹出栈中;
	for(每个满足如下条件的u:从t出发有一个标号为ε的转换到达状态u)
		if(u不在ε-closure(T)中){
			将u加入到ε-closure(T)中;
			将u压入栈中;
		}
}

从NFA到DFA的转换_第6张图片

词法分析阶段的错误处理

词法分析阶段可检测错误的类型

  • 单词拼写错误
int i = 0x3G; float j = 1.05e;
  • 非法字符
~ @
  • 词法错误检测
    如果当前状态与当前输入符号在转换表对应项中的信息为空,则报错,调用错误处理程序。

查找已扫描字符串中最后一个对应于某终态的字符

  • 如果找到了,将该字符与其前面的字符识别成一个单词,然后将输入指针退回到该字符,扫描器重新回到初始状态,继续识别下一个单词;
  • 如果没找到,则确定出错,采用错误恢复策略

错误恢复策略

最简单的错误恢复策略:“恐慌模式(Panic mode)”恢复

  • 从剩余的输入中不断删除字符,直到词法分析器能够在剩余输入的开头发现一个正确的字符为止

你可能感兴趣的:(编译原理,正则表达式,后端)