形式语言与自动机_4

形式语言与自动机_4

第四章 上下文无关文法与下推自动机

上下文无关文法:CFG(contex free grammar)
2型文法,产生式形如A->a,A$\in$N

几种文法的特点整理

对应的识别器:下推自动机
PDA(push down Automata)
PDA由输入带,有限控制器和下推栈组成
1

归约和推导

推理字符串是否属于文法所定义的语言

  • 一种是自下而上的方法,称为递归推理(recursive inference),递归推理的过程习称为归约;
  • 一种是自上而下的方法,称为推导(derivation).
  • 归约过程 将产生式的右部(body)替换为产生式的左部( head ).
  • 推导过程 将产生式的左部( head )替换为产生式的右部( body )

例子:
归约
推导

  • 最左推导(leftmost derivations)
    若推导过程的每一步总是替换出现在最左边的非终结符。
    l
  • 最右推导(rightmost derivations)
    若推导过程的每一步总是替换出现在最右边的非终结符。
    r

推导树和文法的二义性

推导树

用图的方法表示一个句型的推导,这种图称为推导树(也称语法树或语法分析树)
文法的起始符为根,树的枝结点标记是非终结符,叶结点标记为终结符或$\sigma$。
若枝结点有直接子孙x1, x2,…, xk,则文法中有生成式A→x1x2…xk
li
tu
推导树是对文法G中一个特定句子形式的派生过程所做的一种自然描述。

  • 边缘
    叶子从左向右组成的字符串称为推导树的边缘。

归约、推导与分析树之间关系

归约
归约
推导
推导
关系
关系
证明2->5:
设2型文法G=(N,T,P,S),如果存在S推导出ω,当且仅当文法G中有一棵边缘为ω的推导树。

二义性

2型文法是二义的,当且仅当对于句子ω∈L(G),存在两棵不同的具有边缘为ω的推导树。
(即:如果文法是二义的, 那么它所产生的某个句子必然能从不同的最左(右)推导推出)。

  • 可有二个文法,一个有二义,一个无二义,但产生相同的语言.
  • 可否通过变换消除二义性? —— 无一般的算法!

上下文无关文法的变换

  1. CFG 的简化
    • 消无用符号
    • 消$\varepsilon$产生式
    • 消单产生式
  2. 对生成式形式进行标准化

生成式的标准形式:

  1. Chomsky范式 :
    CNF - Chomsky Normal Form
    CNF
  2. Greibach范式:(GNF)
    GNF

消去无用符号

有用符号X

X

  • 生成符号 generating symbol
    生成符号
  • 可达符号 reachable symbol
    可达符号

无用符号

  • 非生成符号
  • 不可达符号

消去无用符号的步骤

  • 计算生成符号集
  • 计算可达符号集
  • 消去非生成符号、不可达符号
  • 消去相关产生式

计算生成符号

思路
思路
算法1:找出有用非终结符
算法1
算法1图示:
图示
一层层向外扩展,直至最外两层相等为止。所得集合即是算法1的有用符号。

计算可达符号集

思路
计算可达符号集
算法2:找出有用符号(从S出发可达的符号)
算法2
图示
图示

一个例子

lizi
注意:在删除一个无用符号时,要把与它相关的式子也删掉。
并且,一定要先执行算法1,保证每个符号是生成符号,再执行算法2,保证每个符号是可达符号。否则可能会导致一些无用符号无法消除。(这个例子就是不这么干的反例)

一个定理:
任何非空的上下文无关语言,可由不存在无用符号的上下文无关语言产生(证明略)

消去$\varepsilon$产生式

目的:方便文法的设计, 利于文法规范化.
影响:消去$\varepsilon$产生式, 除了文法不能产生字符串$\varepsilon$外,不会影响到原文法相应的语言中其它字符串的产生.

可致空符号

nullable symbol
可致空符号

算法3: 生成无$\varepsilon$文法

定义:若G的生成式中无任何$\varepsilon$产生式,或只有一个生成式S→$\varepsilon$且S不出现在任何生成式的右边,则称G为无$\varepsilon$文法。

思路:

思路

算法步骤

算法步骤

2
例子:
lizi

消去单产生式

什么是单产生式
单产生式 形如 A->B 的产生式,其中A、B 为非终结符.
目的:
可简化某些证明,减少推导步数, 利于文法规范化.

单元偶对 unit pairs

unit pairs

消去单产生式的算法

思路

思路

算法步骤

算法步骤
$N_A$可以理解成所有和A是单元偶对的非终结符的集合
算法步骤2

例子

例子
例子2
例子3

小结

小结
注意 以上简化步骤的次序.
设 CFG G 的语言至少包含一个非  的字符串,通过上述步骤从 G 构造 G1 ,则有 L(G1)= L(G) - {$\varepsilon$}.
必须按照顺序的原因:
消去空生成式的时候,可能会引入一些单生成式,而消除单生成式的时候又可能引入一些无用符号。

消除递归

递归定义:
dingyi

生成式的代换

引理1:
引理1
一个小例子:
一个小例子:

消除直接左递归

引理2
引理2
例子:
例子:

为什么要消除左递归?
  1. 以后的句法分析算法不适用于左递归,会引起死循环。
  2. 对于给定的2型文法, 该文法不存在无用符号, 无循环且是无ε生成式的文法, 为了消除G中可能存在的左递归, 构成一个等效的无左递归的文法G1, 可用算法5。
  3. 算法5在原理上与求解正规表达式方程组的算法类似.
算法5

算法5

示例

示例
示例2

下推自动机

上下文无关语言的性质

Chomsky范式和Greibach范式

Chomsky 范式

2型文法G=(N,T,P,S)
生成式形如:
A→BC和A→a
称为Chomsky Normal Format
特别的,若ε∈L(G),则S→ε是P的一个生成式,但S不能在任何其它生成式的右边

构成步骤:

  1. 消除ε生成式、无用符号、单生成式
  2. 引入新的非终结符,凑

CNF

Greibach范式

2型文法G=(N,T,P,S)
若生成式的形式都是A→aβ,A∈N,a∈T,β∈N*
且G不含ε生成式,则称G为Greibach范式,记为GNF

构成步骤:

  1. 2型文法变换为CNF。(A→a,A→BC形式)
  2. 对非终结符排序
  3. 假如按下标递增,不能出现$A1->A2\beta$(A2高于A1)
    1. 把A2的生成式带入,直至满足上述条件
  4. 消除左递归(只对最高的Ai进行消除左递归,消除完了之后Ai就会满足GNF形式,即终结符a开头,但会引入新的非终结符Ai’,这些新的非终结符优先级是最低的)
  5. 回代
    1. 依次回代Ai到Ai-1,Ai-1到Ai-2….一直到右部首字符都为终结符
  6. 将消除左递归时候引入的带’的右部进行代换,换成右部首字符都为终结符。

GNF1:
GNF1
GNF2:
GNF2
GNF3:
GNF3