【编译原理笔记】3.3 Specification of Tokens

1 正则表达式 Regular Expression

正则表达式是描述词素模式的强大数学工具,用于定义正则语言

1.1 三个基本组成部分

  1. 基础规则

    • ε 是正则表达式,表示只包含空串的语言 {ε}

    • 如果a是字母表Σ中的符号,则a是正则表达式,表示语言 {a}

  2. 归纳规则(假设r和s是正则表达式):

    • (r)|(s) 表示语言 L(r) ∪ L(s)(并集)

    • (r)(s) 表示语言 L(r)L(s)(连接)

    • (r)* 表示语言 (L(r))*(Kleene闭包)

  3. 优先级规则

    • 闭包(*) > 连接 > 并集(|)

    • 左结合性

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 常用简写符号

  1. 正闭包r+ = rr*(一个或多个r)

  2. 可选r? = r|ε(零个或一个r)

  3. 字符类[abc] = a|b|c

  4. 范围表示[a-z] = 所有小写字母

  5. 排除类[^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"箭头标识

  • 接受状态:用双圆圈表示

  • :带标签的箭头,表示状态转移

相关推荐
浩瀚地学1 小时前
【Java】JDK8的一些新特性
java·开发语言·经验分享·笔记·学习
JeffDingAI1 小时前
【Datawhale学习笔记】深入大模型架构
笔记·学习
a不是橘子2 小时前
03在Ubuntu中验证PV操作
笔记·ubuntu·操作系统·虚拟机·os·pv操作
tangyal2 小时前
渗透笔记1
笔记·网络安全·渗透
fanged3 小时前
STM32(5)--HAL1(TODO)
笔记
grd45 小时前
RN for OpenHarmony 小工具 App 实战:屏幕尺子实现
笔记·harmonyos
丝斯20115 小时前
AI学习笔记整理(50)——大模型中的Graph RAG
人工智能·笔记·学习
小+不通文墨6 小时前
“超声波测量声速”实验报告
经验分享·笔记·学习·学习方法
lihao lihao7 小时前
平衡二叉树
笔记
JavaLearnerZGQ7 小时前
我的Redis笔记2【分布式缓存】
redis·笔记·缓存