编译原理--正则文法与正则表达式

本文介绍正则文法与正则表达式的相互转换方法。包括从正则文法推导正则表达式的过程及示例,以及从正则表达式构建正则文法的步骤。

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

  • 对任何正则文法G,存在定义同一语言的正则表达式r
  • 对任何正则表达式r,存在生成同一语言的正则文法G

正则文法到正则表达式的转换

  1. 将正则文法中的每个非终结符表示成关于它的一个正则表达式方程,获得一个联立方程组
  2. 依照求解规则:
    • x=αx∣βx=\alpha x | \betax=αxβ(若x=αx+βx=\alpha x + \betax=αx+β),则解为:x=α∗βx=\alpha^*\betax=αβ
    • x=xα∣βx=x\alpha | \betax=xαβ(若x=xα+βx=x\alpha + \betax=xα+β),则解为x=βx∗x=\beta x^*x=βx

以及正则表达式的代数定理,求文法开始符号的正规式方程组的解。这个解释关于该文法开始符号S的一个正规式。

例:

设有正则文法G:
Z→0A Z \to 0A Z0A

A→0A∣0B A \to 0A | 0B A0A0B

B→1A∣ϵ B\to 1A|\epsilon B1Aϵ

试给出该文法生成语言的正则表达式

  • 首先给出相应正则表达式方程组(即用+代替正则表达式|

Z→0A Z \to 0A Z0A
2.
A→0A+0B A \to 0A + 0B A0A+0B
3.
B→1A+ϵ B\to 1A+\epsilon B1A+ϵ

将3式代入2式中得,
4.
A=0A+01A+0 A = 0A + 01A + 0 A=0A+01A+0
对4式利用分配率:
5.
A=(0+01)A+0 A = (0+01)A + 0 A=(0+01)A+0

对5式使用求解规则
6.
A=(0+01)∗0 A=(0+01)^*0 A=(0+01)0

将式6代入式1中的A得:
Z=0(0+01)∗0 Z=0(0+01)^*0 Z=0(0+01)0

正则表达式到正则文法的转换

字母表∑\sum上的正则表达式到正则文法G=(VN,VT,P,S)G=(V_N, V_T,P,S)G=(VN,VT,P,S)的转换方法如下:

  • VT=∑V_T=\sumVT=
  • 对任意正则表达式R选择一个非终结符Z生成规则Z→RZ \to RZR,并令S=ZS=ZS=Z
  • aaabbb都是正则表达式,对形如A→abA\to abAab的规则转换成A→aBA \to aBAaBB→bB\to bBb两规则,其中B是新增的非终结符
  • 在已转换的文法中,将形如A→a∗bA \to a^*bAab的规则进一步转换成A→aA∣bA \to aA | bAaAb
  • 不断利用第三和第四条规则进行变换,直到每条规则最多含有一个终结符

例如:

R=(a∣b)(aa)∗(a∣b)R=(a|b)(aa)^*(a|b)R=(ab)(aa)(ab)转换成相应的正则文法

AAA是文法开始符号,根据第二条规则可变换为:
A→(a∣b)(aa)∗(a∣b) A \to (a|b)(aa)^*(a|b) A(ab)(aa)(ab)

根据第三条规则变换为:

A→(a∣b)B A \to (a|b)B A(ab)B

B→(aa)∗(a∣b) B \to (aa)^*(a|b) B(aa)(ab)

根据第四条规则变换为:
A→aB∣bB A \to aB|bB AaBbB

B→aaB∣a∣b B \to aaB|a|b BaaBab

根据第五条规则变换为:
A→aB∣bB A \to aB|bB AaBbB

B→aC∣a∣b B \to aC|a|b BaCab

C→aB C\to aB CaB

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值