目录
NFA转换DFA
eg:将下图NFA M确定化。
生成DFA M的初态ε-Closure({0})={0,2,3}。重新命名生成的各个状态:{0,2,3}为0,{1}为1,{2,3}为2,{3}为3。由于{0,2,3}、{2,3}和{3}中均包含M中的终态3,因此0、2、3为M’的终态。
化简DFA
eg:化简DFA。
根据终态和非终态划分为两个子集:Π1={A,B,F},Π2={C,D,E,G}。
对Π1,输入b,状态A、B经过b可到达终态,而F经过b不能到达终态。因此Π1划分为两个子集Π11={A,B}和Π12={F}。
对Π11,输入bb,A经过bb可到达终态,而B不能,所以A和B是可区别的两个状态。
故Π1划分为{A}、{B}、{F}三个子集。
对Π2,输入b,划分成两个子集Π21={C,E}和Π¬22={D,G}。
对Π21,输入a,划分成两个子集{C}和{E}。
故Π2划分成{C}、{E}、{D,G}。
最终状态集合划分成:{A}、{B}、{F}、{C}、{E}、{D,G}。
识别单词的DFA
- 识别标识符的DFA
- 无符号数
- 无符号整数
- 注释
- 识别token
词法分析阶段的错误处理
- 词法分析阶段可检测错误的类型
- 单词拼写错误 例:int i = 0x3G; float j =1.05e;
- 非法字符 例:~ @
-
词法错误检测
如果当前状态与当前输入符号在转换表对应项中的信息为空,而当前状态又不是终止状态,则调用错误处理程序 -
错误处理
查找已扫描字符串中最后一个对应于某终态的字符
- 如果找到了,将该字符与其前面的字符识别成一个单词。
然后将输入指针退回到该字符,扫描器重新回到初始状
态,继续识别下一个单词 - 如果没找到,则确定出错,采用错误恢复策略
- 错误恢复策略
最简单的错误恢复策略:“恐慌模式 (panic mode)”恢复
:从剩余的输入中不断删除字符,直到词法分析器能够在剩余输入的开头发现一个正确的字符为止
回溯的消除
提取左因子
若有A→αβ1|αβ2|…|αβ1|γ,其中γ不是以α开头的候选式,则A的产生式规则可替换为A→αA‘|γ,A’→β1|β2|…|βn。A’是一个新的非终结符号。
消除左递归
- 左递归缺点:容易产生死循环
- 消除直接左递归
若某个文法中非终结符A的产生式规则是直接左递归规则:A→Aα|β,其中α,β∈(VN∪VT)。若β不以A打头,则将A的产生式规则改写为:A→βA’,A’→αA’|ε。A’是新增加的非中介符号。
eg:设有文法G[Z]:
E→E+T|E-T|T
T→TF|T/F|F
F→(E)|i
消除非终结符E,T的直接左递归后,文法G[Z’]改写为:
E→TE’
E’→+TE’|-TE’|ε
T→FT’
T’→*FT’|/FT’|ε
F→(E)|i
消除间接左递归
1)对文法G的非终结符号按任一种顺序排列成A1,A2,…,An。
2)依次对各非终结符号对应的产生式进行左递归的消除:
for(j=1;j<=n;j++)
for(k=1;k<=j-1;k++){
i)把每个形如Aj→Akα的规则改写为Aj→δ1α|δ2α|…|δmα。其中Ak→δ1|δ2|…|δm是关于当前Ak的产生式规则;
ii)消除关于产生式规则Aj的直接左递归;
}
3)进一步化简消除左递归之后的新文法,删去多余的产生式规则。
eg:
设有文法G[S]:
S→Sa|Tbc|Td
T→Se|gh
将非终结符号排成顺序为S,T
消除产生式S左递归:
S→(Tbc|Td)S1
S1→aS1|ε
对T→Se|gh,将S代入展开得:
T→T(bc|d)S1e|gh
消除产生式T左递归:
T→ghT1
T1→(bc|d)S1eT1|ε
第三章
用状态转换图识别字符串
relop的状态转换图的概要实现
作业3
前缀、后缀、真前缀、子串和子序列
语言上的运算
正则表达式与语言
P53
第五章
判断LL文法,需要判断相同左部的产生式的SELECT集是否都不相交