编译原理原理与技术.ppt
合集下载
编译原理ppt课件
源程序
编译 程序
目标 程序
19 PPT课件整理
20 PPT课件整理
❖ 编译程序又可根据用途和侧重点的不同, 进一步分类为:
①诊断编译程序(Diagnostic Compiler)
专门用于帮助程序开发和调试的编译程序 ②优化编译程序(Optimizing Compiler)
着重于提高目标代码效率的编译程序 ③交叉编译程序(Cross Compiler)
❖ 该课程涉及多门课程的内容综合运用,涉及面广,
内容庞杂,学习艰难
程序设计语言、计算机体系结构、语言理论及算法等 数据结构、离散数学
❖ 该课程涉及的原理、方法和技术具有十分普遍的意 义
每一个计算机科学与技术工作者的职业生涯中反复用到, “享用一辈子”
这儿接受的训练很难在其他地方获得,如:抽象与形式 化方法、局部与全局优化方法、构造技术、证明方法等
能够产生不同于其宿主机机器代码的编译程序 ④可变目标编译程序(Retargetable complier)
无须重写与机器无关部分就能改变目标机的 编译程序
21 PPT课件整理
二、与编译程序相关的程序
本讲义只介绍编译程序(器)构造的基本原
理、方法与技术,但在一个完整的语言开发
(或称程序设计)环境中,除了编译器这一
2. 理论联系实际——亲自动手,构造一个 演示性编译程序,至少要完成扫描器和 语法分析器,以及语法制导翻译产生中 间代码(课程设 特别要下功夫认真学习如何从实际问题 进行抽象并形式化,最终建立实际问题 的模型(上升为理性认识),并借助模 型进一步设计实现,这将对你能力的提 高大有益处
主要工具外,还需要其他一些工具,如编辑
器、连接器、装入程序等。现代计算机系统
编译原理与技术讲义.ppt
《编译原理与技术》讲义
20
编译程序的组成结构
符号表管理
名称 类型
…
position float
initial float
rate float
2020/10/20
《编译原理与技术》讲义
11
编译程序的组成结构
词法分析阶段 语法分析阶段 语义分析、中间代码生成 优化阶段 目标代码生成
2020/10/20
《编译原理与技术》讲义
12
编译程序的组成结构
后端
back end 与目标机相关
program
scanner parser semantics
2020/10/20
《编译原理与技术》讲义
19
编译程序的组成结构
代码生成 与目标机器有密切联系,如指令选择,寄存 器的使用等。
movf rate, R1 mulf #60.0, R1 movf initial, R2 addf R2, R1 movf R1, position
2020/10/20
目标程序 T (机器语言)
初始数据
2020/10/20
目标程序 T 运行系统 计算机
计算结果
《编译原理与技术》讲义
8
什么是编译程序?
源语言(程序)到目标语言(程序)的映射 转换或者翻译过程
系列转换(翻译)过程
源语言S
T1
…
Tn
中间语言
目标语言T
2020/10/20
《编译原理与技术》讲义
9
解释程序与汇编程序
fact(n) = n * fact( n-1 ) // n! == n * (n-1)!
伪语言描述 fact(n) = if n ≤ 0 then 1 else n*fact(n-1)
编译原理与技术课程课件 (11)
push(t,tblptr); push(0,offset) } /* 建立主程序(最外围)的符号表
偏移从0开始 */ DD1 ; D2
2019/5/20
《编译原理与技术》讲义
23
D proc id ; N D1 ; S { t := top( tblptr ); addwidth( t, top( offset ) );
25
e.g.10 过程嵌套声明
i : int; j : int ;
PROC P1 ; k : int; f : real ;
PROC P2; l : int ;
a1 ; a2; PROC P3; temp : int ; max : int ;
三元式
⑴⑬
⑭
⑬(*, b,c )
⑵⑭
⑬
⑭(/, d, f )
⑶⑮
⑮
⑮ ( + , ⑬, ⑭)
⑷⑯
⑯
⑯ ( := , a , ⑮)
2019/5/20
《编译原理与技术》讲义
13
中间代码的种类
四元式
按编号次 序计算
计算结 果存于
方便移动,计算 大量引入临 次序容易调整 时变量
result
三元式
按编号次 序计算
2019/5/20
《编译原理与技术》讲义
7
中间代码的种类
e.g.4 构造表达式a+b*-4的语法树(DAG)
+
ID a
*
ID b
@
NUM 4
2019/5/20
《编译原理与技术》讲义
8
中间代码的种类
三地址代码
一般形式:x := y op z 或 x := op y
偏移从0开始 */ DD1 ; D2
2019/5/20
《编译原理与技术》讲义
23
D proc id ; N D1 ; S { t := top( tblptr ); addwidth( t, top( offset ) );
25
e.g.10 过程嵌套声明
i : int; j : int ;
PROC P1 ; k : int; f : real ;
PROC P2; l : int ;
a1 ; a2; PROC P3; temp : int ; max : int ;
三元式
⑴⑬
⑭
⑬(*, b,c )
⑵⑭
⑬
⑭(/, d, f )
⑶⑮
⑮
⑮ ( + , ⑬, ⑭)
⑷⑯
⑯
⑯ ( := , a , ⑮)
2019/5/20
《编译原理与技术》讲义
13
中间代码的种类
四元式
按编号次 序计算
计算结 果存于
方便移动,计算 大量引入临 次序容易调整 时变量
result
三元式
按编号次 序计算
2019/5/20
《编译原理与技术》讲义
7
中间代码的种类
e.g.4 构造表达式a+b*-4的语法树(DAG)
+
ID a
*
ID b
@
NUM 4
2019/5/20
《编译原理与技术》讲义
8
中间代码的种类
三地址代码
一般形式:x := y op z 或 x := op y
《编译原理》课件
代码生成
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
《哈工大编译原理》课件
词法分析过程
输入
源程序的字符流。
01
输出
源程序的标记流。
02
1. 初始化
设置初始状态和缓冲区。
03
2. 循环
04 从缓冲区中取出一个字符,根
据当前状态和该字符确定下一 个状态和标记。
3. 输出
05 输出当前标记,并更新状态和
缓冲区。
4. 结束条件
06 当缓冲区为空且所有字符都被
处理时,结束词法分析。
三地址代码的生成
三地址代码定义
三地址代码是一种中间代码形式,由一系列的三元式组成,每个三 元式包含三个操作数和两个操作符。
三地址代码的特点
三地址代码具有简单、直观和易于优化的特点,能够清晰地表示程 序中的控制流程和数据流。
三地址代码的生成算法
常见的三地址代码生成算法包括递归下降分析法和语法制导翻译法 。
示中间代码,以便进行有效的优化和转换。
代码生成器的构造
代码生成器通常由指令选择、控制流优化、循环优化等 模块组成。
控制流优化模块负责对控制流进行分析和优化,如消除 冗余计算、消除无用代码等。
指令选择模块负责从中间代码中选择合适的机器指令, 并进行指令调度和并行化。
循环优化模块负责对循环结构进行优化,如循环展开、 循环合并等。
编译原理的应用非常广泛,如编译器设计、程序分析、软件工程等。
编译过程的基本概念
源程序
用高级语言编写的程序,也称为源代码。
目标程序
编译后的程序,也称为目标代码或机器代码。
编译程序
将源程序翻译成目标程序的软件。
编译过程
将源程序通过词法分析、语法分析、语义分析、中间代码生成、优化 、目标代码生成等阶段,最终生成目标程序的过程。
编译原理第一章PPT课件
掌握编译原理有助于提高程序员对程序性能、代码质量和软件
03
工程实践的理解。
编译原理的应用领域
编译器设计
编译原理的核心应用领域之一 是编译器设计,包括源代码到
目标代码的转换、优化等。
解释器设计
解释器是另一种将源代码转换 为机器码的程序,编译原理同 样适用于解释器的设计。
程序分析
编译原理中的一些技术可以用 于程序分析,例如静态分析、 动态分析和程序切片等。
从高级语言的设计开始,逐步向下设计低级语言和机器语言。
数据结构和算法选择
选择合适的数据结构和算法,提高编译器的性能和可维护性。
代码优化
在生成目标代码之前,对中间代码进行优化,以提高目标代码的性能 和质量。
04 语言与语法
语言的定义与分类
总结词
语言的定义与分类是编译原理的重要基础,它涉及到语言的语法、语义和语用等方面。
语言的语义分析
总结词
语义分析是编译过程中的重要环节,它涉及 到对语言意义的解释和理解。
详细描述
语义分析是对源代码进行静态分析的过程, 目的是理解源代码的意义和功能。在语义分 析阶段,编译器会检查源代码中是否有语法 错误、类型错误、逻辑错误等,并对其进行 相应的处理。同时,语义分析还会进行符号 表管理、类型检查、控制流分析等工作,以
详细描述
中间代码生成是编译过程的第三步,其主要任务是将抽象语法树转化为中间代码。中间代码是一种抽象的、与具 体机器无关的代码形式,通常采用三地址码、四元式等表示方式。中间代码的主要目的是为了方便后续的优化和 目标代码生成。
代码优化
总结词
对中间代码进行优化,提高执行效率。
详细描述
代码优化是编译过程中非常重要的一步,其主要任务是对中间代码进行优化,以提高生成的目标代码 的执行效率。常见的优化技术包括常量折叠、无用代码删除、循环展开等。
编译原理精选版演示课件.ppt
预测分析表
3
表驱动的预测分析程序模型
khk
4
实现步骤:
(1) 判断文法是否为LL(1)文法。 如果文法中含有左递归,必须先消除 左递归
(2)构造预测分析表 : Select(A ) (3)列出预测分析过程
khk
5
第6章:自底向上分析方法
自底向上分析方法,也称移进归约分析法
实现思想(是推导的逆过程):
对输入符号串自左向右进行扫描,并将输入符逐个 移入一个后进先出栈中,边移入边分析,一旦栈顶 符号串形成某个句型的可归约串时,就用该产生式 的左部非终结符代替相应右部的文法符号串,称为 归约。重复这一过程,直到归约到栈中只剩下文法 的开始符号时,则分析成功。
关键问题
khk
6
移进—规约分析(Shift-reduce parsing)
+
A a
可得 b <. a
由A→( B 且B+ ( B… 可得 (<. (
+
B aa…
可得 (<. a
+
B Aa )
可得 (<. A
khk
18
A(B(Aa) …)
(3) 求> .关系:
A(B…B
+
Aa
由S→bAb,且A…) 可得 ) > . b
A+…B 可得 B > . b
khk
88
例1:文法
SaAcBe A b A Ab B d
输入串abbcde#分析
khk
9
归约分析过程(移进归约):
步骤 1 2 3 4 5 6 7 8 9 10 1kh1k
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
编译原理(1)50页PPT
编译程序
将一种语言书写的程序翻译成另一种语 言的等价的程序。 编译程序的输入对象称为源程序。 编译程序的输出对象称为目标程序。
高级语言程序的处理过程
常用的翻译工具有3种
根据被翻译语言与执行方式的不同 1.汇编程序
用于特定计算机上的汇编语言的翻译程序。
2.编译程序 3.解释程序
对源程序进行翻译的程序
sum = first+count*10
id1∶=id2+id3*10 四元式(运算符,运算对象1,运算对象2,结果)
5.中间代码优化
任务:通过调整和改变中间代码中某些 操作的次序,最终产生更加高效率的目 标代码 优化所依循的原则是程序的等价变换规 则 其方法有:公共子表达式的提取、循环 优化、删除无用代码等。
任务:扫描源程序,根据语言的词 法规则,分解和识别出每个单词, 并把单词翻译成相应的机内表示。 单词是语言中最小的语义单位 在词法分析阶段工作所依循的是语 言的词法规则。描述词法规则的有 效工具是正规式和有限自动机。
Pascal源程序片断
position := initial + rate * 60
二.编译程序概述
源程序 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成
目标程序
英译与编译的比较
1.识别出句子中的一个个单 1.词法分析 字
2.分析句子的语法结构
2.语法分析
3.初步翻译句子的含意
3.语义分析中间代码 生成
4.译文修饰
4.优化
5.写出最后译文
5.目标代码生成
1.词法分析
表格与表格管理
编译过程中源程序的各种信息被保留在 种种不同的表格里,编译各阶段的工作 都涉及到构造、查找或更新有关的表格, 因此需要有表格管理的工作
编译原理PPT课件第一章 编译引论
25
五 子程序参数传递
当调用一个子程序时,首先应将所需的数据传递给子程序, 传递方式主要有三种: 传值,传地址,传名 设有如下函数: function distence(x1,y1,x2,y2):real; begin distence:=sqrt((x2-x1)**2+(y2-y1)**2) end; x1,y1,x2,y2 称为形式参数 设主程序调用如下: d=distence(a1,b1,a2,b2); a1,b1,a2,b2 称为实际参数.
子程序空间编译时可确定活动记录运行时可确定可变空间活动记录?连接数据?形式参数?局部变量?数组内情向量表?临时变量等活动记录可变空间堆栈精选ppt32此课件下载可自行编辑修改供参考
1
第一章
一 什么是编译程序?
引论
第一节、编译程序概述
计算机经过几十年的发展, 在程序设计语言方面,已经从 低级语言发展到高级语言;然而,计算机内部的本质只能识别 0 , 1 代码序列(机器语言),而对高级语言甚至符号语言仍然一窍 不通。 因此用高级语言编写的程序,必须先翻译为机器语言, 才能被计算机理解执行。第一个完成这种翻译任务的编译程序 为FORTRAN编译程序,是上世纪五十年代设计的.
7> 子程序调用 函数调用一般出现在表达式中,形式如下: <函数名>(实际参数) 过程调用一般作为语句,形式如下: <过程名>(实际参数);
24
8> 输入输出语句 read(<变量名表>); write(<输出元表>); 9> 简单句和复合句 简单句是指不包含其它语句的基本语句, 复合句是指句中有句. 例如: V:=E,goto L ,read(a,b) 等都是简单句; if B then S else S, while B do S 等都是复合句.
编译原理与技术.ppt
动作
移进a 移进b 归约:Ab 移进b 移进c
2019/10/28
《编译原理与技术》讲义
12
移进-归约分析
e.g.17 用栈来实现串abbcde$的分析(2)
分析栈 $aAbc $aA $aAd $aAB $aABe $S
2019/10/28
输入串
动作
de$ de$ e$ e$ $
移进c 归约: AAbc 移进d 归约:Bd 移进e
《编译原理与技术》讲义
28
e.g.21 表达式文法G2的LR分析表(续)
状
action
态 id + * ( ) $
7 s5
s4
8
s6
s11
9
r1 s7
r1 r1
10
r3 r3
r3 r3
11
r5 r5
r5 r5
goto ETF
10
2019/10/28
《编译原理与技术》讲义
29
e.g.21 id*(id+id)$的移进-归约分析过程
输入串 )$ )$ )$ $ $ $ $ $
输出 r6:Fid r4:TF r1:EE+T s11:移进) r5:F(E) r3:TT*F r2:ET acc
2019/10/28
《编译原理与技术》讲义
32
识别活前缀的DFA
活前缀(viable prefix)
$
r: SaABe
分析成功!
《编译原理与技术》讲义
13
移进-归约分析
四种分析动作(action)
∙ 移进(shift)-将当前输入符号移入栈顶top
(why?)
∙ 归约(reduce)-当“句柄”出现在栈顶(从栈
《编译原理课件》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. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
- E的语法树(根结点指针)
(, , )-建立一个表达式语法树结点,它的运 算符为,左、右运算对象是和所指的语法树。 如果建成,则需要检查是否已存在相应内部 结点,其左右运算对象分别是和。若没有则 新建一个。
(‘’)-
(‘’)-
建立表达式语法树的叶结点。建也需检查是 否已有相应结点。
28.02.2021
. 语法树 -语法树与分析树
语法树可看作分析树的浓缩。也称抽象语法 树。而分析树可看成具体语法树。
28.02.2021
《编译原理与技术》讲义
12
语法树 . 分析树
S S1 S2
语法树
分析树
S
S1 S2
S1
S2
28.02.2021
《编译原理与技术》讲义
13
语法树 . 分析树
a b* + b *
语法树
9
语义规则的计算方法
分析树方法 - 为输入串建立分析树 - 由语义规则建立属性依赖图(没有属性循环
依赖的) - 对依赖图进行拓扑排序,得到属性计算次序 - 依次计算属性,得到“翻译”结果 基于规则的方法 - 构造编译器时,事先对产生式的语义规则进
行分析,得到属性计算次序 忽略规则的方法 - 28.02.2021 属性计算次序《编仅译原由理与分技术析》讲方义 法限定。如属性定 10
《编译原理与技术》讲义
17
.4 构造表达式*-4的属性结构树
+
a
ID a
28.02.2021
+
*
*
@
b
ID b
@
4
NUM 4
《编译原理与技术》讲义
-
18
.4 构造表达式*-4的语法树()
+
ID a
*
ID b
@NUM 4
28.02.2021
《编译原理与技术》讲义
19
属性定义
-如果产生式A X1X2… 的语义规则只计算 1)A的综合属性,或者 2)的继承属性,且该属性仅依赖于产生式右部的 左边符号(j<i)的(综合)属性或A的继承属性;
常量的“值”、变量的类型和存储位置等。
. 二义性表达式文法G,非终结符E有属性 (表达式的值)
E E ‘+’ E | E ‘*’ E | ‘(‘ E ‘)’ | 属性计算规则(语义规则)
与产生式相关联的反映文法符号属性之间关
系的“规则”
28.02.2021
《编译原理与技术》讲义
3
属性文法 语法制导定义(文法+属性+语义规则) 语义规则仅表明属性间“抽象”关系,不
涉及具体翻译实现细节,如计算次序等。
翻译方案(文法+属性+语义动作)
语义规则-即语义动作,可体现若干实现的 细节。
28.02.2021
《编译原理与技术》讲义
4
.1算术表达式的计算器
产生式 E E1 ‘+’ E2 E E1 ‘*’ E2 E ’(‘ E1 ‘)’ E
语法制导定义 E1 + E2 E1 * E2 E1
28.02.2021
《编译原理与技术》讲义
5
.1算术表达式的计算器
产生式
翻译方案
E E1 ‘+’ E2 { E1 + E2 }
E E1 ‘*’ E2 { E1 * E2 }
E ’(‘ E1 ‘)’ { E1 }
E {}
28.02.2021
《编译原理与技术》讲义
6
属性文法
属性的分类
若产生式A X1X2…,与之相关的属性计算 规则
21
.5 非属性定义的语法制导定义
产生式 A
A
语义规则 l()
m() f() r() q() f()
28.02.2021
《编译原理与技术》讲义
22
翻译方案中的动作
-语义动作可放在产生式右端任何位置;这也就显式 地给出了动作的执行时刻。(可认为是在深度优先 遍历中的执行时刻)
编译原理与技术
语法制导翻译
28.02.2021
《编译原理与技术》讲义
1
语法制导翻译
属性文法 属性定义 属性定义 语法制导定义与翻译方案 自底向上翻译 属性定义自底向上计算 自底向上计算继承属性 自顶向下翻译
28.02.2021
《编译原理与技术》讲义
2
属性文法
属性文法( )
上下文无关文法+属性+属性计算规则 属性-用来描述文法符号的语义特征,如
义可以在自下而上分析时,在归约前计算。如中的
. 3 属性计算次序: 3+4×5
1
. =3
2
E. = 3
8
E. = 23
+
4
E. = 4
7
E. = 20
6
×
E. = 5
3
. =4
5
. =5
28.02.2021
《编译原理与技术》讲义
11
属性定义
-语义规则仅包含综合属性计算(可以有固有 属性出现)。
-适合自底向上计算
产生式
语义规则
E E1 + E2 (‘+’1, E2)
E E1 - E2 (‘-’1, E2)
E E1 * E2 (‘*’1, E2)
E E1 / E2 (‘/’1, E2)
E ( E1 ) E - E1
E1 (‘@’1, -)
E (‘’)
E
(‘’)
28.02.2021
《编译原理与技术》讲义
16
.4 构造表达式的语法树()
分析树
赋值语句
算符 E
a
+
a
*
*
b@
b@
c
c
EE+ຫໍສະໝຸດ EE*E E*Eb @E b @E
c
c
28.02.2021
《编译原理与技术》讲义
14
语法树 .
(去除了公共子表达式的无环有向图) a b* + b *
a
+
*
*
b@
b@
a
+
* b@
c
c
c
语法树
28.02.2021
《编译原理与技术》讲义
15
.4 构造表达式的语法树()
b f ( c1, c2, … )
-如果属性b是产生式左部符号A的属性则称 其为A的综合属性;
-如果属性b是产生式右部符号的属性则称其 为的继承属性;
-c1, c2, … 一般是产生式右部其它符号的 (综合)属性或A的继承属性;
28.0-2.2021固有属性:终《结编译符原理与仅技术有》讲的义 属性。如。通常 7
-属性定义均为属性定义 -可按深度优先次序计算
- 一种自然的属性计算次序 - 在分析期间完成翻译。属性计算与结点建立有联 系;适合于自顶向下和自底向上分析方法。
28.02.2021
《编译原理与技术》讲义
20
深度优先次序
(n: )
m n, m;
(m); ;
n;
28.02.2021
《编译原理与技术》讲义
A的继承属性
属性依赖图
A的继承属性 A
X11 X22 … 综合属性的计算
X11 X22
…
继承属性的计算
28.02.2021
《编译原理与技术》讲义
8
. 2 属性依赖图:
3+4×5
E. = 23
E. = 3 . =3
+
E. = 20
E. = 4
×
E. = 5
. =4
. =5
28.02.2021
《编译原理与技术》讲义
(, , )-建立一个表达式语法树结点,它的运 算符为,左、右运算对象是和所指的语法树。 如果建成,则需要检查是否已存在相应内部 结点,其左右运算对象分别是和。若没有则 新建一个。
(‘’)-
(‘’)-
建立表达式语法树的叶结点。建也需检查是 否已有相应结点。
28.02.2021
. 语法树 -语法树与分析树
语法树可看作分析树的浓缩。也称抽象语法 树。而分析树可看成具体语法树。
28.02.2021
《编译原理与技术》讲义
12
语法树 . 分析树
S S1 S2
语法树
分析树
S
S1 S2
S1
S2
28.02.2021
《编译原理与技术》讲义
13
语法树 . 分析树
a b* + b *
语法树
9
语义规则的计算方法
分析树方法 - 为输入串建立分析树 - 由语义规则建立属性依赖图(没有属性循环
依赖的) - 对依赖图进行拓扑排序,得到属性计算次序 - 依次计算属性,得到“翻译”结果 基于规则的方法 - 构造编译器时,事先对产生式的语义规则进
行分析,得到属性计算次序 忽略规则的方法 - 28.02.2021 属性计算次序《编仅译原由理与分技术析》讲方义 法限定。如属性定 10
《编译原理与技术》讲义
17
.4 构造表达式*-4的属性结构树
+
a
ID a
28.02.2021
+
*
*
@
b
ID b
@
4
NUM 4
《编译原理与技术》讲义
-
18
.4 构造表达式*-4的语法树()
+
ID a
*
ID b
@NUM 4
28.02.2021
《编译原理与技术》讲义
19
属性定义
-如果产生式A X1X2… 的语义规则只计算 1)A的综合属性,或者 2)的继承属性,且该属性仅依赖于产生式右部的 左边符号(j<i)的(综合)属性或A的继承属性;
常量的“值”、变量的类型和存储位置等。
. 二义性表达式文法G,非终结符E有属性 (表达式的值)
E E ‘+’ E | E ‘*’ E | ‘(‘ E ‘)’ | 属性计算规则(语义规则)
与产生式相关联的反映文法符号属性之间关
系的“规则”
28.02.2021
《编译原理与技术》讲义
3
属性文法 语法制导定义(文法+属性+语义规则) 语义规则仅表明属性间“抽象”关系,不
涉及具体翻译实现细节,如计算次序等。
翻译方案(文法+属性+语义动作)
语义规则-即语义动作,可体现若干实现的 细节。
28.02.2021
《编译原理与技术》讲义
4
.1算术表达式的计算器
产生式 E E1 ‘+’ E2 E E1 ‘*’ E2 E ’(‘ E1 ‘)’ E
语法制导定义 E1 + E2 E1 * E2 E1
28.02.2021
《编译原理与技术》讲义
5
.1算术表达式的计算器
产生式
翻译方案
E E1 ‘+’ E2 { E1 + E2 }
E E1 ‘*’ E2 { E1 * E2 }
E ’(‘ E1 ‘)’ { E1 }
E {}
28.02.2021
《编译原理与技术》讲义
6
属性文法
属性的分类
若产生式A X1X2…,与之相关的属性计算 规则
21
.5 非属性定义的语法制导定义
产生式 A
A
语义规则 l()
m() f() r() q() f()
28.02.2021
《编译原理与技术》讲义
22
翻译方案中的动作
-语义动作可放在产生式右端任何位置;这也就显式 地给出了动作的执行时刻。(可认为是在深度优先 遍历中的执行时刻)
编译原理与技术
语法制导翻译
28.02.2021
《编译原理与技术》讲义
1
语法制导翻译
属性文法 属性定义 属性定义 语法制导定义与翻译方案 自底向上翻译 属性定义自底向上计算 自底向上计算继承属性 自顶向下翻译
28.02.2021
《编译原理与技术》讲义
2
属性文法
属性文法( )
上下文无关文法+属性+属性计算规则 属性-用来描述文法符号的语义特征,如
义可以在自下而上分析时,在归约前计算。如中的
. 3 属性计算次序: 3+4×5
1
. =3
2
E. = 3
8
E. = 23
+
4
E. = 4
7
E. = 20
6
×
E. = 5
3
. =4
5
. =5
28.02.2021
《编译原理与技术》讲义
11
属性定义
-语义规则仅包含综合属性计算(可以有固有 属性出现)。
-适合自底向上计算
产生式
语义规则
E E1 + E2 (‘+’1, E2)
E E1 - E2 (‘-’1, E2)
E E1 * E2 (‘*’1, E2)
E E1 / E2 (‘/’1, E2)
E ( E1 ) E - E1
E1 (‘@’1, -)
E (‘’)
E
(‘’)
28.02.2021
《编译原理与技术》讲义
16
.4 构造表达式的语法树()
分析树
赋值语句
算符 E
a
+
a
*
*
b@
b@
c
c
EE+ຫໍສະໝຸດ EE*E E*Eb @E b @E
c
c
28.02.2021
《编译原理与技术》讲义
14
语法树 .
(去除了公共子表达式的无环有向图) a b* + b *
a
+
*
*
b@
b@
a
+
* b@
c
c
c
语法树
28.02.2021
《编译原理与技术》讲义
15
.4 构造表达式的语法树()
b f ( c1, c2, … )
-如果属性b是产生式左部符号A的属性则称 其为A的综合属性;
-如果属性b是产生式右部符号的属性则称其 为的继承属性;
-c1, c2, … 一般是产生式右部其它符号的 (综合)属性或A的继承属性;
28.0-2.2021固有属性:终《结编译符原理与仅技术有》讲的义 属性。如。通常 7
-属性定义均为属性定义 -可按深度优先次序计算
- 一种自然的属性计算次序 - 在分析期间完成翻译。属性计算与结点建立有联 系;适合于自顶向下和自底向上分析方法。
28.02.2021
《编译原理与技术》讲义
20
深度优先次序
(n: )
m n, m;
(m); ;
n;
28.02.2021
《编译原理与技术》讲义
A的继承属性
属性依赖图
A的继承属性 A
X11 X22 … 综合属性的计算
X11 X22
…
继承属性的计算
28.02.2021
《编译原理与技术》讲义
8
. 2 属性依赖图:
3+4×5
E. = 23
E. = 3 . =3
+
E. = 20
E. = 4
×
E. = 5
. =4
. =5
28.02.2021
《编译原理与技术》讲义