关闭

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

标签: 正则表达式
4706人阅读 评论(0) 收藏 举报
分类:
一、正则表达式转换成正则文法


例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
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:204720次
    • 积分:2531
    • 等级:
    • 排名:第14610名
    • 原创:49篇
    • 转载:104篇
    • 译文:0篇
    • 评论:8条
    最新评论