当前课程知识点:编译原理 >  第2章 编译理论基础 >  2.5 上下文无关文法的句型分析 >  上下文无关文法的句型分析

返回《编译原理》慕课在线视频课程列表

上下文无关文法的句型分析在线视频

下一节:上下文无关文法的句型分析

返回《编译原理》慕课在线视频列表

上下文无关文法的句型分析课程教案、知识点、字幕

同学们好

这节课给大家介绍

上下文无关文法的句型分析

句型分析就是识别一个符号串

是否为某个文法句型

进一步说

就是当给定一个符号串时

试图按照文法的规则为符号串构造

推导或构造语法树

以此识别它是不是这个文法的句型

当符号串全部由终结符组成时

那就是识别它是不是文法的句子

在编译系统实现中

把完成句型分析的程序

称为分析程序或识别程序

分析算法又称为识别算法

常见的分析方法有两种

一种是自顶向下的分析方法

一种是自底向上的分析方法

自顶向下的分析方法

是从文法的开始符号出发

反复使用各种产生式

寻找“匹配”的输入符号串的推导

自下而上的方法

是从输入符号串开始

逐步进行"归约"

直至归约到文法的开始符号

来看这里这个文法

我们要识别输入串

cabd是不是这个文法的句子

大家看

这里是自顶向下的推导过程

再来看 这里是自下而上的规约过程

下面我们分别来介绍

先看自顶向下的分析过程

对于一个文法而言

从文法的开始符号

到某一个句型的推导过程

可能不唯一

例如说这个文法

我们来看句子 i+i*i 的推导过程

我们这里就给出了

三种从E到 i+i*i 的推导情况

为了让计算机能够自动地进行推导

通常我们只考虑

最左或者是最右推导

这里的第(2)种是最左推导

第(3)种是最右推导

大家可以看到

从形式上

如果从符号串

到符号串β的推导序列

是这种情况

那么总有

x是终结符时

那么我们称之为是最左推导

总有y是终结符时

我们称之为是最右推导

最左推导

或者是最右推导得到的句型

我们称之为左句型或者是右句型

最右推导我们称之为规范推导

右句型就是规范句型

每个句子都有相应的最左或者最右推导

因此 句子即是左句型也是右句型

但是 并不是所有的句型

都有最左和最右推导

比方说这个文法G

那么E + E+i*T

它即不是左句型

也不是右句型

因为最左或者最右推导

推导不出来这个句型

对于给定的符号串w

采用自顶向下的分析来判断

w是不是这个语言的句子

它常见的方法就是

试图建立从文法的开始符号S

到w的最左推导

显然 每一步推导时

对应于最左非终结符相应的产生式

可能会有多个

如果没有特殊的办法

我们只能一个一个地去试探

所以 推导过程可能是带回溯的

比如说文法G

那推导句子i+i*i的过程中

由E开始

我们可以选择的规则就有两个

一个是E→E+T

一个是E→T

所以这个过程是需要试探与回溯的

为了提高效率

在自顶向下的语法分析过程中

我们尽可能的避免回溯

我们再来看

自底向上的语法分析方法

自底向上的语法分析就是从

给出的符号串w出发

试图以与推导相反的方向

为w建立一个规范规约

最终得到文法的开始符号

推导的逆过程称作归约

最右推倒的逆过程就是规范规约

比如说文法G

句型i+i*i的最右推导是这样子的

大家可以看

从E一直运用规则推导到句子i+i*i

归约就是从右边的i+i*i

一路归约到文法的开始符号E

所以 归约我们可以描述为

当有符号串β α δ

文法规则中有一条产生式

A定义为α

那么把符号串β α δ中的子串α

替换为产生式左部的符号A

得到一个新的符号串β A δ

这样的一步动作

我们称为进行了一步归约

例如 这里文法G中的符号串

F+i*i

这其中的F

我们可以按照产生式T定义为F

归约为T

我们可以得到一个新的符号串

T+i*i

如果从给定的符号串w出发

