编译原理课件CHAPTER 5(Semantic Analysis and Intermediate Code Generation-3)
合集下载
编译原理课件Chapter5
2:若有产生式Y→X, 如果First() 则: Follow(X)= First() 否则 Follow(X)=(First()-{}) Follow(Y)
3:重复2和3,直至对所有XVN,Follow(X)收 敛为止。
2021/4/6
17
文法G[E]: E T E’[1] E’ + T E’[2] | [3] T F T’[4] T’ * F T’[5] | [6] F i[7] | ( E )[8]
如为U→α和U→,满足:
Select(U→α) ∩ Select(U→)=Φ
2021/4/6
10
5.2 LL(1)文法的判别
判别算法: 1、计算非终结符是否能推出ε 2、构造First集 3、构造Follow集 4、构造Select集并作判别
2021/4/6
11
文法G[E]: E T E’[1] E’ + T E’[2] | [3] T F T’[4] T’ * F T’[5] | [6] F i[7] | ( E )[8]
若所有Xi都能* ,则
First()=
i
j=1
First(Xj)
2021/4/6
15
文法G[E]: E T E’[1]
E’ + T E’[2] | [3]
T F T’[4]
T’ * F T’[5] | [6]
F i[7] | ( E )[8]
First(TE’)=First(T)={( ,i } First(+TE’)={ + }
First(Y1)-{ε},First(Y2)-{ε},…
First(Yi-1)-{ε}, First(Yi)都包含在First(X)中。 当Yi * ε(i=1,2,…n), 将{ε}并入First(X)中。
3:重复2和3,直至对所有XVN,Follow(X)收 敛为止。
2021/4/6
17
文法G[E]: E T E’[1] E’ + T E’[2] | [3] T F T’[4] T’ * F T’[5] | [6] F i[7] | ( E )[8]
如为U→α和U→,满足:
Select(U→α) ∩ Select(U→)=Φ
2021/4/6
10
5.2 LL(1)文法的判别
判别算法: 1、计算非终结符是否能推出ε 2、构造First集 3、构造Follow集 4、构造Select集并作判别
2021/4/6
11
文法G[E]: E T E’[1] E’ + T E’[2] | [3] T F T’[4] T’ * F T’[5] | [6] F i[7] | ( E )[8]
若所有Xi都能* ,则
First()=
i
j=1
First(Xj)
2021/4/6
15
文法G[E]: E T E’[1]
E’ + T E’[2] | [3]
T F T’[4]
T’ * F T’[5] | [6]
F i[7] | ( E )[8]
First(TE’)=First(T)={( ,i } First(+TE’)={ + }
First(Y1)-{ε},First(Y2)-{ε},…
First(Yi-1)-{ε}, First(Yi)都包含在First(X)中。 当Yi * ε(i=1,2,…n), 将{ε}并入First(X)中。
《编译原理》教学课件 第5章-语义分析
类型分析
作用:把类型表示转换成类型的内部表示
分析过程:读Token序列,识别出各种类型, 返回类型内部表示的地址
array [ 1 .. 10 ] of integer
arrKind … low=1 tp1=intPtr … up=10 tp2=intPtr IndexPtr= (1,subTy, intPtr , 1 ,10) … … ElemPtr=intPtr size=(up-low+1) * sizeof (int)
VariBody:
Next
CaseUni VariUnits t
id CaseTyp Off e
FixBody VariBody Next
set: Size
Kind
BaseType
file: Size
pointer:
Size
Kind CompType Kind TypeName
例有如下的类型定义: at = ARRAY [1..10] OF ARRAY[1..100] OF integer; rt = RECORD x : real ; a : at; CASE u: boolean OF false:(k : integer); true:(y: real; b: boolean) END 构造类型的内部表示。
例有声明如下: CONST pai= 3.14 ;
TYPE vector=ARRAY[1..10] OF integer;
VAR x, y : real ;
r, s : vector ;
设当前层数和可用offset值分别为L和0, 构造标识符 pai, vector, x, y, r 和s 的属性表示,假设整数类型占1个单元,实 数类型占2个单元。
编译原理课件CHAPTER5(SemanticAnalysisandIntermediateCodeGeneration-1)
2019/11/8
6
5.2 语法制导翻译
属性的类型(从分析过程中属性值的计算方法 来分类):
1、综合属性(Synthesized Attributes): 属性值是分析树中该结点的子结点的属性值的 函数
2、继承属性(Inherited Attributes):属 性值是分析树中该结点的父结点和/或兄弟结 点的属性值的函数
Chapter5 Semantic Analysis and Intermediate Code Generation
语义分析概述 语法制导翻译
(Syntax-Directed Translation) 类型确定与类型检查
(Type Checking) 中间代码生成
(Intermediate Code Generation)
31
5.2 语法制导翻译
** Fig.5.16 是 Fig.5.2 的一种具体实 现方法
2019/11/8
32
5.2 语法制导翻译
L -属性定义(L-attributed definitions):
是一种语法制导定义 对于产生式 A→X1X2…Xn 右部 Xj 的继承属性,
它依赖于: 1、 X1,X2,…,Xj-1 ( Xj左边的文法符号)的 属性 2、A 的继承属性
(5.1)是一个适合以深度优先顺序计算属性 的翻译模式
E
T 9 {print(“9”)}
1
2019/11/8
R
-
T
3
{print(“-”)}
R
5 {print(“5”)} + T {print(“+”)} R
2
5
2 {print(“2”)}
《编译原理》课件
代码生成
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
编译原理CHAPTER 5(Semantic Analysis and Intermediate Code Generation-2)ppt课件
2018/11/15
12
P 1M ε id1
t1 8
D
id1 : T1 ; proc id2 ; id3 : T2 ; S
D2 5 ; 3 N
2
D1 :
;
T1 proc id2
D3 4 ;
id3 : T2
S
ε
5. t := top ( tblptr ) addwidth ( t, top ( offset ) ) pop ( tblptr ) pop ( offset ) enterproc ( top( tblptr), , t )
2018/11/15
11
P 1M ε id1
t2 t1 4 8
D
id1 : T1 ; proc id2 ; id3 : T2 ; S
D2 ; 3 N
2
D1 :
;
T1 proc id2
D3 4 ;
id3 : T2
S
ε
4. enter ( top( tblptr), , T2.type, top(offset) ) top( offset ) := top(offset) + T2.width
2018/11/15 13
P7 1M ε id1 D
6
D2 5 ; 3 N
id1 : T1 ; proc id2 ; id3 : T2 ; S
2
D1 :
;
T1 proc id2
D3 4 ;
id3 : T2
S
ε
6. 7. addwidth ( top ( tblptr ), top ( offset ) ) pop ( tblptr ) pop ( offset )
编译原理 第9讲第五章 优质课件
15
LL(1)文法判别
LL(1)文法(充分必要条件) 一个上下文无关文法G是LL(1)的,当且仅当对于G的每一个非终结符
A的任何两个不同产生式A α β ,下面的条件成立: 1.FIRST(α )∩FIRST(β )=,也就是α 和β 推导不出以同一个终结
符a为首的符号串;它们不应该都能推出空字. 2.假若β =>* ,那么,FIRST(α )∩FOLLOW(A)=.
识别输入串w=ccap是否为该文法的句子 试探,推导过程:
S=>Ap=>cAp=>ccAp=>ccap 试探成功
文法特点: 产生式的右部不全是由终结符开始 如果两个产生式有相同的左部,那么它们右部由不同的终结符或非终结符开始 没有空产生式
12
例子(3)
例:文法G1: S → aA | d
A → bAS | ε
3
语法分析
在语言的编译实现中,把句子分析的过程
称为语法分析,即完成这个任务的程序 称为语法分析程序或称为识别程序。分 析算法又称识别算法。 从左到右的分析算法,即总是从左到右地
识别输入符号串,首先识别符号串中的
最左符号,进而依次识别右边的一个符
号,直到分析结束。
4
分析算法分类
自上而下分析法:
从文法的开始符号出发,寻找与输入符 号串匹配的推导,或者说,为输入串寻 找一个最左推导。
这时
w的第二个符号可以与叶子 结点a得以匹配,但第三个 符号d却不能与下一叶子结 点b匹配
怎么办?-查看A有无另一个选 择,有!回溯,把A为根的 子树剪掉,扫描过的输入串 中的a吐出来,再试探用产生 式(3)构造推导S cAd cad
识别输入串w=caa的过程: 1.S cAd 2.选择(2)扩展A,得到推导S cAd
LL(1)文法判别
LL(1)文法(充分必要条件) 一个上下文无关文法G是LL(1)的,当且仅当对于G的每一个非终结符
A的任何两个不同产生式A α β ,下面的条件成立: 1.FIRST(α )∩FIRST(β )=,也就是α 和β 推导不出以同一个终结
符a为首的符号串;它们不应该都能推出空字. 2.假若β =>* ,那么,FIRST(α )∩FOLLOW(A)=.
识别输入串w=ccap是否为该文法的句子 试探,推导过程:
S=>Ap=>cAp=>ccAp=>ccap 试探成功
文法特点: 产生式的右部不全是由终结符开始 如果两个产生式有相同的左部,那么它们右部由不同的终结符或非终结符开始 没有空产生式
12
例子(3)
例:文法G1: S → aA | d
A → bAS | ε
3
语法分析
在语言的编译实现中,把句子分析的过程
称为语法分析,即完成这个任务的程序 称为语法分析程序或称为识别程序。分 析算法又称识别算法。 从左到右的分析算法,即总是从左到右地
识别输入符号串,首先识别符号串中的
最左符号,进而依次识别右边的一个符
号,直到分析结束。
4
分析算法分类
自上而下分析法:
从文法的开始符号出发,寻找与输入符 号串匹配的推导,或者说,为输入串寻 找一个最左推导。
这时
w的第二个符号可以与叶子 结点a得以匹配,但第三个 符号d却不能与下一叶子结 点b匹配
怎么办?-查看A有无另一个选 择,有!回溯,把A为根的 子树剪掉,扫描过的输入串 中的a吐出来,再试探用产生 式(3)构造推导S cAd cad
识别输入串w=caa的过程: 1.S cAd 2.选择(2)扩展A,得到推导S cAd
廖力编译原理课件第5章
第五章 优先分析法 19
5.2 算符优先分析法 三、直观算符分析法
1、PDA
a+b……# π 下 推 栈
OPND
θ #
OPTR
直观算符优先法 优先表
第五章 优先分析法 20
5.2 算符优先分析法 三、直观算符分析法
1、PDA 注:1)直观算符分析法使用两个工作栈:一个算符栈 (OPTR)存放运算符和括号;一个算量栈(OPND) 用于存放操作数和运算结果;OPTR栈的栈顶符号用θ 表示,OPND栈的栈顶符号用π表示 2)初态时,OPND为空,OPTR中只有“#”。 2、直观算符分析法算法
else if θ SYM then /*归约*/ {OPND栈顶两个元素π1、 π2弹出; 弹出OPTR栈顶元素θ; 将π1θπ2 的结果入OPND栈; } else ERROR; }}
第五章 优先分析法 23
5.2 算符优先分析法 三、直观算符分析法
3、算符优先分析法的优缺点 • 优点:1)简单明了,易于手工实现,适于分析各种算 术表达式。 – 2)使用算符优先分析法可以很方便的把表达式 译成目标指令,只要在归约时把计算π1θπ2值改为生 成相应指令( θ, π1,π2 ,T)即可。 • 缺点:1)算法采用两个栈,有时会把错误句子当成合 法句子;而且,它也无法指出输入串出错位置; – 2)对于含有单目正负号的算数表达式不好处理, 因为负号的优先级高于加减法,低于乘除法,但负 号的形式与减号相同,不容易识别。
第五章 优先分析法 17
5.2 算符优先分析法
右符 左符 + * ( ) i #
第五章 优先分析法 18
+
*
(
)
i
#
5.2 算符优先分析法
5.2 算符优先分析法 三、直观算符分析法
1、PDA
a+b……# π 下 推 栈
OPND
θ #
OPTR
直观算符优先法 优先表
第五章 优先分析法 20
5.2 算符优先分析法 三、直观算符分析法
1、PDA 注:1)直观算符分析法使用两个工作栈:一个算符栈 (OPTR)存放运算符和括号;一个算量栈(OPND) 用于存放操作数和运算结果;OPTR栈的栈顶符号用θ 表示,OPND栈的栈顶符号用π表示 2)初态时,OPND为空,OPTR中只有“#”。 2、直观算符分析法算法
else if θ SYM then /*归约*/ {OPND栈顶两个元素π1、 π2弹出; 弹出OPTR栈顶元素θ; 将π1θπ2 的结果入OPND栈; } else ERROR; }}
第五章 优先分析法 23
5.2 算符优先分析法 三、直观算符分析法
3、算符优先分析法的优缺点 • 优点:1)简单明了,易于手工实现,适于分析各种算 术表达式。 – 2)使用算符优先分析法可以很方便的把表达式 译成目标指令,只要在归约时把计算π1θπ2值改为生 成相应指令( θ, π1,π2 ,T)即可。 • 缺点:1)算法采用两个栈,有时会把错误句子当成合 法句子;而且,它也无法指出输入串出错位置; – 2)对于含有单目正负号的算数表达式不好处理, 因为负号的优先级高于加减法,低于乘除法,但负 号的形式与减号相同,不容易识别。
第五章 优先分析法 17
5.2 算符优先分析法
右符 左符 + * ( ) i #
第五章 优先分析法 18
+
*
(
)
i
#
5.2 算符优先分析法
《编译原理》课件
了解中间代码生成的概念和它在编译过程中的角色。 学习四元式和三地址码的表示和生成方式,以及中间代码优化的技巧。
六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成
六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成
《编译原理课件》PPT课件
它是源程序的一种内部表示形式。 设计中间代码的原则:一是容易生成,二是
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
Chapter5SemanticsPPT教学课件
Chapter Four
Semantics
2020/12/09
1
WHAT IS SEMANTICS? Semantics is a technical term used to refer to the study of the
communication of meaning through language.
2020/12/09
5
Contextualism
Contextualism holds that meaning should be studied in terms of situation, use, context---elements closely linked with language behaviour.
the place and time of the utterance, the speaker and the
hearer, the actions they are performing at the time, the
various objects and events existent in the situation
① This theory seems applicable to nouns only, but verbs, adjectives, and adverbs are definitely not labels of objects.
② Within the category of nouns, there are nouns which denote things that do not exist in the real world at all, such as “ghost”, “dragon”, and “unicorn”. And also nouns that do not refer to physical objects, but abstract notions such as “joy”, “impulse”.
Semantics
2020/12/09
1
WHAT IS SEMANTICS? Semantics is a technical term used to refer to the study of the
communication of meaning through language.
2020/12/09
5
Contextualism
Contextualism holds that meaning should be studied in terms of situation, use, context---elements closely linked with language behaviour.
the place and time of the utterance, the speaker and the
hearer, the actions they are performing at the time, the
various objects and events existent in the situation
① This theory seems applicable to nouns only, but verbs, adjectives, and adverbs are definitely not labels of objects.
② Within the category of nouns, there are nouns which denote things that do not exist in the real world at all, such as “ghost”, “dragon”, and “unicorn”. And also nouns that do not refer to physical objects, but abstract notions such as “joy”, “impulse”.
编译原理 课件chapter5
T E E+ E+4 E+F E+T E En L
15 15 1515-4 15-4 15-4 19 19 19
T→ T*F E→ T
F → digit T→ F E→ E+T
L→ En
32
总结: 总结 采用自底向上分析,例如LR分析,首先给出 S-属性定义,然后,把S-属性定义变成可执行 的代码段,这就构成了翻译程序.象一座建筑, 语法分析是构架,归约处有一个"挂钩",语 义分析和翻译的代码段(语义子程序)就挂在 这个钩子上.这样,随着语法分析的进行,归 约前调用相应的语义子程序,完成相应的翻译任 务.
state
val ... A .a
top
... A
定义式 A .a:=f(X.x, Y.y, Z.z)(抽象)变成 val[ntop]:=f(val[top-2],val[top-1],val[top]) (具体可执行代码). 在执行代码段之前执行: ntop:=top-r+1 执行代码段后执行: top:=ntop; r是句柄的长度.
25
例5.9
表达式 a+a*(b-c)+(b-c)*d 的dag
+ + * a b – c
26
* d
5.3 S-属性定义及其自底向上的计算 在分析栈中使用一个附加的域来存放综 合属 性值. 下图为一个带有综合属性值域的分析栈:
top
state ... X Y Z ...
val ... X.x Y.y Z.z ...
3
要求:随着语法分析,分析树逐步被构造出 来,每构造一个子树,和这棵子树结点相联系 的文法符号的属性值都可以根据已有结点属性 值的计算出来的.一个重要的属性定义类称作 "L—属性"定义,满足上述要求.
编译原理chapter5
struct expty expTy (Tr_exp exp; Ty_ty ty) { struct expty e; e.exp=exp; e.ty=ty; return e; }
5.2 Type-Checking Expressions
• 举例:在Tiger语言中,加法表达式e1+e2
– 两个操作数都必须是整型的(类型检查器必须对此检查) – 结果是整型(类型检查器将返回这种类型)
• 用散列表对字典操作(插入、搜索和删除)的平均时间 为Θ(1),此操作在最坏情况下的操作正比于元素个数n。 • 二叉搜索树对字典的基本操作能在O(logn)的时间内完成。
5.1.3 Efficient Functional Symbol Tables
• 二叉搜索树:
m1={bat→1, camel→2, dog→3} m2=m1+{mouse→4}
• 当σ′= σ + { a→τ },是通过以a 作为键值将τ 插入散 列表来实现的。
void insert ( string key, void *binding) { int index = hash(key) % SIZE table[index] = Bucket ( key, binding, table[index]); } unsigned int hash ( char *s0) { unsigned int h=0; char *s; for ( s=s0; *s; s++) h=h*65599 + *s; return h; }
– formals:各个形式参数的类型;
– result:该函数返回的结果的类型(或Void)。
5.2 Tiger编译器的绑定
语言学_Chapter5_Semantics解读共119页PPT
21、要知道对好事的称颂过于夸大,也会招来人们的反感轻蔑和嫉妒。——培根 22、业精于勤,荒于嬉;行成于思,毁于随。——韩愈
语言学_Chapter5_Semantics解读
1、合法而稳定去温厚善良的美 德。— —伯克
3、最大限度地行使权力总是令人反感 ;权力 不易确 定之处 始终存 在着危 险。— —塞·约翰逊 4、权力会奴化一切。——塔西佗
5、虽然权力是一头固执的熊,可是金 子可以 拉着它 的鼻子 走。— —莎士 比
23、一切节省,归根到底都归结为时间的节省。——马克思 24、意志命运往往背道而驰,决心到最后会全部推倒。——莎士比亚
25、学习是劳动,是充满思想的劳动。——乌申斯基
谢谢!
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-6-28
17
例 : A + B * ( C - D ) + E / ( C - D ) ↑N
求: 1.后缀式 2.四元式 3.三元式 4.间接三元式
2013-6-28 18
例 : A + B * ( C - D ) + E / ( C - D ) ↑N
后缀式 : A B C D - * + E C D – N ↑ / + 四元式 : (1) ( - C D T1 ) T2)
2013-6-28
34
5.4
中间代码生成
分析控制流语句的语法制导定义 P493 Fig.8.23
2013-6-28
35
5.4
中间代码生成
控制流语句中布尔表达式的翻译
产生布尔表达式三地址代码的语法制导定义
P494 Fig.8.24 or and not 关系表达式 是 L-属性定义,不能用自底向上的翻译,只能用深 度优先的分析方法 改写语法制导定义为翻译模式
id4
t1 := id2 + id3 t2 := t1 + id4 id1 := t2
id3
2013-6-28
25
5.4
中间代码生成
访问数组元素(Array Elements) 数组被存储在一片连续的空间中,见P482 Fig.8.17 访问数组元素,与以下几个量有关
Base(数组元素的起始地址)— 此值登记在符号表中 数组的维数(dimensional) — 说明时确定 每一维的下界(low)和上界(high),(取值个 数)— 说明时确定 存储方式 — 按行(row-major)还是按列(columnmajor) — 与编译器设计有关
中间代码生成
修改建立表达式语法树的语法制导定义, 产生表达式的 DAG
在构造结点前检查现有结点,若存在相 同结点则返回该结点的指针
2013-6-28
11Βιβλιοθήκη 5.4中间代码生成
三地址代码(Three-Address Code)
一般形式:x := y op z 一般含三个地址(名字、常数、临时变量), 两个操作数,一个运算结果
1
2013-6-28
5.4
中间代码生成
中间表示(Intermediate Representation)
是语法分析以后到目标代码生成之间的源程序 表现形式,是语义分析的结果
1、编译器分为前端和后端两部分,提高编译器
开发效率
2、可以设计针对中间代码的代码优化器
2013-6-28 2
5.4
中间代码生成
S id1 := E2 E1
*
( -
E3 E4 E5 )
id2
2013-6-28
id3
23
1. P : = id2 id1 E2 . Place := id2 2. P := id3 E5 . place := id3 3. E4 . Place := t1 emit ( ‘ t1 := - id3 ’ ) 4. E3 . Place := t1 5. E1 . Place := t2 emit ( ‘ t2 := id2 * t1 ’ ) 6. P := id1 emit ( ‘ id1 := t2 ’ )
三地址语句的类型:
P467-468 (P301 中)
2013-6-28
14
5.4
中间代码生成
三地址代码的实现形式
四元式(Quadruples):带有四个域的记录 结构
例子:P471 Fig.8.8(a)
三元式(Triples):带有三个域的记录结构 无 result 域,用语句编号表示结果
与语法树的区别:语法树中公共子表达式 (Common Subexpression)由重复的子树 表示,而 DAG 中只用一个子树表示,因此 代表公共子表达式的结点有多个父节点 DAG 中结点数比语法树少 例子: P291(Fig.5.11) P464(Fig.8.2)
10
2013-6-28
5.4
与一般的算术表达式类似 运算符是 or、and、not等 运算量是布尔常量(true、false)或关系表达 式(其值也是布尔量) 产生文法见 P488 (P316 中)
29
2013-6-28
5.4
中间代码生成
翻译布尔表达式的方法
翻译布尔表达式是为了得到表达式的运算结果 布尔表达式的运算结果是 true 或 false 如何体现运算结果?
26
2013-6-28
5.4
•
中间代码生成
知道了上面这些量,可以计算出每一个数组 元素的地址,可以在语句中引用
访问数组元素的翻译模式(P484-485)(P312 中)
2013-6-28
27
5.4
中间代码生成
访问记录中的域(Fields in Records) 每个记录类型变量一张符号表
a := b + c — a b c + := GOTO L — L jump If E then S1 else S2 — E S1 S2 ¥ (―¥”表 示3目运算)
4
2013-6-28
5.4
中间代码生成
图表示法(Graphical Representations)
(抽象)语法树((Abstract) Syntax Tree):是 分析树的浓缩表示
2013-6-28
30
5.4
中间代码生成
1、把 true、false 数值化(如 true 为1,false 为0 ) 此时布尔表达式的计算类似于算术表达式的 计算 翻译模式可参考算术表达式的翻译模式写出, 见 P490 Fig.8.20
注意关系表达式的翻译 注意 nextstat
36
2013-6-28
5.4
中间代码生成
例子: P494 example 8.4
E 1 {E1…} E1 or a < b {E1…} 2 4 {E3…} E and 3 c < d {E3…} 5
3 {E2..} E2 9 {E..}
6 {E4..} E4 e < f {E4…} 7
8 {E2..}
* 深度优先执行语义规则
2013-6-28 37
31
2013-6-28
5.4
中间代码生成
例子: a<b or c<d and e<f 翻译结果见 P491
E 1 a E1 < b or
5 E2 4
E3 2 and < d e
E4
<
3
f
c
2013-6-28
32
5.4
中间代码生成
2、把 true、false 体现在程序(三地址代码形 式)的位置上(如true 为109,false 为103 )
5.4
中间代码生成
赋值语句(Assignment Statements)
翻译模式 — P479 Fig.8.15
Lookup的执行过程
无嵌套处理 如 C
有嵌套处理 如 PASCAL
Emit、Newtemp 的执行过程
22
2013-6-28
5.4
中间代码生成
例:分析句子 id1 := id2 * ( - id3 )
一般用此方法来实现控制流语句中的布尔表 达式 如 true 跳转到标号为 109 的语句,false 跳 转到标号为 103 的语句 布尔表达式的值体现在控制转移到的位置上
33
2013-6-28
5.4
中间代码生成
控制流语句
三种控制流语句的执行流程 P492 Fig.8.22
E.true — 表达式 E 的真出口 E.false — 表达式 E 的假出口 S.begin — 语句 S 对应三地址代码的第一条语句的 标号 S.next — 语句 S 对应三地址代码的下一条语句的 标号
运算符和关键字作为内部结点,其子结点代 表运算分量或操作对象 语法树的特点是结构紧凑,相比于分析树, 结点数大大减少
例子: P2(Fig.1.2) P6(Fig.1.4)
5
2013-6-28
5.4
中间代码生成
建立表达式语法树的语法制导定义 P289 Fig.5.9 mknode(op,left,right) mkleaf(id,entry) mkleaf(num,val)
(2) ( * B T1 (4) ( - C (5) (↑ T4
(3) ( + A T2 T3) D T4) N T5)
(6) ( / E T5 T6) (7) ( + T3 T6 T7)
2013-6-28 19
例 : A + B * ( C - D ) + E / ( C - D ) ↑N
三元式:
2013-6-28
6
5.4
中间代码生成
例子:a – 4 + c E E1 + T2 num
分析树
T3 id2 id1
+ id2 num
语法树
7
E2 T1