编译原理课件语法制导翻译__SDD_例__生成抽象语法树

合集下载

编译原理课件语法制导翻译__SDD_定义__例__表达式的解释执行

编译原理课件语法制导翻译__SDD_定义__例__表达式的解释执行
表达式的解释执行
产 生 式 LEn E E1 + T ET T T1 * F TF F (E) F digit
digit+digit*digit n
L E E T F digit +
18+5*2n
n T
T * F F digit digit
语法制导定义 SDD Syntax-Directed Definition
F.val := digit.lexval
E .val = 8
T.val = 8 F.val = 8
+
T .val = 10 T .val = 5 *
F.val = 5 F .val = 2 digit .lexval = 2
digit .lexval = 8
digit .lexval = 5
SDD与属性文法
• 副作用 • 引用透明
LEn
print (E.val)
E E1 + T E.val := E1 .val + T.val
ET
T T1 * F TF
E.val := T.val
T.val := T1.val * F.val T.val := F.val
F (E)
F digit
F.val := E.val
TF
F(E) Fdigit
翻译输入 3*5+4n 所作的动作
L E n { print (statck[top-1].val ); top = top -1; } EE1 + T { statck[top-2].val = statck[top-2].val + statck[top].val; top = top -2; } TT1 * F { statck[top-2].val = statck[top-2].val * statck[top].val; top = top -2; } { statck[top-2].val = F(E) statck[top-1].val top = top -2; }

编译原理 第5章语法制导的翻译

编译原理 第5章语法制导的翻译

属性和文法符号相关联 规则和产生式相关联

根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值


E→E1+T E.code=E1.code || T.code || ‘+’ code表示了我们关心的表达式的逆波兰表示,规则说明 加法表达式的逆波兰表示由两个分量的逆波兰表示并置, 然后加上‘+’得到。
digitlexval=3
18
适用于自顶向下分析的SDD


前面的表达式文法存在直接左递归,因 此无法直接用自顶向下方法处理。 消除左递归之后,无法直接使用属性val 进行处理:


比如规则:T→FT’ T’→*FT’ T对应的项中,第一个因子对应于F, 而运算符在T’中。
19
相同表达式的不同文法的比较
38
例5.15 分析栈实现的例子

假设语法分析栈存放在一个被称为stack 的记录数组中,下标top指向栈顶;


stack[top]指向这个栈的栈顶;stack[top-1] 指向栈顶下一个位置; 如果不同的文法符号有不同的属性集合,我 们可以使用union来保存这些属性值。(归 约时,我们知道栈顶向下的各个符号分别是 什么)
语义翻译的流程
输 入 符 号 串 分 析 树 依 赖 图




的 计
实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析 的进展,识别出一个语法结构,就对它 的语义进行分析和翻译。

9
5.1 语法制导定义

4.什么是语法制导定义(SDD) 上下文无关文法和属性/规则的结合;

《编译原理》课件

《编译原理》课件
代码生成
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类

编译原理chapter5 语法制导翻译

编译原理chapter5 语法制导翻译

for 结点n所用产生式对应的每一条
语义规则 b:=f(c1,c2,…,ck ) do
精品文档
14
5.1.5 计算顺序
◆拓扑排序
一个有向非循环图的拓扑排序是图中
结点的任何顺序m1,m2,…,mk,使得
边必须是从序列中前面的结点指向后面的
结点,也就是说,如果mi→mj是mi到mj的
一条边,那么在 序列中mi必须出现在mj的
规则来计算综合属性值,即在 用哪个产生
式进行归约后,就执行那个产生式的s-属性
定义计算属性的值,从叶结点到根结点进行
计算。
5.1.3 继承属性
继承属性值是由此结点的父结点和/或兄
弟结点的某些属性值来决定的。
例5 . 3 变量说明的类性定义
int a,b,c
精品文档
11
表5.2 带有继承属性L.in的语法制导定义
精品文档
3
要求:随着语法分析,分析树逐步被构造出 来,进展到每一步,定义的文法符号的属性 值是可以计算出来的。一个重要的属性定义 类称作“L—属性”定义,满足上述要求。
精品文档
4


















