当前课程知识点:编译技术 > 第八章 基于Python的编译器框架实现 > 8.2 代码介绍 > 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 编译技术绪论
--编译原理介绍--作业
-2.1 词法记号 串和语言
--2.1 词法记号 串和语言--作业
-2.2 正规式 状态转换图
--2.2 正规式 状态转换图--作业
-2.3 有限自动机
--2.3 有限自动机--作业
-2.4 DFA构建 子集构造法 DAF化简
-2.5 Lex
-3.1 上下文无关文法
--3.1.3 推导
-3.2 自上而分析中的文法
--3.2 上下文无关文法--作业
--3.2.3 语言和文法--作业
-3.3 自上而下分析
-3.4 自下而上分析
--3.4 自下而上分析--作业
-3.5 LR分析器
-4.1 语法制导的定义
--4.1 语法制导的定义--作业
-4.2 S属性的自下而上计算
-4.3 L属性定义
--4.3 L属性定义--作业
-4.4 L属性的自下而上计算
--4.4 L属性的自下而上计算--作业
-5.1 概述
--5.1 概述
--概述-作业
-5.2 全局栈式存储分配
-5.3 调用序列
--5.3 调用序列
-5.4 非局部名字的访问
--5.4 非局部名字的访问--作业
-6.1 中间代码生成
-6.2 作用域信息的保存
-7.1 代码生成器设计中的问题
-7.2 目标机器
--7.2 目标机器
--7.2 目标机器--作业
-7.3 基本块和流图
-7.4 一个简单的代码生成器
-8.1 基于Python的编译器框架演示视频和代码
-8.2 代码介绍
--8.2.4 SA
-8.3 SimpleJava