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

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

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

相关推荐
北岛寒沫31 分钟前
北京大学国家发展研究院 经济学辅修 经济学原理课程笔记(第十五章 劳动力市场)
经验分享·笔记·学习
丝斯201137 分钟前
AI学习笔记整理(37)——自然语言处理的基本任务
人工智能·笔记·学习
代码游侠2 小时前
复习——网络基础知识
网络·笔记·网络协议·算法·http
我命由我123452 小时前
Photoshop - Photoshop 工具栏(46)渐变工具
经验分享·笔记·学习·ui·职场和发展·学习方法·photoshop
diegoXie3 小时前
【R】tidyr::pivot_longer / pivot_wider 学习笔记
笔记·学习·r语言
AI视觉网奇3 小时前
ue metahuman 数字人换装笔记MetaTailor
笔记
ljt27249606613 小时前
Compose笔记(六十五)--插槽模式
android·笔记·android jetpack
d111111111d3 小时前
STM32平衡车测试,定时中断读取速度
笔记·stm32·单片机·嵌入式硬件·学习·模块测试
lkbhua莱克瓦243 小时前
基础-事务
开发语言·数据库·笔记·mysql·事务
潲爺4 小时前
《Java 8-21 高频特性实战(上):5 个场景解决 50% 开发问题(附可运行代码)》
java·开发语言·笔记·学习