正规式

单词的描述工具-正规式 :多数程序设计语言的单词的语法均可用正规文法来表示。

正规文法 (3型文法) :任一产生式的形式都为A→aB或A→a,其中A∈VN ,B∈VN ,a∈VT * , 正规文法描述的是VT上的正规集。

例:程序设计语言中几类单词的描述规则:标识符、无符号整数、运算符…。

正规式(regular expression也叫正则表达式):正规式是定义正规集的数学工具,是说明单词的模式(pattern)的一种表示法,用它描述单词符号时一般比正规文法更简洁。正规式和正规集 (即其描述的语言) 的定义可以用递归的形式给出。

正规式 :

设∑是有穷字母表,并定义辅助字母表∑’={Φ, ε, | , . , *, (, )}

  1. ε,Φ都是∑上的正规式,它们所表示的正规集为{ε}, Φ ;
  2. 任何a是一个正规式,若a∈∑,它所表示的正规集为{a};
  3. 如果R1和R2是正规式,它们表示的正规集分别为L1和L2,则 R1|R2 , R1·R2 , R1* , (R1) 也是正规式,并且它们所表示的正规集分别为L1∪L2 ;L1L2;L1* ; L1
  4. 仅有有限次使用上述三步骤而定义的表达式才是∑上的正规式,仅有这些正规式表示的字集才是∑上的正规集。

注意:不要混淆Φ和ε,正规表达式ε描述的语言只含一个空字符串ε,而Φ表示的语言不含有任何字符串。
程序设计语言的单词都能用正规式来定义。若两个正规式e1,e2表示的正规集相同,则称它们等价。记作:e1=e2

例 : 令∑={a,b},则∑上的正规式和相应正规集为

正规式正规集
a{a}
a|b{a,b}
ab{ab}
(a|b)(a|b){aa,ab,ba,bb}
a*{ε ,a,aa, ……任意个a的串}
(a|b)*{ε ,a,aa, ……任意个a的串}{ε ,a,b,aa,ab,bb ……所有由 a和b组成的串}
(a|b)* (aa|bb)(a|b)*∑上所有含有两个相继的a或两个相继的b组成的串}

例 : 令∑={a,d},其中a代表字母,d代表数字,则∑上的正规式 r=a(a|d) * 定义的正规集为

{a,aa,ad,add,……}, 即:字母(字母|数字) * ,它表示的正规集中的每个元素的模式是“字母打头的字母数字串”,也就是多数程序语言中标识符的词法规则.

正规式运算规律 :

设r,s,t为正规式,则它们满足如下运算规律:

r|s=s|r
r|(s|t)=(r|s)|t
(rs)t=r(st)
r(s|t)=rs|rt; (s|t)r=sr|tr :或的分配律
εr=r ; rε=r : ε是 “连接”的恒等元素
r|r=r : “或”的抽取律

正规文法和正规式的等价性 :

一个正规语言可用正规文法表示也可用正规式表示,两者具有等价性。通常正规式在描述语言时比正规文法更为简洁。
例如,用正规文法表示标识符的文法规则如下:

<标识符>→ a|b|…|z
|<标识符>a|<标识符>b|…|<标识符>z
|<标识符>0|<标识符>1|…|<标识符>9
而采用正规表达式则为:<标识符>= (a|b|c|…|z){a|b|…|z|0|1|…|9}
或简写成 <标识符>=字母{字母|数字}

将∑上的正规式r转换成正规文法 G=(VN,VT,S,P).令VT= ∑,产生式和VN按如下方法确定:

  • 选择一非终结符S生成类似产生式的形式S→r,并将S定为文法G的识别符。
  • 若x,y是正规式,对形如A→xy的正规式产生式,重写成:A→xB, B→y,B为新选的非终结符。
  • 对形如A→x*y的正规式,重写成: A→xA, A→y。
  • 对形如A→x|y的正规式,重写成: A→x, A→y。
  • 不断利用上述规则做变换,直到每个产生式都符合正规文法的形式即可。

例 :将r=a(a|d)*转换成相应的正规文法

将正规文法转换为正规式 :

基本上是正规式到正规文法转换过程的逆过程。可反复采用以下三条规则,直到只剩下一个开始符号定义的正规式为止。

  • 产生式A→xB, B→y对应正规式A=xy;
  • 产生式A→xA|y对应正规式A=x*y;
  • 产生式A→x, A→y对应正规式A=x|y;

例 :将G[S]转换为正规式

S→aA
S→a
A→aA
A→dA
A→a
A→d

由文法G[S]得
S=aA|a
A = aA|dA|a|d
  =(aA|dA)|(a|d)
  =(a|d)A|(a|d)
  =(a|d)*(a|d)
  = (a|d)+
则
S= a(a|d)+|a
 = a((a|d)+|ε)
 = a(a|d)*
  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值