1. 词法分析的作用
1.1 常见的概念
- 词素
- 词法单元
1.1.2 词法单元的属性
一个模式匹配多个词素时,必须通过属性来传递附加的信息。属性值会被用于语义分析、代码生成等阶段
- 不同的目的需要不同的属性,所以属性值通常是一个结构化数据
2. 词法单元的规约(正则表达式)
- 模式:词法单元对应的词素可能具有的形式
- 可以用正则表达式来表示
2.1 相关概念
字母表:所有合法输入的集合
串:字母表中符号组成的又穷序列
- 串的运算
2.2 正则表达式
是一种描述词素模式的重要表示方法
- 正则表达式可以由较小的正则表达式递归构建
例子:
性质:
- 如果两个正则表达式表示同样的语言,则r = s
- 扩展运算符
3. 词法单元的识别
词法分析器要求能够检查舒服的字符串,在前缀中找出和某个模式匹配的词素
3.1 状态转换图
状态转换图:实现模式匹配的最好的方法
例子
保留字和标识符的识别
- 很多时候程序设计语言的保留字也符合标识符的匹配模式
- 所以需要在符号表中预先填写保留字,指明它们并不是普通的标识符
- 为保留字建立单独的状态转换图,并设定保留字的优先级高于标识符
3.2 有穷自动机
本质上等价于状态转换图
区别在于:
- 自动机是识别器,对每个输入串回答 yes or no
分为两类:
NFA:不确定
DFA:确定
3.2.1 不确定的有穷自动机
NFA 由以下几部分组成
- 一个有穷的状态集合S
- 一个输入符号集合Σ(input alphabet)
- 转换函数(transition function)对于每个状态和Σ ∪ {ε}中的符号,给出相应的后继状态集合
- 一个状态S0被指定为开始状态/初始状态
- S 的一个子集 F 被指定为接受状态
自动机对输入字符串的接受
判断输入字符串能否到达终点,能到达则代表匹配
3.2.2 确定的有穷自动机DFA
4. 正则表达式到自动机
正则表达式可以简洁、精确地描述词法单元的模式
- 所以需要将正则表达式转换为自动机
步骤:
- 正则表达式到 NFA
- NFA 到 DFA
4.1 NFA 转换为 DFA——子集构造法
对 NFA 的模拟往往不如对 DFA 的模拟直接,除非转换花费更多的时间
- 理论上,最坏情况下DFA的状态个数会是NFA状态个数的指数多个。但是对于大部分应用,NFA和相应的DFA的状 态数量大致相同
4.2 正则表达式到 NFA
输入:字母表Σ上的一个正则表达式 r
输出:一个接受 L (r) 的 NFA N
- 基本思想
- 归纳规则