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

原创 2012年03月25日 20:55:48
一、正则表达式转换成正则文法


例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
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

转义字符\(在hive+shell以及java中注意事项):正则表达式的转义字符为双斜线,split函数解析也是正则

转义字符将后边的字符转义,各个语言中都用应用,如java、python、sql、hive、shell等等。 如sql中 "\"" "\'" "\...

对正则刚入门初学的开发者来说有用的正则表达式的语法详解

本文标签:   正则表达式 正则 正则表达式 序言 好久没写过文章啦,距离自己上一次的记录已经过去了半年多了,也许是工作忙了,也许是自己懒惰了,也许是...最近的工作不怎么忙,心就...

转余晟老师的正则专栏文章:(四)正则表达式的与或非

我们使用正则表达式,熟练掌握各种功能和结构只是手段,解决实际的问题才是真正的目的。要解决真正的问题,就必须有解决问题的思路,正则表达式的功能,说到底,可以归纳为三种逻辑,为了表述方便,我们分别称为与、...
  • cj205
  • cj205
  • 2011-04-06 23:33
  • 2658

PHP与正则表达系列之一: PHP 中的正则表达式

PHP与正则表达系列之一: PHP 中的正则表达式 PHP5研究室 2008年01月13日 16:41 查看34304次 作者: esayr, LEO  【大 中 小】 文章分类:PHP技...

java 正则式,正则表达式,多行匹配,不以某某开头,不区分大小写,2个单元的或操作

java 正则式,正则表达式,多行匹配,不以某某开头,不区分大小写,2个单元的或操作
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)