文章目录
该章主要内容:
- 上下文无关文法(CFG)
- Chomsky范式和,Greibach范式
- 确定下推自动机、非确定下推自动机(Pushdown Automaton)
- 对任何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中,一个非终结符经过若干次推导可以推出空字,那么这个非终结符称为可零化的非终结符。
举例
- 从P中去掉 单独非终结符直接产生单独空字 的产生式,去掉后的产生式集记为P’
- 把第一步中去掉的产生式代入其他产生式,把新的产生式加入P’’
- 把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的改写。分别是:
- 去无用符
- 去空字
- 去单产生式
- 去左递归,这里还可以细分为直接递归和间接递归
- 去二义性
而我们今天要继续讲把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范式。