形式语言与自动机_课件_陈有祺第04章 正则表达式.ppt

形式语言与自动机_课件_陈有祺第04章 正则表达式.ppt

  1. 1、本文档共53页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 正则表达式 正则表达式的定义 正则表达式和有穷自动机的关系 正则表达式的等价变换 正则表达式的应用 正则表达式的定义 定义 4.1 设∑是一个字母表,∑上的正则表达式以及由它们代表的集合,递归地定义如下: (1) φ是一个正则表达式,它代表空集。 (2) ε是一个正则表达式,它代表集合{ε}。 (3) 对于∑中每个符号a , a是正则表达式,它代表集合{a}。 (4) 如果r和s是正则表达式,它们分别代表集合R和S,则(r+s),(rs)和(r*)是正则表达式,并分别代表集合R∪S, RS和R*。 正则表达式R代表的集合记为L(R)。 正则表达式的定义 例4.3 给出∑={a,b},则对∑上的一些正则表达式与它们各自所代表的集合列表示于图4.1中: 正则表达式的定义 为了尽量减少括号,我们做如下的约定: (1)每个正则表达式最外层的一对括号可以省略。 (2)规定正则表达式构造的优先次序为: ① * 最高级 ② 连接(如 rs ) 次高级 ③ + 最低级 凡是符合此种顺序的,括号可以省略。 (3)同一种构造(如同为 +,连接或 *)连续出现时,规定从左到右依 次构造,中间的括号可以省略。 例如((0(1*))+0)就可写成01*+0,(((a*)(b)(a*))就可写成a*ba*。但是,(a+b)* 不可写成a+b*,因为前者表示先构造(a+b),后构造(a+b)*,结果代表集合{a,b}*;而后者根据优先次序的约定,表示先构造b*, 再构造a+b*,结果代表集合{a,{b*}};这两个集合显然是不相等的。 正则表达式的定义 0*1+1*0,为什么是一个正则表达式,它代表的集合应该是什么? 根据定义,因为字母表是{0,1},所以其字母0和1本身都是正则表达式,它们代表的集合分别是{0}和{1};然后由0构造(0*),由1构造(1*),得到两个新的正则表达式,它们代表的集合分别是{0}*和{1}*;再由(0*)和1连接,得到((0*)1), 由(1*)和0连接,得到((1*)0),它们代表的集合分别是{0}*{1}和{1}*{0};最后由((0*)1) 和((1*)0)这两个正则表达式通过“+”号,构造出正则表达式(((0*)1)+((1*)0)) 它们代表的集合就是{0}*{1}∪{1}*{0}。 正则表达式的定义 正则表达式中括号对的个数和构造这个正则表达式时所用的构造次数是相等的。以0和1为基础,构成正则表达式(((0*)1)+((1*)0))的过程,总共用了5次构造,其中用了两次“*”构造,两次“连接”构造,一次“+”构造。而正则表达式(((0*)1)+((1*)0))中,正好有5对括号。 其次,我们还可以看出,正则表达式和它所代表的集合形式上有很大的相似性。大致上,正则表达式的“+”相当于集合中的并运算符“∪”,正则表达式的“*”与集合中的闭包运算符一致,正则表达式的“连接”相当于集合的连接运算。 正则表达式(((0*)1)+((1*)0))中的括号是如何被逐步省略掉的。根据约定,首先最外层括号可以去掉,变成((0*)1)+((1*)0);然后根据构造的优先次序,“*”的优先级高于“连接”的优先级,所以(0*)与1连接和(1*)与0连接都不用打括号,这就使正则表达式变成(0*1)+(1*0);再根据构造的优先次序,“连接”的优先级高于“+”的优先级,这最后一对括号也可以省略,正则表达式变成了最简单的形式0*1+1*0,这正是我们在例4.1中所给出的。 正则表达式的定义 例4.4 构造一个正则表达式,使它能代表十进制正整数的集合。 十进制正整数,根据正则表达式的表现方式,可以用R=(0+1+2+3+4+5+6+7+8+9)* 来表示。 但有两点欠缺: 包含有空串ε; 包含有由若干个0开头的串。 使之变为(1+2+3+4+5+6+7+8+9)(0+1+2+3+4+5+6+7+8+9)*,这个正则表达式代表的集合是{1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}*, 要构造一个正则文法(3型文法)产生上述的十进制正整数的集合,至少需要29个产生式;要构造一个接受上述集合的DFA , 至少需要3个状态和30个δ函数;要构造一个接受上述集合的NFA,也至少需要两个状态和19个δ函数。 正则表达式的定义 例4.5 构造一个正则表达式,使它能代表如下的集合S:S的每个元素都是倒数第十个字符是1的0、1串。 即使构造一个NFA接受这个S,也要设11个状态和20个δ函数,若是用DFA那就更复杂了。要用一个正则表达式来代表S,变得简单多了。 这个正则表达式就是: (0+1

文档评论(0)

朋友你好 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档