【编译原理笔记】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"箭头标识

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

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

相关推荐
β添砖java3 小时前
2025最新快速构建企业级虚拟专用网络环境学习笔记
笔记·学习
qianpeng43 小时前
IDA PRO笔记
笔记
Yang_jie_037 小时前
笔记:数据结构(顺序表)
数据结构·windows·笔记
Tom@敲代码10 小时前
js学习笔记-01
javascript·笔记·学习
巴巴媛66611 小时前
STM32学习笔记【32.BKP + RTC】
笔记·stm32·学习
能摆一天是一天12 小时前
Spring ai vectorstore 使用本地模型导致只能匹配可行度为1.0的内容的解决方法笔记
java·笔记·spring
进阶的DW13 小时前
Wiki + Graph + RAG 知识库建设笔记2
笔记
AOwhisky13 小时前
Linux(CentOS)系统管理入门笔记(第四期)——文件系统(下篇):文件与目录操作实战——cpmvmkdirrmln
linux·运维·笔记·centos·云计算·文件系统
bmy-happy13 小时前
网安专业课程笔记sale
笔记
浩瀚地学14 小时前
【Java基础复习】IO流(二)
java·开发语言·经验分享·笔记·学习