当前课程知识点:编译技术 >  第八章 基于Python的编译器框架实现 >  8.2 代码介绍 >  8.2.4 SA

返回《编译技术》慕课在线视频课程列表

8.2.4 SA在线视频

下一节:8.3 SimpleJava

返回《编译技术》慕课在线视频列表

8.2.4 SA课程教案、知识点、字幕

各位同学

大家好

我们在学习完编译器

基本的知识之后

我们是不是可以自己来编写一个编译器呢?

从这节课开始

我们就来学习一下

基于Python的简易编译器实现

我们可以从头到尾

来学习一下

如何自己来编写一个编译器

我们看一下语义分析的部分

语义分析的作用

主要是利用属性文法和分析树

实现上下文有关分析

在语义分析的部分

需要针对不同的产生式

给定不同的属性文法

在这里

我们利用装饰器

来建立产生式和函数的映射关系

下面我们来看一下

Parse Tree的实现方法

在语法树相关的部分

我们设计了TreeNode这个类

由于后面还有抽象语法树

因此

在这里我们提取公共的部分

实现了一个公有的父类TreeNode

在TreeNode类当中

我们需要注意

在这里包含了

重载属性相关的函数

这样我们可以将属性

映射到私有的字典

在这里

我们需要简单的封装一下根结点

把它封装到class Tree

语法树当中包含PTNode

PTNode类继承自TreeNode

在PTNode类当中

我们需要记录

每个结点的产生式编号

以便为装饰器映射函数做准备

那么语义分析

可以用来做什么呢

语义分析可以用来直接求取数值

比如说

针对计算器的编译器来说

我们可以直接用来求数值

针对计算器

如果编写好了编译器之后

我们输入对应的计算语句

比如说24×500+15×30

就可以看到语义分析的结果

语义分析这一步

除了求取值以外

还可以生成中间表示

我们记为IR

中间表示

大家回忆一下有常用的几种

比如说可以用抽象语法树

如左边所示

还可以使用三地址代码

如右边所示

在设计中间表示的时候

还需要考虑

需要记录符号表和作用域

下面我们看一下

属性文法的实现方法

这部分放入PaserTreeActionRegister类当中实现

在这部分当中

我们利用装饰器

来实现基于属性文法的语义分析

从语义分析开始

我们发现

所有的规则都必须针对具体的语言本身

来进行设计

所以从这里开始

我们以一个架空的语言

也就是一个小的语言

作为例子来进行说明

这里我们以simpleJavaCompiler

做一个简单的例子

来说明编译器的开发过程

SimpleJava编译器的说明

放在下一讲

谢谢大家的学习

这一讲就到这里

谢谢大家

编译技术课程列表:

第一章 绪论

-1.1 编译技术绪论

--1.1 编译技术绪论

--编译原理介绍--作业

第二章 词法分析

-2.1  词法记号 串和语言

--2.1 词法记号 串和语言

--2.1  词法记号 串和语言--作业

-2.2  正规式 状态转换图

--2.2 正规式 状态转换图

--2.2  正规式 状态转换图--作业

-2.3  有限自动机

--2.3 有限自动机

--2.3  有限自动机--作业

-2.4  DFA构建 子集构造法 DAF化简

--2.4 DFA构建

-2.5 Lex

--2.5 词法分析工具Lex

第三章 语法分析

-3.1 上下文无关文法

--3.1.1 语法分析概述

--3.1.2 上下文无关文法定义

--3.1.3 推导

--3.1.4 二义性

-3.2 自上而分析中的文法

--3.2.1 消除左递归

--3.2.2 提取左因子

--3.2 上下文无关文法--作业

--3.2.3 语言和文法

--3.2.3 语言和文法--作业

-3.3 自上而下分析

--3.3.1 first follow

--3.3.2 LL(1)文法

--3.3.3 递归下降分析

--3.3.4 非递归下降分析的预测分析器

-3.4 自下而上分析

--3.4.1 归约句柄

--3.4.2 移进归约分析过程

--3.4 自下而上分析--作业

-3.5 LR分析器

--3.5.1 LR分析器

--3.5.2 活前缀

--3.5.3 SLR分析方法

--3.5.4 规范的LR分析方法

--3.5.5 LALR分析方法

--3.5.6 LR分析方法特点

--3.5.7 非二义且非LR的上下文无关文法

第四章 语法指导的翻译

-4.1 语法制导的定义

--4.1.1 属性文法

--4.1.2 属性依赖图和计算次序

--4.1 语法制导的定义--作业

-4.2 S属性的自下而上计算

--4.2.1 S属性的自下而上计算

--4.2.2 栈代码

-4.3 L属性定义

--4.3.1 L属性定义

--4.3.2 翻译方案

--4.3.3 预测翻译器的设计

--4.3 L属性定义--作业

-4.4 L属性的自下而上计算

--4.4.1 L属性的自下而上计算

--4.4.2 模拟继承属性的计算

--4.4 L属性的自下而上计算--作业

第五章 运行时存储空间的组织与管理

-5.1  概述

--5.1 概述

--概述-作业

-5.2  全局栈式存储分配

--5.2 全局栈式存储

-5.3  调用序列

--5.3 调用序列

-5.4 非局部名字的访问

--5.4 非局部名字

--5.4 非局部名字的访问--作业

第六章 中间代码生成

-6.1 中间代码生成

--6.1 中间代码生成概述

-6.2 作用域信息的保存

--6.2 声明语句-作用域信息的保存

第七章 代码生成

-7.1 代码生成器设计中的问题

--7.1 代码生成器的设计中的问题

-7.2 目标机器

--7.2 目标机器

--7.2  目标机器--作业

-7.3 基本块和流图

--7.3 基本块和流图

-7.4 一个简单的代码生成器

--7.4 一个简单的代码生成器

第八章 基于Python的编译器框架实现

-8.1 基于Python的编译器框架演示视频和代码

--8.1 基于Python的编译器框架演示

-8.2 代码介绍

--8.2.1 Scanner

--8.2.2 Parser -1LRItem

--8.2.3 Parser-2ActionGoto

--8.2.4 SA

-8.3 SimpleJava

--8.3 SimpleJava

8.2.4 SA笔记与讨论

也许你还感兴趣的课程:

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