编译原理学习之:上下文无关文法(Context-free Grammar)和下推自动机(Push-down automata)
文章目录
- 上下文无关文法
- 上下文无关文法的定义
- 上下文无关文法举例
- 上下文无关文法的二义性(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)相关推荐
- 《编译原理》-3.上下文无关文法及分析
上下文无关文法及分析 3.1 分析过程 3.2 上下文无关文法 3.2.1 与正则表达式的比较 3.2.2 上下文无关文法规则的说明 3.2.3 推导及由文法定义的语言 3.3 分析树与抽象语法树 3 ...
- 编译原理学习(到LL1文法部分)
今天终于开始着手把一年前学的编译原理整理一下啦!打败拖延症 #*# 机器语言:计算机只认识由0和1构成的机器语言,每台机器自己独特的指令系统即机器语言. 机器语言->汇编语言->高级语言 ...
- 短语结构文法(PSG)、上下文有关文法(CSG)、上下文无关文法(CFG)、右线性文法(RLG)的区别
Part 1 短语结构文法(PSG).上下文有关文法(CSG).上下文无关文法(CFG).右线性文法(RLG)的区别 Part 2 概念 文法G=(V,T,P,S) G叫做0型文法(type 0 gr ...
- 编译原理学习之语法分析
1.语法分析的地位 –是编译程序的核心部分. 2.语法分析的任务 –识别由词法分析得出的单词序列是否是给定文法的句子. 3.语法分析的理论基础 –上下文无关文法和下推自动机 4.语法分析的方式 1)自 ...
- 形式语言与自动机——第三章 上下文无关文法与下推自动机
文章目录 3.1 推导树与二义性 3.2 上下文无关文法的改写 3.2.1 CFG的最简化 3.2.2 CFG的变换 3.2.2.1 去除可零化的非终结符 3.2.2.2 去除单产生式 3.2.2.3 ...
- python.nlp随笔(九)上下文无关文法
上下文无关文法(context-free grammar,CFG)是指文法中 所有的产生式左边只有一个非终结符 ,比如: S -> aSb S -> ab 这个文法有两个产生式,每个产生式 ...
- 上下文无关文法的作用
上下文无关文法(Context-Free Grammar,CFG)是一种用于描述编程语言.自然语言等形式语言结构的形式化语言.它由一组产生式(Production)和一个开始符号(Start Symb ...
- 【编译原理】什么是上下文无关文法?
上下文无关是指,一句话的含义与其前后的内容没有或者几乎没有关系,只由自己决定,把它剪切到其他任何位置,也还是原有的意思. 例如: ... a = 0; ... 这是一个赋值语句,无论此语句的前后是什么 ...
- 上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树--编译原理
上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树 分析树 根节点的符号为文法开始符号S 每个内部节点都是对某个产生式A→β的应用,该节点的标号就是产生式的左部,子节 ...
- 【编译原理】构造产生如下语言的上下文无关文法各一个:
13.构造产生如下语言的上下文无关文法各一个: (1) (an bm c2m | n,m≥0 } S->AB A->ε|aA B->ε|bBcc (2) w c wR| w∈{a,b ...
最新文章
- RabbitMQ 入门系列(1)— Ubuntu 安装 RabbitMQ 及配置
- Yahoo Programming Contest 2019 F - Pass
- 9个必知的Python操作文件/文件夹方法
- docker-machine
- 百度新闻后台逻辑流程分析
- Python数模笔记-NetworkX(1)图的操作
- 【Flink】Flink key 应该分配到哪个 KeyGroup 以及 KeyGroup 分配在哪个subtask
- hikaridatasource连接池_完美!细数SpringBoot中的那些“连接池”
- 【脑电信号】基于matlab GUI小波变换癫痫脑电信号特征提取及分析【含Matlab源码 1154期】
- 凸优化第五章对偶 5.5最优性条件
- Java学习手册:JDBC中getString()方法与getObject()方法有什么区别?
- 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
- Flash | 用几张帧图创建逐帧动画元件并插入场景层的一般步骤
- matlab点类型,Matlab中的类(Class)
- 【高德LBS开源组件大赛】回眸微博的足迹
- 声速的测量数据处理代码
- 谷歌手机正式发布 售价179美元(图)
- 苹果app老是显示无法连接服务器失败原因,iphone无法连接到app store服务器出错怎么办...
- 约翰·卡马克和他的id Software
- RoboCup Rescue Simulator Tutorial core
热门文章
- 26岁程序员猝死,再次提醒:有几个前兆其实很显眼
- 赛码-回文串-java
- 部分设计模式案例代码
- 匹配 网络 Q值 带宽
- 数据库防火墙安全技术解析与实践
- 初为人师[/size]
- 含有ex的linux自动化工具,增加Linux自动化(RH294)和红帽认证工程师考试(EX294),附介绍...
- 联通速品简易测试报告
- 迪普科技“高”在哪里?
- 金融安全资讯精选 2017年第二期:金融网络安全和反欺诈方法论_金融新兴技术成熟度几何?...