编译的过程分为如下几个阶段:
词法分析,语法分析,语义分析和中间代码生成,目标代码生成,代码优化。
词法分析主要识别语言中的单词,填充到符号表中,为下一步的进行做好准备。
语言正规式------->不确定有限自动机(NFA)---------->确定有限自动机(DFA)-------->简化(DFA)----->词法分析器。
首先要识别一种单词,就要表示一种语言的所有构成元素。这里用到一个数学的工具,叫做正规式。正规式用来表示一种语言元素的所有集合。
例如 :
正规式 (a|b)*a(a|b) 表示以a或b任意组合开头的,中间为a的,以a或b结尾的字符串。*号表示闭包。
(a|b)*转换公式为
ab的转换公式为
a|b的转换公式为
有限自动机实际上就是状态转换图。一个正规式到有限自动机的转换按照一定的公式就得出。一般得出的为不确定的有限自动机,所谓不确定的有限自动机就是说从一个状态经过一个字符可以到达不同的状态,方向不能确定,这就叫NFA。由于我们在进行词法分析的时候需要确定的有限自动机,这样才能进行编程实现。所以我们要将NFA转换为DFA的原因,
转换方法:
通过上面的转换公式由正规式得到NFA,根据状态转换图得到DFA,步骤如下:
1:从初始状态开始I{1},由初始状态求∑的闭包,得到∑{I},其闭包的求法为经过任意个∑的状态的集合。
2:以∑{I}集合,求Ia的∑{Ia}.具体求法为,经过一个a后的集合在求∑的集合就是∑{Ia}.一次球Ib的∑{Ib}。
3: 重复步骤2的操作直至没有新的集合产生。
4:第一行第一例开始编号,将Ia变为a,将Ib变为b,画出状态转换图就得到了DFA.
DFA的简化。
1: 将状态集合{1,2,3,4,5}分成两部分,初始状态一部分,中间状态和终态一部分。可分为{1,2,3}和{4,5}
2: 根据DFA求{1,2,3}a的状态集合和{1,2,3}b的状态集合,如果得出的集合都不在两个集合内,则将这个集合单独作为一个集合,则集合有{1,2},{3},{4,5}。
3:继续第二步操作,直至得出的集合都包含在父集合内。
4:简化,将集合内相同的状态合并,射入状态的边指向合并的状态,射出的边舍弃。得到的最终的DFA就为简化的DFA图
词法分析器的生成。
根据DFA可以用编程语言实现DFA图,一般使用Lex自动生成词法分析器。