形式语言与自动机 Part.5 上下文无关语言与下推自动机(PDA)

本文详细介绍了上下文无关文法(CFG)和下推自动机(PDA)的概念及其相关理论。内容涵盖了文法的Chomsky范式、Grebach范式,以及如何消除文法的无用符号、空产生式和单产生式。还讨论了文法的二义性、推导与归约、消除递归的方法,并探讨了上下文无关文法与下推自动机之间的转换。此外,文章提到了泵引理和上下文无关语言的封闭性。
摘要由CSDN通过智能技术生成

课程名:形式语言与自动机

作者:Lupinus_Linn

许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享

  • 署名(英语:Attribution,BY):您(用户)可以复制、发行、展览、表演、放映、广播或通过信息网络传播本作品;您必须按照作者或者许可人指定的方式对作品进行署名。
  • 非商业性使用(英语:Noncommercial,NC):您可以自由复制、散布、展示及演出本作品;您不得为商业目的而使用本作品。
  • 相同方式共享(英语:Sharealike,SA):您可以自由复制、散布、展示及演出本作品;若您改变、转变或更改本作品,仅在遵守与本作品相同的许可条款下,您才能散布由本作品产生的派生作品。(参见copyleft。)

引用:

  • 本文中部分文字与图片引用自北京邮电大学计算机学院王柏教授的《形式语言与自动机》课程课件。
  • 绪论中的证明方法部分引自清华大学王生原老师课件。
  • 部分题目插图引用自北京邮电大学出版社《形式语言与自动机 第二版》教材。

在此一并表示感谢,并不做商业用途。

本笔记所有内容的传送门

Part.1绪论, Part.2 语言与文法
Part 3.有限自动机
Part.4 正则语言,2DFA,Mealy&Moore机
Part.5 上下文无关语言与下推自动机(PDA)
Part.6 图灵机

Part 5. 上下文无关文法和下推自动机

5.1 上下文无关文法

  • 回顾Chomsky文法体系,上下文无关文法是2型文法。
  • 产生式形如 A → α , A ∈ N , α ∈ ( N ∪ T ) ∗ A\rarr \alpha ,A\in N,\alpha\in(N\cup T)^* Aα,AN,α(NT)的语言是上下文无关语言。(左侧是单个非终结符)
  • 2型文法对应的识别器是下推自动机PDA,其比普通的自动机多了一个栈,称为下推栈。

5.2 推导与归约

  • 推导和归约都是用来判定字符串是否属于文法所定义的语言的。

  • 推导:自上而下,从文法推出句型(句子也是句型)。
    推导过程:将产生式的左部(head)替换为产生式的右部( body).
    例子:

在这里插入图片描述

  • 最右推导:若推导过程的每一步总是替换出现在最右边的非终结符, 则这样的推导称为最右推导(rm,rightmost).

  • 最左推导:反之。

  • 推导树:文法的起始符为根,树的枝结点标记是非终结符, 叶结点标记为终结符或ε。
    若枝结点 A A A有直接子孙 x 1 , x 2 , … , x k x_1, x_2,…, x_k x1,x2,,xk,则文法中有生成式 A → x 1 x 2 … x k A→x_1x_2…x_k Ax1x2xk.

    例子:
    在这里插入图片描述

  • 推导树边缘:叶子从左向右组成的字符串称为推导树的边缘。
    在这里插入图片描述

  • 归约:又称递归推理。自下而上,从句型还原出使用的文法。
    归约过程:将产生式的右部(body)替换为产生式 的左部( head).

    在这里插入图片描述

  • 推导和归约分别是从上到下/从下到上建树。

  • 以下几个描述是一回事

    1. 字符串 ω ∈ T ∗ \omega \in T^* ωT可以归约到非终结符 A A A.
    2. 存在一棵根节点为A的推导树,其边缘为 ω \omega ω.
    3. 非终结符 A A A可以推导出串 ω \omega ω.
    4. 非终结符 A A A可以最左推导出串 ω \omega ω.
    5. 非终结符 A A A可以最右推导出串 ω \omega ω.

5.3 二义性

  • 二义性是针对文法而言的。
  • 上下文无关文法 G G G是二义的 ↔ \leftrightarrow 存在两棵不同的推导树,但是它们的边缘是同一个串 ω ∈ L ( G ) \omega\in L(G) ωL(G)
  • 如果文法是二义的,那么它产生的某个句子可以从不同的最左/右推导推出。
  • 例子:
    在这里插入图片描述
  • 对于同一语言,可能存在有二义性和没有二义性的不同文法。但是没有一般方法可以通过变换消除二义性。

5.4 CFG的Chomsky范式(CNF)

  • 要求:每个非终结符要么推出两个非终结符,要么推出一个终结符。即:生成式形式为 A → B C , A → a , A , B , C ∈ N , a ∈ T A→BC, A→a, A, B, C∈N , a∈T ABC,Aa,A,B,CN,aT
  • 本质特征:推导树是二叉树。
  • 每个CFG都可以化成CNF.

5.5 CFG的Grebach范式(GNF)

  • 要求:每个产生式右端都以终结符开始,且只有该一个终结符(但推导树未必是二叉树)。即:生成式形式为 A → a β , a ∈ T , β ∈ N ∗ A→aβ, a∈T , β∈N^* Aaβ,aT,βN
  • 本质特征:消除左递归。

5.6 消去CFG的无用符号

  • 有用符号:包含生成符号和可达符号。即: X ∈ N ∪ T X\in N \cup T XNT是有用的 ⇔ \Leftrightarrow S ⇒ ∗ α X β ⇒ ∗ ω , ω ∈ T ∗ S\Rightarrow^* \alpha X \beta\Rightarrow^*\omega ,\omega\in T^* SαXβω,ωT
    • 生成符号:可以推出非终结符串的符号。即: ∃ ω ∈ T ∗ \exists \omega \in T^* ωT X X X推出 ω \omega ω.
    • 可达符号:可以被起始符号到达的符号,即: S S S推出 α X β \alpha X \beta αXβ.
  • 无用符号:非生成符号和不可达符号。
    • 消去无用符号:将无用符号从 N N N中移除,并移除其在 P P P中的所有产生式。
  • 必须先删除非生成符号,再删除不可达符号。 如果反着来会出现:某个符号原先是可达的,但是和其一起的某个符号因为不是生成符号被删除了,就不可达了。导致该符号没有被正常删除。
5.6.1 找出生成符号集

精髓:从终结符倒着推,能推出终结符串的就是生成符号。

方法

  • 基础 任何终结符 a ∈ T a\in T aT都是生成符号。
  • 归纳 如果有产生式 A → α A\to \alpha Aα,其中 α ∈ ( N ∪ T ) ∗ \alpha \in (N\cup T)^* α(NT)的每一个符号都是生成符号,则 A 也是生成符号。
5.6.2 找出可达符号集

精髓:起始符号是可达符号,可达符号产生式右侧都是可达符号。

5.7 消去CFG的 ϵ \epsilon ϵ产生式(不是消符号)

  • 意义:消去 ϵ \epsilon ϵ产生式外,除了文法不能产生空串外,没有影响。
  • 可致空符号:可以经过一步或多步推出空串的符号。即:对于 C F G   G = ( N , T , P , S ) CFG\ G = (N, T, P, S ) CFG G=(N,T,P,S),称符号 A ∈ N A \in N AN是可致空的,当且仅当 A A A可以经过一步或多步推出 ϵ \epsilon ϵ.
5.7.1 找出可致空符号集

精髓:能直接推出 ϵ \epsilon ϵ的符号肯定是可致空符号,能推出可致空符号串的也是可致空符号。

方法

  • 基础 对于所有产生式 A → ϵ A \to \epsilon Aϵ A A A 是一个可致空符号
  • 归纳 如果有产生式 B → C 1 C 2 … C k B\to C_1C_2…C_k BC1C2Ck,其中每一个 C i ∈ N C_i \in N CiN 是可致空符号,则 B B B 是一个可致空符号。
5.7.2 消去空产生式
  • 所有直接推出 ϵ \epsilon ϵ的产生式被删除。

  • 推出可致空符号串的产生式,由于需要表现出原来推出空串的可能性,需要将其所有为空的可能性枚举出来,但是不能是空串。

    比如A->C1C2C3,其中C1C2C3都是可空符号
    就有以下的可能
    A->C1C2C3
    A->C1C2
    A->C1C3
    A->C2C3
    A->C1
    A->C2
    A->C3
    当C1,C2,C3不可空之后,就要将这些产生式全部加到A里
    

    最后还要处理起始符号,如果能产生空串,就让新起始符号直接产生空串。

  • 步骤

    1. 找出能推导出 ϵ \epsilon ϵ的所有非终结符 A A A的集合 N ′ N' N.
    2. 按如下两步组成新的 P 1 P_1 P1
      ① 如果生成式 A → β 0 C 0 β 1 C 1 … C n β n ∈ P , n ≥ 0 A\to \beta_0C_0\beta_1C_1\dots C_n\beta_n\in P,n\ge 0 Aβ0C0β1C1CnβnP,n0 C k ∈ N ′ ( 1 ≤ k ≤ n ) , β j ∉ N ′ C_k \in N'(1\le k\le n),\beta_j \notin N' CkN(1kn),βj/N(即可空符号里插了一些不可空符号),则 P 1 P_1 P1应加入 A → β 0 Y 0 β 1 Y 1 … Y n β n A\to \beta_0Y_0\beta_1Y_1\dots Y_n\beta_n Aβ0Y0β1Y1Ynβn,其中 Y k Y_k Yk C k C_k Ck或者 ϵ \epsilon ϵ。(即保持不可空符号),枚举所有的情况,但不包括 A → ϵ A\to \epsilon Aϵ.
    3. 如果 S ∈ N ′ S\in N' SN(即S可空),则 P 1 P_1 P1中增加 S 1 → ϵ ∣ S S_1\to \epsilon|S S1ϵS S 1 S_1 S1是新的起始符, N 1 = N ∪ { S 1 } N_1=N\cup \{S_1\} N1=N{ S1}。(即把起始符推出空串单独写出来)。
      如果 S ∉ N ′ S\notin N' S/N(即S不可空),则继承起始符即可。
    4. 得到的无 ϵ \epsilon ϵ文法 G 1 = ( N 1 , T , P 1 , S 1 ) G_1=(N_1,T,P_1,S_1) G1=(N1,T,P1,S1).
  • 例子

在这里插入图片描述

5.8 消去CFG的单产生式(不是消符号)

  • 单产生式:一个非终结符推出一个非终结符的产生式,说了一句废话。

  • 单元偶对:一个非终结符如果能全部使用单产生式推出另一个非终结符,则这两个非终结符是一个单元偶对。

    比如A->B B->C
    则实际上有A->B->C
    则(A,B),(A,C),(B,C)都是单元偶对
    
5.8.1 找出所有的单元偶对

精髓:从S开始BFS,根据单产生式的关系画出树即可。

方法:这里从某一个不特定的非终结符A为起点。

  1. 设A的单元偶对的非终结符的集合是 N A N_A NA,设 N = { A } N=\{A\} N={ A}开始迭代。
  2. 遍历 N N N内的非终结符(迭代变量 B B B),遍历 B B B的产生式,如果 B → C B\to C BC,则 N N N增加非终结符 C C C.
  3. 重复2.,直到 N N N内的非终结符不再增加。
5.8.2 消去单产生式

精髓:儿子的产生式全部交给爸爸。

如果A->B B->α
则去掉A->B,增加A->α

步骤:如果 B → α ∈ P B\to \alpha \in P BαP,则 B B B的所有爸爸,即满足 B ∈ N A B\in N_A BNA的所有 A A A,把 A → α A\to \alpha Aα加入到 P 1 P_1 P1.
最终得到 G 1 = ( N 1 , T 1 , P 1 , S ) G_1=(N_1,T_1,P_1,S) G1=(N1,T1,P1,S).

注意:有可能有成环的情况,此时要一直推到只包含自己到自己这一条单产生式,不能再含有其他的单产生式。

A->B|α	B->C|β	C->A|γ
A->B|α
A->C|β|α
A->A|γ|β|α
A->A是一句正确的废话,删掉
A->γ|β|α

B同理,推到A的时候可以用A最后的结果
B->C|β
B->A|γ|β
B->γ|β|α|β
删掉重复的
B->γ|β|α

5.9 化简顺序:消空→消单→消无用

  • 如果消空前的符号比较多可以先消一次无用。消无用什么时候都可以做,但是消无用内部需要先消非生成符号再消不可达符号

5.10 消除递归

  • 递归文法:如果某个非终结符能推出含有自己的句型(倒不是有自己到自己的产生式),则称这个文法是递归文法。即:A推出 α A β , A ∈ N \alpha A\beta,A\in N αAβ,AN,则该文法是递归文法。

  • 左递归文法:能经过若干步后推出含有自己的句型,并且自己在左边,即:A推出 A β A\beta Aβ,则文法是左递归文法。

  • 右递归文法:能经过若干步后推出含有自己的句型,并且自己在右边。

  • 循环文法:能经过若干步后推出自己。即:A推出A。

  • 生成式:CFG中,所有 A → α A\to \alpha Aα的生成式称为 A A A生成式。

  • 递归在推导树上的表现就是子树
    下图中推导n次会得到 a n S b n a^nSb^n anSbn

    S
    a
    S
    b
    a
    S
    b
5.10.1 消除直接左递归
  • 假设 A A A产生式是 A → A α ∣ β A\to A\alpha | \beta AAαβ
    按照下列推导树得到 β α 2 \beta \alpha^2 βα2

    A
    A
    α
    A
    α
    β

    可以看出,每次使用 A → A α A\to A\alpha AAα产生式会在右边生成一个 α \alpha α,并且越早产生的 α \alpha α在最后的句子中越靠右。
    最后一定有一个 β \beta β在最左边。
    所以不妨先至少推出一个 β \beta β,然后用右线性文法产生 α ∗ \alpha^* α,这样就消除了左递归。
    改写为
    A → β ∣ β A ′ A ′ → α ∣ α A ′ A\to \beta|\beta A'\\ A'\to \alpha|\alpha A' AββAAααA

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值