当前课程知识点:Compilers Techniques > 8 Design and Implementation of a Simple Compiler > 8.2 Basic > 8.2.4 SA
返回《Compilers Techniques》慕课在线视频课程列表
返回《Compilers Techniques》慕课在线视频列表
各位同学
大家好
我们在学习完编译器
基本的知识之后
我们是不是可以自己来编写一个编译器呢?
从这节课开始
我们就来学习一下
基于Python的简易编译器实现
我们可以从头到尾
来学习一下
如何自己来编写一个编译器
我们看一下语义分析的部分
语义分析的作用
主要是利用属性文法和分析树
实现上下文有关分析
在语义分析的部分
需要针对不同的产生式
给定不同的属性文法
在这里
我们利用装饰器
来建立产生式和函数的映射关系
下面我们来看一下
Parse Tree的实现方法
在语法树相关的部分
我们设计了TreeNode这个类
由于后面还有抽象语法树
因此
在这里我们提取公共的部分
实现了一个公有的父类TreeNode
在TreeNode类当中
我们需要注意
在这里包含了
重载属性相关的函数
这样我们可以将属性
映射到私有的字典
在这里
我们需要简单的封装一下根结点
把它封装到class Tree
语法树当中包含PTNode
PTNode类继承自TreeNode
在PTNode类当中
我们需要记录
每个结点的产生式编号
以便为装饰器映射函数做准备
那么语义分析
可以用来做什么呢
语义分析可以用来直接求取数值
比如说
针对计算器的编译器来说
我们可以直接用来求数值
针对计算器
如果编写好了编译器之后
我们输入对应的计算语句
比如说24×500+15×30
就可以看到语义分析的结果
语义分析这一步
除了求取值以外
还可以生成中间表示
我们记为IR
中间表示
大家回忆一下有常用的几种
比如说可以用抽象语法树
如左边所示
还可以使用三地址代码
如右边所示
在设计中间表示的时候
还需要考虑
需要记录符号表和作用域
下面我们看一下
属性文法的实现方法
这部分放入PaserTreeActionRegister类当中实现
在这部分当中
我们利用装饰器
来实现基于属性文法的语义分析
从语义分析开始
我们发现
所有的规则都必须针对具体的语言本身
来进行设计
所以从这里开始
我们以一个架空的语言
也就是一个小的语言
作为例子来进行说明
这里我们以simpleJavaCompiler
做一个简单的例子
来说明编译器的开发过程
SimpleJava编译器的说明
放在下一讲
谢谢大家的学习
这一讲就到这里
谢谢大家
-1.1 Overview of Compilers Techniques
--Chapter 1 Overview of Compilers Techniques
--Overview of Compilers Techniques
-2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
-2.2 Regular form
--2.2 Regular form
-2.3 Finite automata
--2.3 Finite automata
-2.4 DFA construction, Subset construction, Simpleset DFA
--2.4 DFA construction, Subset construction, Simpleset DFA
-2.5 Lex
--2.5 Lex
-3.1 Context-free Grammars
--3.1.1 The Role of the Parser
--3.1.2 The Formal Definition of a Context-free Grammar
-3.2 Writing a Grammar
--3.2.1 Elimination of Left Recursion
--3.2 Top-Down Parsing
-3.3 Languages and Grammars
--3.3 Language and Grammars
-3.4 Top-Down Parsing
--3.4.3 Recursive Descent Analysis
--3.4.4 Nonrecursive Descent Analysis
-3.5 Bottom-up Parsing
--Bottom-up Parsing
-3.6 LR Parsing
--3.6.6 Characteristics of LR Parsing
--3.6.7 Non Ambiguous and Not LR Context-Free Grammars
-4.1 Syntax-Directed Definitions
--4.1.2 Attribute Dependency Graphs and Ordering the Evaluation of Attributes
--Syntax-Directed Definitions
-4.2 Bottom-Up Calculation of S Attribute
--4.2.1 Bottom-Up Calculation of S-Attributed
-4.3 L-Attributed Definitions
--4.3.1 L-Attributed Definitions
--4.3.3 Design of Predictive Translator
--L-Attributed Definitions
-4.4 Bottom-Up Parsing of L-Attributed Translation
--4.4.1 Bottom-Up Parsing of L-Attributed Translation
--4.4.2 Simulate the Parsing of Inherited Properties
--Bottom-Up Parsing of L-Attributed Translation
-5.1 Overview
--Overview
-5.2 Global Stack Storage
-5.3 Calling Sequences
-5.4 Non Local Names
--5.4 Non Local Names and dynamic scope
--Non Local Name
-6.1 Overview of Intermediate Code Generation
--6.1 Overview of Intermediate Code Generation
-6.2 Declaration Statements
-7.1 Issues in the Design of Code Generator
--7.1 Issues in the Design of Code Generator
-7.2 Target Machine
--Target Machine
-7.3 Basic Blocks and Flow Graphs
--7.3 Basic Blocks and Flow Graphs
-7.4 A Simple Code Generator
-8.1 Demonstration of Compiler Framework based on Python
--8.1 Demonstration of Compiler Framework based on Python
-8.2 Basic
--8.2.4 SA
-8.3 SimpleJava