当前课程知识点:编译原理 > 第2章 编译理论基础 > 2.4 上下文无关文法及语法树 > 上下文无关文法及语法树
同学们好
这节课给大家介绍
上下文无关文法及语法树
上下文无关文法有足够的能力
描述现今程序设计语言的语法结构
大家看
这里是赋值语句的产生式
还有下面这个是条件语句的产生式
再来看这里是一个简单的表达式文法
这里的非终结符E表示一类算术表达式
终结符i表示程序设计语言中的“变量”
有四条规则
这个文法定义了由变量i,+,*,( )
组成的算术表达式的语法结构
因此 我们关心上下文无关文法
形成语言的句子分析
和分析方法的研究
后面 如果我们不加特殊说明
文法均是指上下文无关文法
前面我们讲过推导的概念
现在再来介绍一种
描述上下文无关文法的
句型推导的直观方法
语法树
我们也称作推导树
再来有一个文法G[S]
我们来判断符号串“aabbaa”
是不是这个文法的句子
可以用这个语法树来展现推导过程
大家来看推导过程
S是树根
它的直接子孙是aAS
就对应着规则S->aAS
从图中我们可以看出有子孙的结点
必是非终结符
这里这棵树
也叫作句子aabbaa的语法树
所以 给定文法G
对于文法的任何句型
我们都能构造出来与之关联的语法树
语法树满足下列4个条件
第一 每一个结点都有一个字母表
V中的一个符号作标记
第二 根的标记就是开始符号
或者是标识符号S
第三 如果一个结点n至少有一个
除它自己之外的子孙
并且n有标记A
那么这个A就是非终结符
第四条 如果结点A的k个子孙
从左到右的次序是
n1,n2,…,nk
它的标记分别为A1,A2,…,Ak
那么A->A1A2,…Ak
一定是P中的一个产生式
语法树表示了推导过程中
用了哪个产生式
并没有标明推导的顺序
比如句子aabbaade
它的推导过程
有这里这几种
假如我们约定推导顺序
那最左推导
就对应的是在推导的任何一步
比方说从α=>β
其中α、β是句型
那么对于α中的
最左边非终结符我们先进行推导
最右推导
就是在推导过程中的任何一步
比如说α=>β
那么就是对α中的
最右边的非终结符先进行推导
我们刚给出来的几种推导过程中
第一种推导过程中总是对
当前串中的最右边非终结符先推导
我们称之为最右推导
第二种就是恰恰相反
是对当前串中的
最左边的非终结符先进行推导
我们称之为最左推导
最右推导
我们把它叫做规范推导
由规范推导所得到的句型就是规范句型
有一个问题
就是一个句型是否对应唯一的一棵语法树
我们来看这里这个文法
其中有一个句型 i*i+i
那么这个句型
它就有两种不同的最左推导
我们看它对应的这两棵语法树
如果一个文法存在某一个句子
对应两棵不同的语法树
这个文法我们就称之为
它有二义性的文法
或者说如果一个文法
存在某一个句子或者句型
有两种不同的
最左推导或者是最右推导
那么这个文法我们称之为
它就是有二义性的文法
二义性是一种常见的语法现象
但是 对于编译程序而言
二义性文法是有害的
为了解决二义性文法带来的
不确定性问题
通常的方法
一是修改文法
二是利用附加条件
对其进行改变
消除其二义性
比如说这里这个文法
我们可以约定优先级
也就是约定*的优先级大于+
那么我们就可以把这个文法的
二义性消除掉了
还可以将这个文法进行改造
改造为没有二义性的文法
比如说这个文法
我们可以进行改造得到这样一个文法
这个文法就是没有二义性的文法
这节课就讲到这里
谢谢大家
-1.1 什么是编译原理
--什么是编译原理
--什么是编译程序
--讨论:翻译程序、汇编程序、编译程序、解释程序的区别和联系。
--练习1
-1.2 编译的基本过程
--编译的基本过程
--编译的基本过程
--练习2
-1.3 编译程序的组织
--编译程序的组织
--编译程序的组织
--练习3
-编译原理概述
-2.1 文法与语言
--文法与语言
--文法与语言
-2.2 文法和语言的形式定义
--练习1
-2.3 文法的类型
--文法的类型
--文法的类型
--练习2
-2.4 上下文无关文法及语法树
--练习3
-2.5 上下文无关文法的句型分析
--练习4
-编译理论基础作业
-3.1 词法分析概述
--词法分析概述
--词法分析概述
--练习1
-3.2 正规文法和状态转换图
--练习2
-3.3 有限状态自动机
--有限状态自动机
--有限状态自动机
--练习3
-3.4 NFA与DFA的等价性
--练习4
-3.5 正规表达式与正规集
--练习5
-3.6 正规文法与正规式
--正规文法与正规式
--正规文法与正规式
--练习6
-3.7 正规式与FA
--正规式与FA
--正规式与FA
--练习7
-词法分析作业
-4.1 自顶向下语法分析及其面临的问题
--练习1
-4.2 文法的等价转化
--文法的等价转化
--文法的等价转化
--练习2
-4.3 LL(1)文法与递归下降分析法
--练习3
-4.4 构建FIRST集合FOLLOW集合
--练习4
-4.5 LL(1)分析器工作原理
-- LL(1)分析器工作原理
-4.6 LL(1)分析表构造算法
--练习5
-5.1 自底向上的语法分析及优先分析
--练习1
-5.2 LR分析器
--LR分析器
--LR分析器
--练习2
-5.3 活前缀和LR(0)项目
-- 活前缀和LR(0)项目
--练习3
-5.4 构造识别活前缀的FA
--练习4
-5.5 LR(0)分析表构造算法
--练习5
-5.6 SLR(1)分析法
--练习6
-5.7 LR(1)分析法与LALR分析法
--练习7
-6.1 语义分析和语法制导翻译概述
--练习1
-6.2 常见中间语言简介
--常见中间语言简介
--常见中间语言简介
--练习2
-6.3 简单算术表达式和赋值语句翻译
--练习3
-6.4 布尔表达式和复制语句翻译
-6.5 拉链和回填
--拉链与回填
--拉链与回填
--练习4
-6.6 程序控制语句翻译
--程序控制语句翻译
--程序控制语句翻译
--练习5
-6.7 for循环语句的翻译
-6.8 GOTO语句和情况语句的翻译
--练习6
-6.9 含数组元素的算术表达式的翻译
--练习7
-6.10 数组元素赋值语句的翻译
--练习8
-7.1 符号表概述
--符号表概述
--符号表概述
--练习1
-7.2 符号表的建立
--符号表的建立
-- 符号表的建立
--练习2
-8.1 运行时存储空间组织概述
-8.2 运行时分配策略
--运行时分配策略
--运行时分配策略
--练习
-9.1 线性窥孔优化
--线性窥孔优化
--线性窥孔优化
-9.2 基本块及其优化方法
-9.3 循环概念
--循环概念
--循环概念
-9.4 循环优化
--循环优化
--循环优化
-代码优化作业