形式语言与自动机——第三章 上下文无关文法与下推自动机

该章主要内容:

  1. 上下文无关文法(CFG)
  2. Chomsky范式和,Greibach范式
  3. 确定下推自动机、非确定下推自动机(Pushdown Automaton)
  4. 对任何CFA都能找到一种具有特有形式 的等价CFG(Context-Free Grammar)

上下文无关文法对应的识别器是下推自动机。

确定的下推自动机对应于上下文无关语言的一个子集(大部分的程序设计语言)。

3.1 推导树与二义性

定义:Tree是CFG G=(N,T,P,S)的语法树,是一颗有序树。

  • 树根:S
  • 枝结点是非终结符
  • 叶子结点是终结符或ε
  • 枝特点A有直接子孙x1x2…xi,则A→x1x2…xi

例:G=({E},{+,*,i,(,),},P,E)
E→ E+E|E*E|(E)|i

句子:(a*a+a)

定义:CFG G=(N,T,P,S)如果存在,S ω G是有一棵叶子为ω的语法树

定义:CFG G是二义的 等价于 ω∈L(G),有两棵不同的语法树(叶子为ω)

定义:CFG G是二义的 等价于 ω∈L(G),有两T不同的最 左(右)推导

文法二义无法推出语言二义,语言二义可以推出其文法均二义

文法的二义性的举例
在这里插入图片描述
左边的树在展开的时候先展开运算符,右边的树在展开的时候先展开+运算符,如果运算的定义无结合律则会存在二义性。23+5=11;2*(3+5)=16

3.2 上下文无关文法的改写

我们约定俗成:大写为非终结符,小写为终结符

为了解决文法可能存在的二义性问题,我们引入上下文无关文法的改写。在不改变文法描述能力前提下改写文法满足一定要求。改写目标:将CFG改写成某种标准形式.

(1) 改写成Chomsky范式: A→ BC|a A,B,C∈N a∈T

(2) Greibach范式 A→ a阿尔法 阿尔法∈N*, a∈T

3.2.1 CFG的最简化

但是在改写之前我们必须要做一件事,就是CFG的最简化

我们要分别有用符号和无用符号。

在这里插入图片描述
补充:START
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
END
4月29日 录播 1:10:54
在这里插入图片描述

在这里插入图片描述

3.2.2 CFG的变换

到这里我们来总结一下上面的内容。我们的目标是去除文法的二义性,首先要去除无用符号,接下来要去除可零化的终结符。我们这节就来说“去除可零化的非终结符”。

3.2.2.1 去除可零化的非终结符

定义:若在CFG中,一个非终结符经过若干次推导可以推出空字,那么这个非终结符称为可零化的非终结符
在这里插入图片描述
举例

在这里插入图片描述

  1. 从P中去掉 单独非终结符直接产生单独空字 的产生式,去掉后的产生式集记为P’
  2. 把第一步中去掉的产生式代入其他产生式,把新的产生式加入P’’
  3. 把P’’ 并入 P’,再加入新的非终结符,假如为S’,再把S’推出S和S’推出空字加入P’

则最终结果是G’ = ({S, S’}, {a,b},P’,S’)

具体推导过程参加腾讯课堂录播“文法改写”第1:35:00

补充:这个办法有点生搬硬套了,一般方法参见https://www.bilibili.com/video/BV1oE4116794?p=24,9分04秒。
在这里插入图片描述

3.2.2.2 去除单产生式

单产生式形如 “A → B”,且AB均属于N。

当G是无空字产生式的CFG,但存在单产生式,可以利用算法2构成一个无单产生式的等效方法G1。
在这里插入图片描述
例子
在这里插入图片描述
在这里插入图片描述

视频“文法改造2:03:00”,

补充:参照https://www.bilibili.com/video/BV1oE4116794?p=24,9分04秒

3.2.2.3 去除左递归(递归文法)

在这里插入图片描述

3.3 chomsky范式、greibach范式

我们先来总结一下上面的内容,从头到尾其实都在说CFG的改写。分别是:

  1. 去无用符
  2. 去空字
  3. 去单产生式
  4. 去左递归,这里还可以细分为直接递归和间接递归
  5. 去二义性

而我们今天要继续讲把CFG转化为C范式或G范式。

3.3.1 改写为chomsky范式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

补充:
在这里插入图片描述

3.3.2 改写为greibach范式

定义:

在这里插入图片描述

由于在改写为G范式之前还要再消一次左递归,详情见视频G范式34min46s

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正文

方法一:直接转法
从CFG直接转成G范式
参见https://www.bilibili.com/video/BV1oE4116794?p=25,视频最后一个例题。

方法一:两步转法
我们先从CFG改写为C范式,再有C范式改写为G范式。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值