第二章 词法分析.ppt

即为化简了的DFA。 0 1 2 a a b b 3 a a b b 0 1 2 3 5 4 6 a a a a a a a b b b b b b b * 由正规式构造有限自动机小结 正规式到NFA(Thompson构造法) NFA到DFA(子集构造法) DFA到最小DFA(Hopcroft算法) * 练习: 有正规式(a|b)*(aa|bb)(a|b)*,试为其构 造最简的DFA。 * 1、由正规表达式构造NFA X ? 1 3 ? b a 2 ? y 6 ? b a 4 5 a a b b * X ? 1 3 ? b a 2 ? y 6 ? b a 4 5 a a b b 2、利用子集构造法将NFA确定化为DFA 状态 ∑ Ia Ib { x,3,1} {3,4,1} {3,5,1} {3,4,1} {3,5,1} X ? 1 3 ? b a 2 ? y 6 ? b a 4 5 a a b b 状态 ∑ Ia Ib { x,3,1} {3,4,1} {3,5,1} {3,4,1} {3,5,1} X ? 1 3 ? b a 2 ? y 6 ? b a 4 5 a a b b {3,2,4,1,6,y} {3,5,1} {3,2,4,1,6,y} {3,4,1} {3,2,5,1,6,y} {3,2,5,1,6,y} {3,2,4,6,1,y} {3,5,6,1,y} 状态 ∑ Ia Ib { x,3,1} {3,4,1} {3,5,1} {3,4,1} {3,5,1} X ? 1 3 ? b a 2 ? y 6 ? b a 4 5 a a b b {3,2,4,1,6,y} {3,5,1} {3,2,4,1,6,y} {3,4,1} {3,2,5,1,6,y} {3,2,5,1,6,y} {3,2,4,6,1,y} {3,5,6,1,y} {3,5,6,1,y} {3,4,6,1,y} {3,2,5,6,1,y} {3,4,6,1,y} {3,6,4,1,y} {3,2,6,5,1,y} {3,2,6,4,1,y} {3,6,5,1,y} { x,3,1} { 3,4,1} { 3,5,1} {3,2,4,1,6,y} {3,2,5,1,6,y} {3,5,6,1,y} {3,4,6,1,y} a b a a b a b a b b a b a b 0 1 2 3 4 5 6 a b a a b a b a b b a b a b * 即为化简了的DFA。 0 1 2 a a b b 3 a a b b 采用划分法可以使其简化为: 3、DFA的化简 * 2.5 词法分析器的自动生成 用手工方式,即根据识别语言单词的状态转换图,使用某种高级语言直接编写词法分析程序。 利用自动生成工具LEX自动生成词法分析程序。 * LEX的实现过程 Lex源程序 Lex.yy.c Lex编译器 词法分析器L Lex.yy.c C编译器 Token序列 词法分析器L 输入流 * Lex的源程序结构 声明部分 (正规定义式) %% 转换规则 (识别规则) %% 辅助过程 (用户子程序) %{ 常量定义 %} 正规定义 * 1、正规定义式 letter→A|B|C|…|Z|a|b|c|…|z digit→0|1|2|…|9 identifier→letter(letter|digit)* integer→digit(digit)* 2、识别规则 正规式 动作描述 token1 {action1} token2 {action2} …… tokenn {actionn} /*声明部分*/ %{ #include stdio.h #include ctype.h #include string.h #define WHILE 1 #define DO 2 #define IF 3 #define ELSE 4 #define SWITCH 5 #define ID 6 #define NUM 7 #define PLUS 8 #define SUB 9 #define STAR 10 #define RELOP 11 #define EQ 12 #define SEMI 13 #define LE 14 #define LT

文档评论(0)

1亿VIP精品文档

相关文档