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

原创 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

词法分析——使用正则文法

在我的前一篇文章《按编译原理的思路设计的一个计算器》中,大致讲了编译器的结构及构造思路。 这次把词法分析的部分单独拿出来细讲一下。 一、什么是词法分析 词法分析是编译器的第一个阶段。它输...

右线性文法

优酷笔试题思路用栈实现: 1、在输入1*0*0*1*这样的,#入栈 2、在输入(,|,,直接入栈。在输入 |时候需要判断,前一个必须是# 3、在输入)时候弹出栈,把(。。。)之间的全部弹出,()...

正则文法和上下文无关文法

对于文法G=(V, T, S, P),如果产生式的形式如下:A -> xBA -> x其中A, B属于V,x属于T*,则称为右线性文法;相似的,如果产生式的形式如下:A -> BxA -> x则称为左...
  • Goncely
  • Goncely
  • 2005年12月24日 10:52
  • 12516

正则表达式与上下文无关文法

保留版权,转载需注明出处(潘军彪的CSDN博客http://blog.csdn.net/panjunbiao) 正则表达式 正则表达式在日常开发中时不时都会遇到,我们先来看看正则表达式( Regula...

并查集 之最经典带权问题 食物链NOI

参考博客    推荐博客 题目链接:http://poj.org/problem?id=1182 题目解释: 描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。...

octave/matlab的基本用法

octave是Stanford ML著名公开课指定的软件。 其语法特性和MATLAB几乎一样。 Basic operations elementary operation/math operati...

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

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

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

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

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

本文标签:   正则表达式 正则 正则表达式 序言 好久没写过文章啦,距离自己上一次的记录已经过去了半年多了,也许是工作忙了,也许是自己懒惰了,也许是...最近的工作不怎么忙,心就...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正则文法和正则表达式的相互转化
举报原因:
原因补充:

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