编译原理-词法分析02-正则表达式
0.术语
r
r:正则表达式,表示字符串的格式。
L(r)
r所匹配的串的集合。
symbol符号
L(r)中的元素称为符号。
alphabet字母表
表示符号的字符的集合。用 ∑ (sigma)表示。
元字符metacharacter,元符号metasymbol
它们非字母表中的字符,是一些特殊意义的字符,比如,*. 如果要匹配这类符号,则需要使用转义符号\。
escape character转义字符
一般使用\表示,用于匹配元字符。
空串empty string
不包含任何字符的串,但它仍然是一个匹配。用ε(eplsilon)表示
空集empty set
表示正则表达式无任何匹配。
regular definition正则定义
即正则表达式的名字。
1.正则表达式的定义
正则表达式是以下中的一种:
- 基本正则表达式由单个字符a(其中a在正规字符的字母表 ∑ 中),以及元字符ε或元字符 Φ。 分别表示为:
- L(a) = {a};
- L(ε) = {ε};
- L(Φ) = {}.
- r|s格式的表达式:其中r和s均是正则表达式。在这种情况下:L(r|s) = L(r)|L(s)。
- rs格式的表达式:其中r是正则表达式。在这种情况下:L(rs) = L(r)L(s)。
- r格式的表达式:其中r是正则表达式。在这种情况下:L(r) = L(r)*。
- (r)格式的表达式:其中r是正则表达式。在这种情况下:L((r)) = L(r),因此,括号并不改变语言,它们只调整运算的优先级。
注意到这个定义中,|,*,(,),Φ,ε均为元字符。
2.扩展
-
r+ 正闭包,至少匹配一个
-
. 匹配任意一个字符
-
区间匹配 如[a-z],[0-9],[A-Za-z]
-
~a或^a 排除匹配
-
r? 可选匹配
3.程序语言记号的正则表达式
- number
nat = [0-9]+ #自然数
signedNat = (+|-)?nat #有符号数
number = signedNat("."nat)?(E signedNat)? #数字,包含整数,小数,正负数,指数
- reserved & identifier
reserverd = if | while | then | repeat | do ...
letter = [a-z]
digit = [0-9]
identifier = letter(letter|digit)*
- comment
{(~})*} #匹配{ this is a Pascal comment}
-
whitespace
解决匹配的二义性遵循最长子串原理principle of longest。
whitespace = (newline | blank | tab | comment) *
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· DeepSeek 全面指南,95% 的人都不知道的9个技巧(建议收藏)
· 对比使用DeepSeek与文新一言,了解DeepSeek的关键技术论文
· Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
· DeepSeekV3+Roo Code,智能编码好助手
· AI编程:如何编写提示词