图5.1 语法制导翻译的概观
精品文档
5
5.1 语法制导定义(Syntax-directed definitions) ◆语法制导定义是对上下文无关文法的推广 综◆合属属性性 继承属性 ◆依赖图 语义规则建立了属性之间的依赖关系,这些关 系可以用图来表示,这样的图称为依赖图。
语法树是常用的一种中间表示形式。

编译原理课件语法制导翻译__翻译方案_SDD

编译原理课件语法制导翻译__翻译方案_SDD
语法制导翻译
描述一棵语法树中结点的属性之间的 相互依赖关系 词法分析 语法分析 依赖图 输入串 语法树 语义规则计算次序 ( 拓扑排序) 树遍历
一遍扫描:在语法分析的同时完成语义规则的 计算, 无需构造实际的语法树
1. 依赖图的拓扑排序
• 依赖图 • 拓扑排序
2. 树遍历的属性计算方法
练习: 以下SDD是L-属性的吗?
产生式 语义规则
ALM
AQR
L.i := l(A.i) M.i := m(L.s) A.s := f(M.s) R.i := r(A.i) Q.i := q(R.s) A.s := f(Q.s)
• 表达式2 ☆
dependencygraph edges can go from left to right
(2) 产生式 Xj 的左边符号 X1,X2,…,Xj-l 的属性
(3) Xj 自己的属性
• S-属性文法一定是L-属性文法 表达式 ☆
Example 非L-属性文法
产生式 A BC 语义规则 A.s = B.b B.i = f ( C.c , A.s )
Fig. Syntax-directed definition of a simple desk calculator
L-属性文法 D TL 和自上而下 T int 语法分析 T real
L L1, id D T .type = real real
综T.type T. type := integer T. type := real L1.in := L.in; addtype (id.entry,L.in ) addtype (id.entry,L.in )
(a)初始状态 (b)VisitNode(S)第一次调用后 (c)VisitNode(S)第二次调用后 (d)VisitNode(S)第三次调用后 的最终状态

编译原理课件语法制导翻译翻译方案SDD

编译原理课件语法制导翻译翻译方案SDD

SDD的实际应用
示例 语义值的计算 类型检查的实现 解析默认参数
描述 计算表达式2+3操作得到的实际结果 检查赋值操作符两侧数值的类型是否一致 将默认参数设置为参数列表中未给出的实参
总结
协作
了解SDD,能更好地协作进行编 译程序开发。
应用
总结
SDD在通用编程语言中广泛应用, 掌握SDD将增加自己在编程方面 的实用性。
概念
定义高级语言和目标语言的一一 对应关系,保证编译器输出的目 标程序与原程序功能相同。
使用
将源程序的语法树根据SDD转化 为目标程序的语法树,完成上下 文有关的属性计算并生成目标代 码。
优点
灵活的特性、准确的语义描述和 高效的处理过程,使得编译器能 够更好地分析和翻译源程序。
语法制导定义
1
语法定义
使用一组语法制导规则将源程序的语法
语义定义
2
描述为翻译方案的形式。
通过为每个语法构造一个属性集合,并
定义每个属性的计算方法来定义程序语
3
翻译过程定义
义。
使用一组由语法定义和语义定义构成的
规则,将源程序转化为目标程序。
SDD表达式
翻译方案格式
语法制导翻译表达式的常规形式是: ⟨属性⟩→⟨表达式⟩
表达式的计算
通过本课程,你将掌握语法制导 翻译与SDD的概念、使用方法和 广泛应用领域,希望你能更好地 进行编译器程序的开发工作。
编译原理课件语法制导翻 译翻译方案SDD
本次课程将带领你深入了解语法制导翻译与S识。
语法制导翻译简介
1 定义
一种将语法和语义相结合的编译技术。
2 作用
通过定义翻译方案SDD,将高级语言的语法转化为目标语言的语法,并赋予其语义。

编译原理课件第四章

编译原理课件第四章

