词法分析与正则文法(二)

本文详细介绍了正则表达式的定义及其与产生式的关系,包括集合运算、正则表达式的各种构造方式,如并、连接和自连接等,并讨论了如何将正则表达式转换为产生式。此外,还提到了其他词法记号的定义,如变量标识符、数值常量的产生式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合的运算

设L和D都是某些字符串的集合,定义

LD为两个集合的并。
LD为两个集合的连接,即LD={αβ:αL,βD}
Lk为两集合L的k次自连接。例如L3=LLL=(LL)L。特别地,记L0={ϵ},其中ϵ为我们常提到的空串。
L=k=0Lk为L的所有有限次自连接的并。

正则表达式的定义

Σ是一个非空字符集。那么在该字符集上满足下面条件的表达式,成为正则表达式。

空表达式是正则表达式,它对应的语言为{ϵ}
任意的aΣ有a为正则表达式,它对应的语言为{a}
如果r和s是正则表达式,那么(r)|(s)是正则表达式,它对应的语言为L(r)L(s)其中L(r)L(s)分别为r和s对应的语言。
如果r和s是正则表达式,那么(r)(s)是正则表达式,它对应的语言为L(r)L(s)
如果r是正则表达式,那么(r)是正则表达式,它对应的语言为(L(r))

根据上面的定义,若r是正则表达式,我们有
r?=ϵ|r是正则表达式,它代表满足模式r的字符串出现0次或一次。
r+=rr是正则表达式,它代表满足模式r的字符串出现至少一次。
r{n,m}=rn|rn+1|rn+2|...|rm是正则表达式,它代表满足模式r的字符串出现至少n次且至多出现m次,其中nm

正则表达式与产生式的关系

一个正则表达式可以定义一个字符串集合,而一个字符串集合,就可以定义成一种语言。我们知道,产生式就是用来定义语言的。接下来,我们将证明,任何正则表达式,都可以通过相应的产生式来定义。

空正则表达式对应的产生式为空产生式

Vϵ

对于任意的aΣ,表达式a对应的产生式为

Va

设r是正则表达式,则表达式r对应的产生式为

VϵVRVRr

其中Rr表示的是与表达式r相对应的产生式组成的集合。

设r和s是正则表达式,则表达式rs对应的产生式为

VRSRrSs

设r和s是正则表达式,则表达式r|s对应的产生式为

VrVs

其他词法记号的定义

有了正则表达式的定义以后,其他词法记号的定义可以很容易给出。

我们先定义一些字符集合。记<letter>为所有大小写字母组成的集合。记<digit>数字组成的集合。记<ascii>为所有ascii字符组成的集合。注意这些ascii字符都是指它的可打印形式。例如,制表符为‘\t’或者‘\009’。

变量标识符,它对应的产生式为

<id>(<letter>{_})(<letter>{_}<digit>)

数值常量,它对应的产生式为

<numconst>{+,}?<digit>+

<numconst>{+,}?<digit>+.<digit>

<numconst>{+,}?.<digit>+

注意:在一般的正则表达式规定中,会用中括号[]来描述一个集合,用句点.表示匹配任何一个字符。在我们上面三个产生式中,用花括号{}来描述集合,而句点(.)是普通字符。
上面3个产生式中,第一个产生式生成整数(无小数点),第二个产生式生成包含整数部分的浮点数,第三个产生式生成不包含整数部分的浮点数。

字符常量和字符串常量的定义比较简单。

<charconst><ascii><stringconst>"<ascii>"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值