正则文法和正则表达式的相互转化

一、正则表达式转换成正则文法


例1.(a|b)*a(a|b)(a|b)


转换成左线性正则文法:
(1).S->Aa|Ab
(2).A->Ba|Bb
(3).B->Ca
(4).C->Ca|Cb|ε


由观察发现,一个正则表达式转换成左线性正则文法,需要从右边开始分解。
(1).Aa型最简单,为一个连接运算,可化为S->Aa。
(2).A(a|b)型为一个选择运算,根据连接在选择上的分配律,可化为S->Aa|Ab。
(3).Aa*型,根据*运算的定义,可化为S->Sa,S继续作为下一级的非终结符号,若已经分析到最左边,则B->Ba|ε。
(4).递归上述步骤。


转换成右线性正则文法:
(1).S->aS|bS
(2).S->aA
(3).A->aB|bB
(4).B->a|b


由观察发现,一个正则表达式转换成右线性正则文法,需要从左边开始分解。
(1).aA型,可化为S->aA
(2).(a|b)A型,可化为S->aA|bA
(3).a*A型,可化为S->aS,S继续作为下一级的非终结符号,若已经分析到最右边,则B->aB|ε。


总结1:
  (1).由上得知,分解的步骤的书目和操作数有关,N个操作数(单个字符或括号组成的字符),需要分解N步。
  (2).由转换为左线性正则文法和右线性正则文法的过程中得知,连接和选择都较容易,主要在重复运算当中,需要用上一级到非终结符号来继续产生下一级,当处于最后一级时,需要另作处理。




例2.a*aba*a


左线性:
(1).S->Aa
(2).A->Aa
(3).A->Bb
(4).B->Ca
(5).D->Da|ε


右线性:
(1).S->aS
(2).S->aA
(3).A->bB
(4).B->aB
(5).B->a


二、正则文法转换成正则表达式


例3.


(1).S->aS
(2).S->aA
(3).A->bB
(4).B->aB
(5).B->a


两个转换互为逆操作,逆向分析而已。
(1).首先观察得知,该文法为右线性正则文法。
(2).按照转换规则进行串接。
  S->aS => S->a*aA => S->a*abB => S->a*aba*B => S->a*aba*a
  • 16
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值