中间代码生成的过程和方法
过程
中间代码生成是将源代码转换为中间表示形式的过 程,可以使用三地址码等中间代码表示。
方法
中间代码生成可以应用常见的优化技术,如常量折 叠、公共子表达式消除等。
编译优化的基本原理和技术
基本原理
编译优化的基本原理包括消除冗余、提高并行度和改进数据局部性等。
技术
编译优化的常用技术有指令调度、循环优化和内函数等。
编译原理课件第四章
在这一章中,我们将介绍编译原理课件中的第四章内容。我们将探讨编译器 前端和后端的概念,以及它们各自的任务和流程。
编译器前端和后端
1
编译器后端
2
编译器后端负责中间代码生成、代码优 化和目标代码生成等任务。
编译器前端
编译器前端负责词法分析、语法分析和 语义分析等任务。
语法分析器的作用和原理
1 作用
语法分析器用于分析源代码的语法结构,并生成抽象语法树。
2 原理
语法分析器使用文法规则和语法分析算法进行解析,如LL(1)分析和LR分析。
语法制导翻译的概念和实现
概念
语法制导翻译是在语法分析的同时进行翻译,通过 语法规则和语义动作实现。
实现
语法制导翻译可以使用语义动作和符号表等技术来 实现语义分析和中间代码生成。

编译原理课件语法制导翻译__SDD_依赖图_拓扑排序__例__变量声明语句_继承属性

编译原理课件语法制导翻译__SDD_依赖图_拓扑排序__例__变量声明语句_继承属性

T type real in
L addtype ,
id3 entry
L addtype id1 entry
id2 entry
L L1, id L1.in := L.in; addtype (id.entry,L.in ) L id addtype (id.entry, L.in )
文法 ☆
real id1, id2, id3
id1.entry 1
参考
依赖图 Dependency Graph
• 语义规则的形式 b := f(c1,c2,…,ck)
可以为每一个包含过程调用的语义规则引入一 个虚综合属性 b, L E n print (E.val)
• 依赖图中为每一个属性设置一个结点, 如果属性b依赖于属性c, c1 则从属性c的结点 有一条有向边连到属性b的结点。…
如何确定属性的计算顺序? T.type 4 7 L.in 9 L.in 5 L.in addtype 8
依赖图
拓扑排序
addtype 6 id3.entry 3
addtype 10
id2.entry 2 a4 := real; a5 := a4; addtype (id3.entry, a5 ) a7 := a5; addtype (id2.entry, a7 ) a9 := a7; addtype (id1.entry, a9 )
T real
L L1, id L id
计算继承属性
D TL T int T real L L1, id
L id
D
T .type = real real
综合 属性
L.in := T.type T. type := integer T. type := real L1.in := L.in; addtype (id.entry,L.in ) addtype (id.entry,L.in )

编译原理--语法制导的翻译 ppt课件

编译原理--语法制导的翻译 ppt课件

(2)设code 为综合属性,代表各非终结符 的代码属性
type为综合属性,代表各非终结符的类型属 性
inttoreal把整型值转换为相等的实型值 vtochar将数值转换为字符串
5.3.3 给出一个SDD对x*(3*x+x*x)这样的表达式求 微分。表达式中涉及运算符+和*,变量x和常 量。假设不进行任何简化,也就是说,比如 3*x将被翻译为3*1+0*x。
ST z , R4
8.2.6 确定下列指令序列的代价。
1)
LD R0 , y
2
LD R1 , z
2
ADD R0 , R0 , R1 1
ST x , R0
2
总代价:7
3)
LD R0 , c
2
LD R1 , i
2
MUL R1 , R2 , 8 2
ST a(R1) , R0 2
总代价:8
8.3.3 假设使用栈式分配,且假设a和b都是元素大小为4字节 的数组,为下面的三地址语句生成代码。
的位数次幂值(2 length of L)
S L1.L2 S.val = L1.val +L2.val / L2.b; S L S.val = L.val; L L1 B L.val = L1.val *2 + B.val;
L.b = L1.b*2; L B L.val = B.val; L.b = 2; B 0 B.val = 0; B 1 B.val = 1;
2)三个语句序列 x = a[i] y = b[i] z = x*y
LD R1 , i MUL R1 , R1 , 4 ADD R1 , R1 , SP LD R2 , a(R1) ST x(SP) , R2 LD R3 , i MUL R3 , R3 , 4 ADD R3 , R3 , SP LD R4 , b(R3) ST y(SP) , R4 LD R5 , x(SP) LD R6 , y(SP) MUL R5 , R5 , R6 ST z(SP) ,R5

《编译原理》课件

《编译原理》课件
了解中间代码生成的概念和它在编译过程中的角色。 学习四元式和三地址码的表示和生成方式,以及中间代码优化的技巧。
六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成

编译原理课件语法制导翻译__SDD_例__表达式__综合属性_继承属性

