词法分析器架构
词法分析器(Scanner)的核心组件:
- 输入缓冲:管理源程序字符流
- 预处理:过滤注释、空白字符、宏展开
- 扫描器:基于 DFA 识别单词
- 符号表:存储标识符等属性信息
- 属性字:输出单词的二元组 种别码, 属性值
两种实现方法
表驱动法(数据驱动)
用状态转移矩阵 + 子表 + 三个寄存器实现:
- 状态寄存器:记录当前 DFA 状态
- 输入寄存器:存放当前输入字符
- 指针寄存器:指向输入串当前位置
主表(状态转移矩阵)+ 子表(不同词法单元的子 DFA),查表完成状态转移。优点是灵活易修改,缺点是查表开销大。
程序中心法(程序驱动)
将每个状态实现为一个函数或代码段,状态转移通过函数调用或 goto 实现:
state0:
c = nextchar();
if (is_digit(c)) goto state1;
if (is_letter(c)) goto state2;
...优点是执行效率高,缺点是状态增加时代码维护困难。
重点 两种实现方法的对比:表驱动法灵活、程序中心法高效。
最长匹配规则
当多个正规式匹配同一前缀时,选择匹配最长输入串的词法单元。
示例(、、 三个正规式的合并 DFA):
- 输入
+匹配 - 输入
++匹配 (不是先匹配 再匹配 ) - 输入
+=匹配
实现方式:合并各词法单元 DFA,读入字符尽可能多,直到无法继续转移时确定匹配。
重点 最长匹配规则解决多正规式冲突,尽可能多地读入字符。