2017.12.23日的吐槽,说实话我也看不懂我这都写的啥了
词法分析器的概念
关于NFA,首先了解状态转换图(由表示状态的元素,和边(连接状态)组成)
状态转换图实例
- 关系算符的转换
- 标识符和保留字的转换图
- 无符号数的转换图
- digit表示数字, digit+表示不少于一个数字
- .表示小数点
- E表示指数
- ()?表示可有可无
然后可以根据状态图手动编写 词法分析器。
- 首先通过正则表达式来描述词法单元的模式
- 基本目标:判断一个串s是否属于一个正则表达式R表示的语言
词法自动识别的过程中可能遇到的问题:
- 匹配最长可能的串
- 排在前面的正则表达式优先匹配
- 构造一个ERROR正则表达式
##词法分析器生成工具 —— LEX
Lex 是一种词法分析程序的自动构造工具。通常和Yacc一起使用,生成编译器的前端(生成中间代码,后端对程序进行优化)
过程: 正则表达式 -> NFA -> DFA -> minDFA ->词法分析器
(利用了正则表达式和DFA的等价性)
FA 有限自动机
DFA确定的有限自动机(没输入一个字符,进入确定的状态)
NFA不确定的有限自动机
DFA的形式定义:五元组 M=(Σ, Q, q0, F, δ),
P29页对应的正则表达式:(a|b)(aa|bb)(a|b)
或者(b|\e)(ab)(b|aa)(b|a)
DFA 示例2 —— 能被5整除的二进制数
图中表示的状态其实是余数的状态变化。