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|...|9
id → 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"箭头标识
-
接受状态:用双圆圈表示
-
边:带标签的箭头,表示状态转移