Lexical Analysis (词法分析)
词法分析指的是将输入的字符流,按照规则划分为词法单元并向下一阶段传递。
int a = 10;
如在上面这一行代码中,按照C语言的词法划分规则可以划分为 int,a,=,10,; 这五个词法单元。
编译器在进行词法分析时,词法分析程序会依次进行:
正则表达式解读 -> 构造NFA(Thompson法) -> 构造DFA -> 最小化DFA
1. 正则式
正则式指的是对某类字符串定义的一组规则, 由符号和字母表组成,正则式中存在三种运算:连接(ab),闭包(a),选择(a|b),这三种运算的优先级为闭包>连接>选择*。
a* -> ε|a|aa|aa...
(ab)* -> ε|ab|abab...
a*b -> b|ab|aab|aa...b
(a|b)* -> ε|a/b的任意组合
有时为了方便正则式的表达,往往会对某一类正则式进行命名
letter -> [a-zA-Z] 用来表示所有的大小写字母
number -> [0-9] 用来表示所有的数字
2. NFA与DFA
在了解NFA与DFA前,应先了解有限状态自动机的定义。有限状态自动机是一种用图来表示某种算法的形式。有限状态自动机分为非确定有限自动机(NFA)和确定有限状态自动机(DFA)。如状态A接受输入a转换到状态B用有限状态机表示为:
NFA指的是非确定有限状态自动机,其特点为在图中存在某一状态在接受同一种输入后,有多个不同的状态转换。如状态A接受输入a后转换为状态B、状态C。
DFA指的是确定有限状态自动机,其特点为在图中对于某一状态下的一种输入,仅可对应唯一一个状态转换。如状态A接受输入a后仅可转换到状态B,不可以转换到状态C(也可以为仅可转换到状态C,不可以转换到状态B)。
3. 正则式->NFA
从正则式向NFA转换常用Thompson法进行转换,在转换中三种运算对应的状态图分别为:
连接:ab,图中也可以省略ε这一步转换,直接由2接受输入b