将源程序的字符串流,组成词素,生成一个词法单元序列(词法单元包含词法单元名和属性值构成)。正则表达式
对于词法分析器发现的标识符词素时,会将词素添加到符号表中。算法
词法分析器→语法分析器递归
常见的词法单元和词素字符串
词法单元 | 描述 | 词素 |
---|---|---|
if | 字符i,f | if |
else | 字符e,l,s,e | else |
comparison | 大于小于 | > < |
id | 字母开头的变量 | po,D2 |
number | 数字 | 3.14 2 |
正则表达式:用来描述词素的重要表示方法。it
串相关table
正则表达式能够由娇小的正则表达式按照规则递归构建。class
r={a,b,c,d...x,y,z} s={0,1,2,3...9}变量
正则的扩展扩展
状态转换图:构造词法分析器的一个中间步骤,构造状态转换图。语法
能够用while,switch实现状态转换图
将出入程序变成一个词法分析器,自动机的本质是与状态转换图相似的图。
对边上的标号没有任何限制,一个符号标记离开同一状态的多条边,空串也能够做为标号。
状态 | a | b | c |
---|---|---|---|
0 | {0,1} | {0} | 空 |
1 | 空 | {2} | 空 |
2 | 空 | {3} | 空 |
3 | 空 | 空 | 空 |
属于NFA的一个特例,说NFA是一个抽象表示的识别串的算法,DFA就是一个具体的识别串的算法。
利用子集构造法将NFA转成DFA
基本思想让构造获得的DFA每一个状态对应于NFA的一个状态集合
输入:一个NFA N
输出:一个转换后的DFA D
方法:为D构造一个转化表Dtran,D的每一个状态都是一个NFA状态集合,利用Dtran,使D能够"并行"的模拟N遇到一个给定输入串时能够执行的全部动做。需要解决的问题包括,正确处理N的 空串 的转换。
例中A和C等价,都不接受状态,对于任意输入总能转到同一个状态。
结论:对于任何正则语言都有一个惟一的 状态数目最少的DFA,经过分组合并并等价的状态,能够构造状态数最少的DFA。
死状态:全部输入符号上都转向本身的非接受状态。在一个DFA中,每一个状态出发每一个输入符号上都会有一个转换,发现正确词素的时候DFA结束。
能够将任何正则表达式变为接受相同语言的NFA。这个算法是语法制导的,就是沿着正则表达式的语法分析树自底向上递归进行处理。
对于每一个子表达式,构造一个只有一个接受状态的NFA。
自动机 | 初始开销 | 每一个串的开销 |
---|---|---|
NFA | O(r) | O(rxs) |
DFA typical case | O(r^3) | O(s) |
DFA worst case | O(r^2*2^r) | O(s) |
若是处理字符串所花时间不少,更倾向DFA。然而像grep这样的命令,只会对一个符号串运行自动机,一般使用NFA方式。