编译原理课件语法制导翻译__SDD_例__表达式__综合属性_继承属性

T .val
依赖图 .inh T’.syn
F .val
digit .lexval *
F .val digit .lexval
inh T1’.syn ε
Production Semantic Rules T → FT’ T’.inh = F.val T.val = T’.syn T’→ *FT1’ T1’.inh = T’.inh * F.val T’.syn = T1’.syn
Production T → FT’ T’→ *FT1’ T’→ ε F → digit Semantic Rules T’.inh = F.val T.val = T’.syn T1’.inh = T’.inh * F.val T’.syn = T1’.syn T’.syn = T’.inh F.val = digit.lexval
T F T’
补充练习: 构造 3*5*7 的带 注释的语法树
digit
*
F
digit *
T’
F T’
digit
Production T → FT’ T’→ *FT1’ T’→ ε F → digit Semantic Rules T’.inh = F.val T.val = T’.syn T1’.inh = T’.inh * F.val T’.syn = T1’.syn T’.syn = T’.inh F.val = digit.lexval
6
7
Production Semantic Rules T → FT’ T’.inh = F.val T.val = T’.syn T’→ *FT1’ T1’.inh = T’.inh * F.val T’.syn = T1’.syn

编译原理01-本讲教学课件(PDF文档)_3

编译原理01-本讲教学课件(PDF文档)_3

语法制导翻译方案SDT
➢语法制导翻译方案(SDT )是在产生式右部中嵌入了 程序片段(称为语义动作)的CFG
➢SDT可以看作是SDD的具体实施方案 ➢本节主要关注如何使用SDT来实现两类重要的SDD,
因为在这两种情况下,SDT可在语法分析过程中实现
➢ 基本文法可以使用LR分析技术,且SDD是S属性的
{stack[top-2].val = stack[top-2].val × stack[top].val ; top=top-2; }
{stack[top-2].val = stack[top-1].val; top=top-2; }
输入: 3*5+4
状态 符号属性
0 $_ 1 E 135 6 +_ 5 d4
E.val = E1.val + T.val E.val = T.val T.val = T1.val × F.val
T.val = F.val
(6) F ( E ) F.val = E.val
(7) F digit F.val = digit.lexval
当归约发生时执行相应的语义动作
扩 展 的 LR 语 法 分 析 栈
SLR自动机
产生式
例(1)E′ → E
(2)E → E1 + T
(3) E → T (4) T → T1 * F
(5) T → F (6)F → ( E )
(7)F → digit
语义动作 { print (stack[top].val );} {stack[top-2].val = stack[top-2].val + stack[top].val ; top=top-2; }
例(1)E′ → E

编译原理 语法制导翻译

编译原理 语法制导翻译
搜索方法:hash技术…
TinyC中的语法树
typedef enum {StmtK,ExpK} NodeKind; typedef enum {IfK,RepeatK,AssignK,ReadK,WriteK} StmtKind; typedef enum {OpK,ConstK,IdK} ExpKind; typedef enum {Void,Integer,Boolean} ExpType; #define MAXCHILDREN 3 typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; struct treeNode * sibling; int lineno; NodeKind nodekind; union { StmtKind stmt; ExpKind exp;} kind; union { TokenType op; int val; char * name; } attr; ExpType type; /* for type checking of exps */ } TreeNode;
作为中间表示形式——分离分析与翻译
在进行语法分析的同时进行翻译存在缺
陷:
适合分析的文法可能未反映自然的语言结构 分析顺序可能与翻译顺序不一致
利用语法制导翻译方法来构造语法树
5.2.1 语法树
(抽象)语法树,压缩形式
关键字和运算符均在内部节点
链式结构会被压缩
语法树压缩例
digit.lexval:终结符只有综合属性,由词法分 析器提供 开始符号通常没有继承属性
5.1.2 综合属性
只有综合属性:S-属性定义
语法树自底向上计算属性

《语法制导翻译 》课件

