词法分析
构造词法分析器的步骤
- 选择词法单元
- 给出词法单元的正则表达式
- 将正则表达式转换为有限状态自动机
- 以有限状态自动机为基础设计词法分析程序
词法单元的模式(正则表达式)
- 词素(lexeme):源程序中一段连续的字符序列
- 词法单元(token):对于满足某一种模式的词素(lexeme),将其归为一类,该类的类名即为token的名
- 字母表(alphabet)是一个有限的符号集合,字母表中符号的有限序列称为串(string)
- 正则表达式:+代表一个或多个实例,*代表0个或者1~n个连续实例,[abc]=a|b|c,[a-e]=a|b|c|d|e
会画状态转换图
1.状态:当找到token时将状态画为接收状态,加*的接收状态表示最后读入的符号不纳入词素,即不属于此次构建token过程的单词。(一般都是跟在other后面的)
有限自动机(FA)
分为两类:非确定有限自动机(NFA),确定有限自动机(DFA)
非确定有限自动机(NFA)
- NFA的转换表
- DFA(确定有限自动机):
- DFA是特殊的NFA,没有空的转换,对于每个状态和输入符号a,有且仅有一条标号为a的离开该状态的边
- 每一个NFA都有一个与之等价的DFA
- 正则表达式=>NFA=>DFA
- RE=>NFA(Thompson算法)
- 总结就是归纳合并(多用空转换来换到不同的状态)
- NFA=>DFA
- 基本思想:
- 目标DFA的每个状态和NFA的状态子集对应(即合并前的各个状态)
- 目标DFA读入a1, a2, …, an后到达的状态对应于NFA从开始 状态出发沿着a1, a2, …, an可能到达的所有状态的集合
- 如果其中包括多个对应于不同模式的NFA接受状态, 则表示当前的输入前缀对应于多个模式,存在冲突。解决方式:找出第一个列出的这样的模式,将该模式作为此DFA接受状态的输出,即按序号在最前的排
- 三个函数
3. 算法:笔记上 - Hopcorft算法:DFA的最小化,得到状态数量最少的DFA
- 如果存在串x,使得从状态s_1和s_2,一个到达接受状态而另一个到达非接受状态,那么x就区分了s_1和s_2
- hopcroft算法的基本思想就是根据每个集合中原DFA状态之间是否可区分将之分裂,直到每个集合都成为等价类为止(即集合间均不可区分),然后从每个等价类中选取一个代表,构造新的DFA
- 算法:
细分的依据:
- 基本思想: