文章目录

  • 上下文无关文法
    • 上下文无关文法的定义
    • 上下文无关文法举例
    • 上下文无关文法的二义性(Ambiguity)
  • 下推自动机
    • 下推自动机的定义
    • 下推自动机举例
    • 判断一个字符串是否属于 PDA 表示的语言(是不是 PDA 可以 accept 的)
    • 下推自动机举例2
    • 渐进式下推自动机(progressive push-down automata)
    • 确定性下推自动机(Deterministic Pushdown Automata)
  • 通过上下文无关文法构造下推自动机(CFG ⇒\Rightarrow⇒ PDA)
  • 上下文无关文法和下推自动机是等价的,就像正则文法和 NFA, DFA 等价一样

上下文无关文法

  • 文法是一组替换规则,例如下面的例子
  • 在下面的例子中,有几个重要的概念:
    • 变量 / 非终结符 (variable)
    • 终结符(teminals)
    • 句子(sentence)
    • 句型(sentential forms):变量 + 终结符
  • 上面的例子中的 语法规则 可以表示语言 L(G)={wwR∣w∈0,1∗}L(G) = \{ww^R | w ∈ {0, 1}^∗\}L(G)={wwR∣w∈0,1∗}
  • 我们把使用上下文无关文法表示的语言称为上下文无关语言;有些 context-free 语言并不是 regular 的例如 {0n1n∣n≥1}\{0^n1^n | n ≥ 1\}{0n1n∣n≥1}

上下文无关文法的定义

  • VVV 是所有非终结符的集合
  • Σ\SigmaΣ 是所有终结符的集合
  • RRR 是所有语法规则的集合;其中语法规则的组成是 “任意终结符和非终结符的组合”,符号表示为 (V∪Σ)∗(V\cup \Sigma)^*(V∪Σ)∗
  • SSS 表示开始状态
  • 用 ⇒∗\Rightarrow^*⇒∗ 来表示 ⇒\Rightarrow⇒ 的自反闭包

上下文无关文法举例


  • 如果我们没有特殊说明,那么规则的第一条使用的最左端的非终结符(variable)被认为是起始状态(start variable)
  • 假设我们现在有一个语言的某个句子为:
  • 根据我们的文法规则,我们可以构造它的语法分析树
  • 注意,一棵语法书的推导形式可以有很多种,它取决于我们想替换的非终结词的顺序;一般我们使用 leftmost(最左推导)方法进行推导:最左推导的意思就是永远都最先替换左侧的非终结符。

上下文无关文法的二义性(Ambiguity)

  • 按照下面给定的语法规则:
  • 如果我们要构造 3+7∗23+7*23+7∗2 的语法分析树,我们会得到下面的情况:
  • 当我们构造语法分析树的时候,如果对于某一个句子,出现了多棵语法分析书,我们就认为他是具有歧义性(二义性)的

下推自动机

  • 对于下面的语法规则
  • 对句子 (3+7)∗2( 3 + 7 ) ∗ 2(3+7)∗2 采用最左推导可以得到:
  • 之前我们使用的 NFA 和 DFA 受限于存储空间的问题,不能识别类似于 {0n1n,n>=0}\{0^n1^n, n>=0\}{0n1n,n>=0} 这种语言
  • 下推自动机通过一个 stack(栈)结构解决了这个问题
  • 我们通过下面的这个过程,就能判断 aaa 和 bbb 存在的数量,从而判断一个语句(input)是否符合上述语言的定义
  • 每一步的判断取决于三个部分
    • 输入的字符
    • 栈顶的元素
    • 当前的状态
  • 根据这三个部分,决定要不要进入下一个状态,以及要对栈中的元素执行什么样的操作。
  • 每一个 transition 步骤,PDA 都会从 input 读一个字符,然后对栈进行压入或者弹出操作,或者两种操作一起执行
  • 我们还将讨论 non-deterministic 的 PDA,他可以忽略输入(input)

