【编译原理笔记】3.3 Specification of Tokens
1 正则表达式 Regular Expression
正则表达式是描述词素模式的强大数学工具,用于定义正则语言。
1.1 三个基本组成部分
基础规则:
ε是正则表达式,表示只包含空串的语言{ε}如果a是字母表Σ中的符号,则
a是正则表达式,表示语言{a}
归纳规则(假设r和s是正则表达式):
(r)|(s)表示语言L(r) ∪ L(s)(并集)(r)(s)表示语言L(r)L(s)(连接)(r)*表示语言(L(r))*(Kleene闭包)
优先级规则:
闭包(*) > 连接 > 并集(|)
左结合性
1.2 代数定律
| 定律 | 描述 | 公式 |
|---|---|---|
| 交换律 | 运算可交换 | r|s = s|r |
| 结合律 | 运算可结合 | (r|s)|t = r|(s|t) |
| 分配律 | 连接对的分配 | r(s|t) = rs|rt |
| 单位元 | ε是连接单位元 | εr = rε = r |
| 幂等律 | 闭包幂等 | r* = r |
2 正则定义 Regular Definition
2.1 形式化定义
正则定义是一系列定义序列:
d₁ → r₁d₂ → r₂...dₙ → rₙ
约束条件:
每个dᵢ是新的符号,不在基本字母表Σ中
每个rᵢ是Σ ∪ {d₁, d₂, ..., dᵢ₋₁}上的正则表达式
2.2 实际应用示例
标识符的正规定义:
letter → A|B|...|Z|a|b|...|z|_digit → 0|1|...|9id → letter (letter|digit)*
数值常量的正规定义:
digit → [0-9]digits → digit+number → digits (. digits)? (E [+-]? digits)?
2.3 常用简写符号
正闭包:
r+=rr*(一个或多个r)可选:
r?=r|ε(零个或一个r)字符类:
[abc]=a|b|c范围表示:
[a-z]= 所有小写字母排除类:
[^abc]= 除了a,b,c外的所有字符
2.4 扩展示例
# 使用扩展语法的标识符定义id → [A-Za-z_] [A-Za-z0-9_]*# 使用扩展语法的数值定义 number → [0-9]+ (\. [0-9]+)? (E [+-]? [0-9]+)?
3 转换图 (Transition Diagram)
转换图的基本元素
状态:用圆圈表示,包含状态编号
起始状态:用"start"箭头标识
接受状态:用双圆圈表示
边:带标签的箭头,表示状态转移