我们一步一步将其进行归约

最终能够得到文法的开始符号

那么说明w

就是这个文法定义的一个句子

归约成功

否则的话 归约失败

如果归约的每一步

都归约的是当前符号串中

最左边的

某个产生式的右部

那么我们称

这个归约是规范归约

也就是最左归约

下面我们来看三个概念

短语 直接短语和句柄

假如文法G[S]中

从文法开始符号

可以推导出句型αAδ

A可以推导出β

那么我们就称β是句型αβδ

相对于非终结符A的短语

如果A定义为 β是一个产生式

那么则称β是句型α β δ

相对于A 的直接短语

一个句型的最左边的直接短语

我们称之为这个句型的句柄

我们来看这个文法

这里是从开始符号E 推导出句型

E+T*F+i 的语法树

E可以经过若干步

推导到E+T+i

因为有一条规则T->T*F

所以推导出来=> E+T*F+i

那么T*F

就是句型 E+T*F+i

相对于TF的直接短语

我们从语法树上

还可以清楚地看到

其中句型E+T*F+i中的

短语还有 i

E+T*F+i

直接短语就是T*F

还有一个i

句柄自然是最左边的直接短语了

就是T*F

那我们通过定义可以知道

直接短语也是短语

但短语不一定是直接短语

从语法树中可以看到

句型E+T*F+i中E+T

绝不是它的一个直接短语

因为虽然E

因为虽然有规则E->E+T

但是不存在从E到E*F+i的推导

自底向上分析过程中

主要的问题就是寻找句柄

每一步归约就是将句柄进行归约

这节课就讲到这里

谢谢大家

编译原理课程列表:

第1章 编译原理概述

-1.1 什么是编译原理

--什么是编译原理

--什么是编译程序

--讨论:翻译程序、汇编程序、编译程序、解释程序的区别和联系。

--练习1

-1.2 编译的基本过程

--编译的基本过程

--编译的基本过程

--讨论:表格管理和出错处理

--练习2

-1.3 编译程序的组织

--编译程序的组织

--编译程序的组织

--练习3

-编译原理概述

第2章 编译理论基础

-2.1 文法与语言

--文法与语言

--文法与语言

-2.2 文法和语言的形式定义

--文法和语言的形式化定义

--文法和语言的形式化定义

--讨论:高级语言的一般特点

--练习1

-2.3 文法的类型

--文法的类型

--文法的类型

--练习2

-2.4 上下文无关文法及语法树

--上下文无关文法及语法树

--上下文无关文法及语法树

--练习3

-2.5 上下文无关文法的句型分析

--上下文无关文法的句型分析

--上下文无关文法的句型分析

--练习4

-编译理论基础作业

-讨论:识别不同文法的实验方法

第3章 词法分析

-3.1 词法分析概述

--词法分析概述

--词法分析概述

--练习1

-3.2 正规文法和状态转换图

--正规文法和状态转换图

--正规文法和状态转换图

--练习2

-3.3 有限状态自动机

--有限状态自动机

--有限状态自动机

--讨论:有限状态自动机的应用

--练习3

-3.4 NFA与DFA的等价性

--NFA与DFA的等价性(上)

--NFA与DFA的等价性(下)

--NFA与DFA的等价性

--练习4

-3.5 正规表达式与正规集

--正规表达式与正规集

--正规表达式与正规集

--讨论:正规式的应用

--练习5

-3.6 正规文法与正规式

--正规文法与正规式

--正规文法与正规式

--练习6

-3.7 正规式与FA

--正规式与FA

--正规式与FA

--练习7

-词法分析作业

-讨论:如何实现词法分析器

第4章 自顶向下的语法分析

-4.1 自顶向下语法分析及其面临的问题

-- 自顶向下语法分析及其面临的问题

--自顶向下语法分析及其面临的问题

--自上而下语法分析中面临的问题

--练习1

-4.2 文法的等价转化

--文法的等价转化

--文法的等价转化

--讨论:什么样的文法才是等价的?

