1023-编译原理正则表达式

本文深入探讨了正则表达式的定义及其在C语言中表示无符号整数的应用。正则语言与正则表达式通过等价的正则文法进行阐述,同时介绍了有穷自动机(FA)的基本概念,包括DFA和NFA的模型、转换及错误处理策略。重点讨论了如何从正则表达式构建NFA,以及通过子集构造法将NFA转换为DFA,用于识别如标识符、无符号数、各进制整数和注释等特定语言结构的DFA设计。

正则表达式

在这里插入图片描述

正则表达式的定义

在这里插入图片描述

在这里插入图片描述

例:C语言无符号整数的RE

在这里插入图片描述

正则语言

可以用RE定义的语言叫做
正则语言(regular language)或正则集合(regular set)

RE的代数定律

在这里插入图片描述

正则文法与正则表达式等价

在这里插入图片描述

正则定义(Regular Definition)

在这里插入图片描述
例1
在这里插入图片描述
例2

### 编译原理正则表达式的定义 在编译原理里,正则表达式(Regular Expression, RE)被用来描述一类特定形式的语言结构。能够用RE定义的语言被称为正则语言或正则集合[^2]。 对于任意给定的字符集Σ上的正则表达式遵循如下规则构建: - ε 表示空串; - a ∈ Σ 表达单个字符a; - 如果r和s都是Σ上的正则表达式,则(r | s),(rs),以及(r*)也均为该字符集上的正则表达式;其中'|'代表选择操作,'*'表示Kleene闭包即零次或多次重复前项,而并置(rs)意味着连续发生两项。 这些基本单元通过逻辑运算符组合起来形成复杂的模式匹配条件,从而允许简洁地表述一系列可能的输入序列特征。 ### 正则表达式的性质 关于正则表达式的几个重要特性包括但不限于以下几个方面: - **交换律**:`r | s = s | r`,表明选项之间可以互换顺序而不影响最终识别的结果。 - **结合律**:无论是选择还是连接操作都满足结合性原则,比如 `r | (s | t)` 等同于 `(r | s) | t`; 同样地有 `r(st)=(rs)t`. - **分配率**:当涉及到混合使用选择与连接时适用此规律——具体来说就是 `r(s|t)=rs|rt`. 另外值得注意的是ε作为特殊的单位元素,在乘积运算下保持不变形,即无论左侧还是右侧附加它都不会改变原有表达式的含义\[r\epsilon=\epsilon r=r\]. ### 应用场景 正则表达式广泛应用于词法分析阶段,帮助解析器识别源代码中的单词(token)。例如,关键字、标识符、常量等都可以由相应的正则表达式精确刻画出来。除此之外,还经常用于验证用户输入的有效性和格式校验等方面的工作当中。 ```python import re # 假设我们要查找所有的整数或者浮点数 pattern = r'\d+(\.\d+)?' text = "The price is 19.95 dollars and the quantity is 47" matches = re.findall(pattern, text) for match in matches: print(match) ``` 上述例子展示了如何利用Python内置库`re`来执行基于正则表达式的搜索任务。这里使用的模式`\d+(\.\d+)?`旨在捕捉任何形式的小数或是纯整数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值