《语法制导翻译 》课件
《语法制导翻译 》PPT课件
通过本课件了解语法制导翻译的概念、基本方法和实践技巧,并探讨翻译中 的难点及解决方案,让您成为语法制导翻译的专家。
什么是语法制导翻译
介绍语法制略
探讨在语法制导翻译中的思考方式和有效的翻译策略。
认识语法树
解释语法树的概念和作用,并介绍如何构建和分析语法树。
基于语法树的翻译方法
讨论使用语法树进行翻译的具体方法和步骤。
翻译实例分析
通过实际案例分析,展示语法制导翻译在不同场景下的应用和效果。
英汉语法差异
探讨英语和汉语之间的语法差异,解决在翻译中可能遇到的问题。
词形变化对翻译的影响
分析词形变化在翻译过程中的重要性和正确处理方法。
主被动语态的处理
介绍如何准确翻译主被动语态,并避免常见的翻译错误。

编译原理课件语法制导翻译__翻译方案_SDT

编译原理课件语法制导翻译__翻译方案_SDT

YTU COMPILER
S
(
,
L
)
S ( L S a print (S. depth) , L )
S. depth =L. depth L. depth = S. depth + 1 L1. depth= L. depth S. depth= L. depth
print (S. depth)
S. depth= L. depth a
print(‘+’) R
5
print(2)

4 •把语义动作看作是终结符号 •按从左到右、深度优先次序遍历分析树, 9 5 - 2 + • 翻译模式给出了使用语义规则进行计算的次序
YTU COMPILER
后缀翻译模式 Postfix SDT’s
• SDT’s with all actions at the right ends of the production bodies are called Postfix SDT’s.
YTU COMPILER
练习: 构造翻译模式
YTU COMPILER
练习 1 : 为文法写一个翻译方案, 它输出每个a的嵌套深度 G: S ( L ) | a LL,S|S 例如:对于( a , ( a , a) ) ,输出的结果是 1 2 2
S {S. depth = 0 } S S {L. depth = S. depth + 1 } ( L ) S a { print (S. depth) } L {L1. depth = L. depth } L1 , {S. depth = L. depth } S L {S. depth = L. depth } S
YTU COMPILER
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
构造抽象语法树
Abstract Syntax Trees
YTU COMPILER
Abstract Syntax Trees
• 在抽象语法树中, 操作符 和 关键字 都不作为叶 结点出现,而是把它们作为内部结点
S if B then S1 else S2 if-then-else B S1 S2 if B S then S1 else S2
P5 P3 — P1
+ •


P4

id

id•ຫໍສະໝຸດ P2 num4to entry for c
to entry for a
建立抽象语法树的SDD
产生式 EE1 + T EE1 - T ET T ( E ) Tid Tnum 语义规则 E.node := new Node(‘+’,E1.node, T.node) E.node := new Node(‘-’, E1.node, T.node) E.node := T.node T.node := E.node T.node := new Leaf(id, id.entry) T.node := new Leaf (num, num.lexval)
建立表达式的抽象语法树
• 抽象语法树中的每一个结点可以由包含几个域 的记录来实现的。
运算符号 (结点标号)
运算分量的指针
+
id
num 5
标识符在符号表中的入口
YTU COMPILER
用对象来表示表达式的抽象语法树中的结点
(1) Node(op, left, right) 运算符号结点, 标号是op, 两个域left和right分别指向左子树和右子树. (2) Leaf(id, entry) 标识符结点, 标号为id, 一个域entry指向标识符在符号表中的入口。 (3) Leaf(num, val) 数结点, 标号为num, 一个域val用于存放数的值。
YTU COMPILER
建立表达式a-4+c 的抽象语法树 (1 )P1 := new Leaf(id, entrya); (2) P2 := new Leaf(num, 4); (3) P3 := new Node(‘-’, P1,P2); (4) P4 := new Leaf(id,entryc); (5) P5 := new Node(‘+’, P3,P4);

T . node num
T . node id
+






id num
4

id
to entry for C
to entry for a
YTU COMPILER
Figure 5.10: Constructing syntax trees for simple expressions
YTU COMPILER
a – 4 + c 的抽象语法树的构造 表 ☆ 虚线: 带注释的语法分析树 实线: 抽象语法树 (真正存在)
E .node
E .node E .node T .node id -
Syntax Tree 抽象语法树
Parse Tree 语法分析树
YTU COMPILER
a := b* -c + b * -c
:= a * b @ c b + * @ c 赋值语句
E
a
:= E E * E
E + E E * E
b
@
E
c
b
@
E
c
Syntax Tree
Parse Tree
YTU COMPILER
相关文档
最新文档