--练习2

-4.3 LL(1)文法与递归下降分析法

--LL(1)文法与递归下降分析法

--LL(1)文法与递归下降分析法

--LL(1)分析法和递归下降法的异同

--练习3

-4.4 构建FIRST集合FOLLOW集合

--构建FIRST集合FOLLOW集合

--构建FIRST集合FOLLOW集合

--讨论:FIRST集合FOLLOW集合的关系

--练习4

-4.5 LL(1)分析器工作原理

-- LL(1)分析器工作原理

--LL(1)分析器工作原理

-4.6 LL(1)分析表构造算法

--LL(1)分析表构造算法

--LL(1)分析表构造算法

--练习5

-讨论:自顶向下语法分析算法的实现方式

第5章 自底向上的语法分析

-5.1 自底向上的语法分析及优先分析

--自底向上的语法分析及优先分析

--自底向上的语法分析及优先分析

--练习1

-5.2 LR分析器

--LR分析器

--LR分析器

--练习2

-5.3 活前缀和LR(0)项目

-- 活前缀和LR(0)项目

--活前缀和LR(0)项目

--练习3

-5.4 构造识别活前缀的FA

--构造识别活前缀的FA

--构造识别活前缀的FA

--练习4

-5.5 LR(0)分析表构造算法

--LR(0)分析表构造算法

--LR(0)分析表构造算法

--练习5

-5.6 SLR(1)分析法

--SLR(1)分析法

--SLR(1)分析法

--练习6

-5.7 LR(1)分析法与LALR分析法

--LR(1)分析法与LALR分析法(上)

--LR(1)分析法与LALR分析法(下)

--LR(1)分析法与LALR分析法

--练习7

-讨论:比较四种LR分析法

第6章 语法制导翻译和中间代码生成

-6.1 语义分析和语法制导翻译概述

--语义分析和语法制导翻译概述

--语义分析和语法制导翻译概述

--练习1

-6.2 常见中间语言简介

--常见中间语言简介

--常见中间语言简介

--讨论:为什么要引入中间代码

--练习2

-6.3 简单算术表达式和赋值语句翻译

--简单算术表达式和赋值语句翻译

--简单算术表达式和赋值语句翻译

--练习3

-6.4 布尔表达式和复制语句翻译

--布尔表达式和复制语句翻译

--布尔表达式和复制语句翻译

-6.5 拉链和回填

--拉链与回填

--拉链与回填

--练习4

-6.6 程序控制语句翻译

--程序控制语句翻译

--程序控制语句翻译举例

--程序控制语句翻译

--练习5

-6.7 for循环语句的翻译

--for循环语句的翻译

--for循环语句的翻译

-6.8 GOTO语句和情况语句的翻译

--GOTO语句和情况语句的翻译

--GOTO语句和情况语句的翻译

--练习6

-6.9 含数组元素的算术表达式的翻译

--含数组元素的算术表达式的翻译

--含数组元素的算术表达式的翻译

--练习7

-6.10 数组元素赋值语句的翻译

--数组元素赋值语句的翻译

--数组元素赋值语句的翻译

--练习8

-讨论:三元式和四元式

第7章 符号表

-7.1 符号表概述

--符号表概述

--符号表概述

--练习1

-7.2 符号表的建立

--符号表的建立

-- 符号表的建立

--练习2

-讨论:符号表

第8章 运行时存储空间组织

-8.1 运行时存储空间组织概述

--运行时存储空间组织概述

--运行时存储空间组织概述

-8.2 运行时分配策略

--运行时分配策略

--运行时分配策略

--练习

第9章 中间代码优化

-9.1 线性窥孔优化

--线性窥孔优化

--线性窥孔优化

-9.2 基本块及其优化方法

--基本块及其优化方法

--基本块及其优化方法

-9.3 循环概念

--循环概念

--循环概念

-9.4 循环优化

--循环优化

--循环优化

-代码优化作业

-讨论:代码优化

上下文无关文法的句型分析笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。