下推自动机的定义

  • QQQ 是状态集合
  • Σ\SigmaΣ 是有限的输入集合
  • Γ\GammaΓ 是栈中的元素集合
  • δ\deltaδ 是转换函数:根据当前状态,输入的字符,栈中元素,共同决定了 “下一个状态” 和 “下一个栈的状态”
  • q0q_0q0​ 是起始状态,只有一个
  • FFF 是接受状态,可以是一个集合
  • δ(q5,a,b)={(q7,ϵ)}δ(q_5, a, b) = \{(q_7, \epsilon)\}δ(q5​,a,b)={(q7​,ϵ)} 表示:在状态节点 q5q_5q5​ 如果栈顶元素是 bbb,这时候如果读入 input 为 aaa 那么就会把这个 aaa 消耗掉,并将 bbb 弹出栈;进而进入新的状态 q7q_7q7​
  • δ(q5,ϵ,b)={(q6,a),(q7,b)}δ(q_5, \epsilon, b) = \{(q_6, a), (q_7, b)\}δ(q5​,ϵ,b)={(q6​,a),(q7​,b)} 表示 在状态节点 q5q_5q5​ 如果栈顶元素是 bbb,这时候如果读入 input 为 ϵ\epsilonϵ 空; 那么有两种可能的选择:
    • 使用 aaa 代替了栈顶的 bbb;并进入新的状态 q6q_6q6​
    • 让栈保持原样(bbb 依然在栈顶),并进入新的状态 q7q_7q7​
    • 这两种情况都不会消耗输入的字符。

下推自动机举例


判断一个字符串是否属于 PDA 表示的语言(是不是 PDA 可以 accept 的)

  • 将字符串作为输入
  • 通过下推自动机进行字符串的 consume
  • 如果最终能够使得栈为空,那么就属于 PDA 表示的语言

Note:

  • 当机器停止运行时,栈可以是非空的
  • 尝试弹出一个空字符串会导致 “拒绝输入” 而不是报错

下推自动机举例2



渐进式下推自动机(progressive push-down automata)

  • 当一个下推自动机的每个 transition 步骤都只消耗一个 input 符号,我们称之为 progressive 的下推自动机

确定性下推自动机(Deterministic Pushdown Automata)

  • 一个 DPDA 可以识别下面的 上下文无关语言
  • 但是 DPDA 不能识别
  • 因为 DPDA 无法知道中间位置在哪里;例如给定如下输入,DPDA 根本不知道从哪里开始 pop 数据
  • DPDA 永远无法知道自己可以处理两种不同操作的位置;换言之,他每次只能处理一种情况。类似于 DFA

通过上下文无关文法构造下推自动机(CFG ⇒\Rightarrow⇒ PDA)

  • 如果 CFG 的语法规则为 B→xAyB \rightarrow xAyB→xAy,那么 BBB 将会被放在 PDA 的栈顶;而后使用 xAyxAyxAy 来替换栈中的 BBB 如图所示:

编译原理学习之:上下文无关文法(Context-free Grammar)和下推自动机(Push-down automata)相关推荐

  1. 《编译原理》-3.上下文无关文法及分析

    上下文无关文法及分析 3.1 分析过程 3.2 上下文无关文法 3.2.1 与正则表达式的比较 3.2.2 上下文无关文法规则的说明 3.2.3 推导及由文法定义的语言 3.3 分析树与抽象语法树 3 ...

  2. 编译原理学习(到LL1文法部分)

    今天终于开始着手把一年前学的编译原理整理一下啦!打败拖延症 #*# 机器语言:计算机只认识由0和1构成的机器语言,每台机器自己独特的指令系统即机器语言. 机器语言->汇编语言->高级语言 ...

  3. 短语结构文法(PSG)、上下文有关文法(CSG)、上下文无关文法(CFG)、右线性文法(RLG)的区别

    Part 1 短语结构文法(PSG).上下文有关文法(CSG).上下文无关文法(CFG).右线性文法(RLG)的区别 Part 2 概念 文法G=(V,T,P,S) G叫做0型文法(type 0 gr ...

  4. 编译原理学习之语法分析

    1.语法分析的地位 –是编译程序的核心部分. 2.语法分析的任务 –识别由词法分析得出的单词序列是否是给定文法的句子. 3.语法分析的理论基础 –上下文无关文法和下推自动机 4.语法分析的方式 1)自 ...

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

    文章目录 3.1 推导树与二义性 3.2 上下文无关文法的改写 3.2.1 CFG的最简化 3.2.2 CFG的变换 3.2.2.1 去除可零化的非终结符 3.2.2.2 去除单产生式 3.2.2.3 ...

  6. python.nlp随笔(九)上下文无关文法

    上下文无关文法(context-free grammar,CFG)是指文法中 所有的产生式左边只有一个非终结符 ,比如: S -> aSb S -> ab 这个文法有两个产生式,每个产生式 ...

  7. 上下文无关文法的作用

    上下文无关文法(Context-Free Grammar,CFG)是一种用于描述编程语言.自然语言等形式语言结构的形式化语言.它由一组产生式(Production)和一个开始符号(Start Symb ...

  8. 【编译原理】什么是上下文无关文法?

    上下文无关是指,一句话的含义与其前后的内容没有或者几乎没有关系,只由自己决定,把它剪切到其他任何位置,也还是原有的意思. 例如: ... a = 0; ... 这是一个赋值语句,无论此语句的前后是什么 ...

  9. 上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树--编译原理

    上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树 分析树 根节点的符号为文法开始符号S 每个内部节点都是对某个产生式A→β的应用,该节点的标号就是产生式的左部,子节 ...

  10. 【编译原理】构造产生如下语言的上下文无关文法各一个:

    13.构造产生如下语言的上下文无关文法各一个: (1) (an bm c2m | n,m≥0 } S->AB A->ε|aA B->ε|bBcc (2) w c wR| w∈{a,b ...

最新文章

  1. RabbitMQ 入门系列(1)— Ubuntu 安装 RabbitMQ 及配置
  2. Yahoo Programming Contest 2019 F - Pass
  3. 9个必知的Python操作文件/文件夹方法
  4. docker-machine
  5. 百度新闻后台逻辑流程分析
  6. Python数模笔记-NetworkX(1)图的操作
  7. 【Flink】Flink key 应该分配到哪个 KeyGroup 以及 KeyGroup 分配在哪个subtask
  8. hikaridatasource连接池_完美!细数SpringBoot中的那些“连接池”
  9. 【脑电信号】基于matlab GUI小波变换癫痫脑电信号特征提取及分析【含Matlab源码 1154期】
  10. 凸优化第五章对偶 5.5最优性条件
  11. Java学习手册:JDBC中getString()方法与getObject()方法有什么区别?
  12. 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
  13. Flash | 用几张帧图创建逐帧动画元件并插入场景层的一般步骤
  14. matlab点类型,Matlab中的类(Class)
  15. 【高德LBS开源组件大赛】回眸微博的足迹
  16. 声速的测量数据处理代码
  17. 谷歌手机正式发布 售价179美元(图)
  18. 苹果app老是显示无法连接服务器失败原因,iphone无法连接到app store服务器出错怎么办...
  19. 约翰·卡马克和他的id Software
  20. RoboCup Rescue Simulator Tutorial core

热门文章

  1. 26岁程序员猝死,再次提醒:有几个前兆其实很显眼
  2. 赛码-回文串-java
  3. 部分设计模式案例代码
  4. 匹配 网络 Q值 带宽
  5. 数据库防火墙安全技术解析与实践
  6. 初为人师[/size]
  7. 含有ex的linux自动化工具,增加Linux自动化(RH294)和红帽认证工程师考试(EX294),附介绍...
  8. 联通速品简易测试报告
  9. 迪普科技“高”在哪里?
  10. 金融安全资讯精选 2017年第二期:金融网络安全和反欺诈方法论_金融新兴技术成熟度几何?...