语义分析和语法制导翻译-编译原理-06-(二)
06第6章 语法制导翻译技术PPT课件

② E→T
③ T→T*F ⑦ F→b
③ T→T*F@*
④ T→F
⑧ F→c
④ T→F
⑤ F→(E) ⑥ F→a@a ⑦ F→b@b ⑧ F→c@c
➢把中缀表达式文法叫做输入文法;
➢在输入文法上添加动作后形成的文法叫做翻译文法
➢使用中缀表达式文法推导得到终结符号串叫做输入序列;
➢使用翻译文法推导得到的符号串称为活动序列。
E→TE’ E’ →+T@+E’|ε T→FT’
-用T1表示T’
T’ →*F @* T’|ε
T1 ()
F→(E)|a@a| b@b| c@c
{if(ch==‘*’)
{ ch = getnextsymbol();
F ();OUT(“*”); T1 ();
}
else if(ch∈FOLLOW(E’))return;
2020/7/29
#
19
6.5 属性翻译文法
▪ 属性:指与文法符号的类型和值等有关的一些语义信 息,在编译中用属性描述被处理对象的语义特征。
▪ 属性代表与文法符号相关的语义信息。
▪ 属性的设置和语法结构的语义以及翻译程序的需要有
关。例如:
注:教材中用箭头↑和 ↓代替.
➢ 文法符号X的类型属性:X.type
第6章 语法制导翻译技术
2020/7/29
1
标题添加
点击此处输入相 关文本内容
标题添加
点击此处输入相 关文本内容
总体概述
点击此处输入 相关文本内容
点击此处输入 相关文本内容
2
内容提要
➢ 引言 ➢ 翻译文法 ➢ 语法制导翻译 ➢ 自顶向下语法制导翻译 ➢ 属性翻译文法 ➢ 属性文法的自顶向下翻译 ➢ 自底向上语法制导翻译
编译原理分知识点习题 语法制导和翻译

规则语义动作
(1) E::=I {E.TC:=null;E.FC:=NXQ;
GEN (Jez , ENTRY(i),__,0) }
(2) E::= i1rop i2{ E.TC:=null;E.FC:=NXQ;
GEN (Jnrop,ENTRY(i1), ENTRY(i2),0)}
S→R2E{BACKPATCH (E.FC, R2.QUAD); S.CHAIN:=E.TC}
8.为便于填写被说明的名字的性质,试修改下面关于变量类型说明的文法,并给出相应的语义动作。
待修改的类型说明文法为:
D→namelist integer|namelist
namelist→i,namelist|i
10.写出翻译过程调用语句的语义子程序。要求生成的四元式序列在转子指令之前的参数四元式par按反序出现(即和实在参数的顺序相反),在此情况下翻译过程调用语句时是否需要语义变量(队列)QUEUE呢?
解答:为使过程调用语句的语义子程序产生的参数四元式par按反序出现,过程调用语句的文法为:
S→call i (arglist)
2.(湖北省高等教育自学考试)什么是语法制导翻译?为什么把这种方法叫语法制导翻译?
解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。
由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或规约的同时又使用这些语义规则来知道翻译与最终产生目标代码,所以称为语法制导翻译。
1.一般情况下,为什么语义分析部分仅产生中间代码?
解答:一般情况下,语义分析部分仅产生中间代码,其原因是:
可使难点分解,分别解决。
可对语义分析产生的中间代码进行优化,以产生高效率的目标代码。
《编译原理》考试试题及答案

《编译原理》考试试题及答案(附录)一、判断题:1.一个上下文无关文法的开始符,可以是终结符或非终结符。
( X )2.一个句型的直接短语是唯一的。
( X )3.已经证明文法的二义性是可判定的。
( X )4.每个基本块可用一个DAG表示。
(√)5.每个过程的活动记录的体积在编译时可静态确定。
(√)6.2型文法一定是3型文法。
( x )7.一个句型一定句子。
( X )8.算符优先分析法每次都是对句柄进行归约。
(应是最左素短语) ( X )9.采用三元式实现三地址代码时,不利于对中间代码进行优化。
(√)10.编译过程中,语法分析器的任务是分析单词是怎样构成的。
( x )11.一个优先表一定存在相应的优先函数。
( x )12.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
( )13.递归下降分析法是一种自下而上分析法。
( )14.并不是每个文法都能改写成LL(1)文法。
( )15.每个基本块只有一个入口和一个出口。
( )16.一个LL(1)文法一定是无二义的。
( )17.逆波兰法表示的表达试亦称前缀式。
( )18.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
( )19.正规文法产生的语言都可以用上下文无关文法来描述。
( )20.一个优先表一定存在相应的优先函数。
( )21.3型文法一定是2型文法。
( )22.如果一个文法存在某个句子对应两棵不同的语法树,则文法是二义性的。
( )二、填空题:1.( 最右推导 )称为规范推导。
2.编译过程可分为(词法分析),(语法分析),(语义分析和中间代码生成),(代码优化)和(目标代码生成)五个阶段。
3.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是()。
4.从功能上说,程序语言的语句大体可分为()语句和()语句两大类。
5.语法分析器的输入是(),其输出是()。
6.扫描器的任务是从()中识别出一个个()。
编译原理第八章—语法制导翻译

语法制导翻译
属性文法 语法制导翻译概论
计算语义规则 S-属性文法和自下而上翻译 L-属性文法和自上而下翻译 L-属性文法和自下而上翻译
属性文法
属性文法的形式化定义 属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。 V:有穷的属性集,每个属性与文法的一个终结 符或非终结符相连。 F:关于属性的断言或谓词集。每个断言与一个 产生式相联。
综合属性
将属性附着在分析树对应文法符号上,形成注释分 析树。(属性作为分析树的注释) 8+5*2的分析树 L E
E
T F
+
T
T F digit F
digit
digit
综合属性
将属性附着在分析树对应文法符号上,形成注释分 析树。(属性作为分析树的注释) 8+5*2的注释分析树 L E.val E.val + T.val F.val T.val F.val digit.lexval
属性文法
属性的抽象表示 例如:E.val(值) E.type(类型) E.code(代码序列) E.place(存储空间)
属性文法
E
T
文法G:
+
T
ET1+T2|T1 or T2 Tnum|true|false
3
4
ET1+T2 {T1.t=int AND T2.t=int} ET1orT2{ T1.t=bool AND T2.t=bool} E{T1.t=T2.t} Tnum {T.t=int} T{T1.t=int} + Ttrue {T.t=bool} T{T2.t=int} Tfalse {T.t=bool}
编译原理之语法分析与语义分析

编译原理之语法分析与语义分析
语法分析(英语:syntactic analysis,也叫 parsing)是根据某种给定的对由单词序列(如英语单词序列)构成的输⼊⽂本进⾏分析并确定其语法结构的⼀种过程。
语法分析器使⽤由词法分析器⽣成的各个词法单元的第⼀个分量来创建树形的中间表⽰。
语义分析是审查源程序有⽆语义错误,为代码⽣成阶段收集类型信息。
语义分析器(semantic analyzer)使⽤语法树和符号表中的信息来检查源程序是否和语⾔定义的语义⼀致。
它同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码⽣成过程中使⽤。
6-1-语义分析和语法制导翻译

2022/2/4
7
属性文法的定义
定义6.3 属性文法AG是一个四元组:AG=(G,A,R,B), 其中, G是已简化的CFG;
A=∪X∈VA(X)是属性的有限集合;
R= ∪p∈PR(p)是属性定义规则的有限集;
B=∪p∈PB(p)是条件的有限集合,B(p)用于描述使R(p)有效 的条件;
1.每个文法符号和语义动作符X都有一个相关的有限属性集合A(X),且每 个属性都有一个允许值的集合(属性的值域,可以是无限集)。
2.非终结符和动作符的属性可分为继承属性与综合属性两类。
3.继承属性的定义规则为:
①开始符号的继承属性具有指定的初始值;
②对于给定的产生式p:Y→X1X2…Xn∈P,Xi的继承属性值由p中其它符号 的属性值进行计算:Xi.a=f(Y.b, Xk1.ak1,…,Xkm.akm) i{k1,…,km}
2022/2/4
2
中间代码
中间代码生成:
–指把单词符号串形式的源程序转换为另一种等价的便于 代码优化处理和目标代码生成表示。
两个主要问题:
–如何描述语言的语义(语法制导翻译方法); – 中间代码如何表示(逆波兰表示、三元式、四元式等)。
2022/2/4
3
语法制导翻译方法概述
语法制导翻译方法
– 在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的 语义子程序进行翻译(产生中间代码)的方法。
– 实质就是根据文法中每个产生式的语义,为其配备若干个语义子程序, 对所要完成的功能进行描述。
产生式语义:
– 由组成该产生式所有文法符号的语义决定。
语义:
– 文法符号X的语义信息,称之为语义属性或简称为属性。 – 可用形如X.ATTR的记号来表示文法符号X的相关语义属性。
编译原理语法制导翻译与语法制导定义的应用

编译原理语法制导翻译与语法制导定义的应用编译原理是计算机科学中的一门重要课程,它研究了如何将高级程序语言翻译成为机器语言,以便计算机能够执行。
而语法制导翻译与语法制导定义是编译原理中的一个关键概念,它们在建立语法规则和语义规则方面发挥着重要的作用。
一、语法制导翻译的概述语法制导翻译是指在语法分析的基础上,根据具体的语法规则和语义规则,将源语言翻译成目标语言的过程。
它结合了语法分析和语义分析的特点,能够在代码生成和优化等方面发挥重要作用。
在语法制导翻译中,语法规则描述了源语言的各种语法结构,而语义规则定义了这些语法结构的具体含义和运行过程。
通过分析源语言的语法结构,并依照语法规则和语义规则进行翻译,可以将源程序转换为目标程序。
二、语法制导定义的作用语法制导定义是对语法和语义规则的一种形式化描述,它能够准确地定义语法结构和语义含义之间的关系。
语法制导定义不仅可以用于语法分析的过程中,在代码生成和优化等环节中也有广泛的应用。
在语法分析的过程中,语法制导定义可以帮助我们构建语法树,并为每个语法节点添加语义动作。
这些语义动作可以在语法分析的同时进行符号表的建立、类型检查等操作,从而提高编译器的效率和性能。
在代码生成的过程中,语法制导定义可以为每个语法结构规定相应的代码生成规则。
通过语法制导定义,编译器可以根据源程序的语法结构,在目标程序中生成相应的汇编指令或机器指令,从而实现源程序到目标程序的转换。
三、语法制导翻译与语法制导定义的应用实例为了更好地理解语法制导翻译与语法制导定义的应用,以下以一段简单的代码为例进行说明。
假设我们需要将下面这段简单的表达式翻译成C语言的表达式:a =b +c * d首先,我们使用语法制导定义确定这个表达式的语法规则和语义规则,例如:expr -> ID = expr + exprexpr -> IDexpr -> ID = expr * exprexpr -> NUM然后,通过语法分析的过程,我们可以建立相应的语法树,并根据语法制导定义为每个语法节点添加相应的语义动作。
编译原理中的语法制导翻译与优化

编译原理中的语法制导翻译与优化编译原理是计算机科学中的一个重要分支,它研究如何将高级程序设计语言翻译成计算机能够理解和执行的低级代码。
语法制导翻译是编译原理中的一种重要技术,它能够根据语法规则和语法制导定义来进行代码翻译和优化。
一、语法制导翻译的基本概念语法制导翻译是指在语法分析的过程中,根据给定的语法规则,通过对语法制导定义的语义动作进行语法制导翻译的过程。
它是一种基于语法规则和语义规则的静态翻译方法,能够实现程序设计语言到计算机执行代码的转换。
语法规则是描述程序语法结构的形式化定义,其采用文法表示。
在编译原理中,通常使用上下文无关文法(CFG)来描述程序的语法结构。
语义规则则是在语法规则的基础上,为每个语法产生式定义语义动作,从而完成代码翻译和优化过程。
二、语法制导翻译的实现方式语法制导翻译的实现方式主要有两种:自上而下翻译和自下而上翻译。
自上而下翻译是从语法分析树的根节点开始,按照规定的顺序依次遍历所有节点并进行语法制导翻译;自下而上翻译则是从语法分析树的叶子节点开始,按照规定的顺序逐步向上进行语法制导翻译。
在自上而下翻译中,常用的实现方式有递归下降法和预测分析法。
递归下降法是一种基于递归的语法制导翻译方法,通过递归地调用语法规则的定义来完成翻译过程。
预测分析法则是一种基于预测分析表的语法制导翻译方法,通过预测输入符号串的下一个符号来选择适当的语法规则进行翻译。
自下而上翻译则主要使用LR分析法和LALR分析法。
LR分析法是一种基于LR分析表的语法制导翻译方法,它能够自下而上地对输入符号串进行规约操作。
LALR分析法则是一种基于LALR分析表的语法制导翻译方法,它是对LR分析法的一种改进,能够提高分析效率并减小分析表的规模。
三、语法制导翻译的优化语法制导翻译不仅可以实现基本的代码翻译功能,还可以进行优化操作以提高代码执行效率。
常见的语法制导翻译优化技术有如下几种:1. 常量折叠:将程序中的常量表达式计算出结果,并将计算结果直接替换原表达式,以减少运行时的计算量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
是语法结构树指针 是名字的表项入口 是数值
id.entry num.val
树构造函数
mknode 建中间结点 mkleaf 建叶结点
生成语法树的属性文法
产生式 S→id:=E 语义规则 S.p:= mknode(':=', mkleaf(id, id.entry), E.p)
E→E1+E2 E.p:= mknode('+', E1.p, E2.p) E→E1*E2 E.p:= mknode('*', E1.p, E2.p) E→ -E1 E→ (E1) E→ id E→ num E.p:= mknode('-', 0, E1.p) E.p:= E1.p E.p:= mkleaf(id, id.entry) E.p:=mkleaf(num,num.val)
翻译模式的设计
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in } L1 , id { addtype(id.entry, L.in) } L → id { addtype(id.entry, L.in) }
从其兄弟结点和父结点的属性值计算出来的 如:L.in
固有属性(单词属性)
属性的计算
构造语法分析树,填加响应的语义规则 综合属性
自底向上按照语义规则来计算各结点的综
合属性值
继承属性
需要探讨计算次序
例6-3:3*5+4 的
语法树与属性计算
E.val=15 T.val=15 T.val=3 F.val=3 digit.attr=3 *
b c 0 0 b 34 0 4 3 a 9
1 2 5 6 7 8
三地址代码
一般形式 x := y op z
其中
x, y, z 为变量名、常数或编译 产生的临时变量 x, y, z)
双目运算 单目运算 赋值 条件转移
四元式(op,
种类:x := y op z x := op y x := y if x relop y goto l
entry addtype
语义规则 L.in := T.type T.type := ‘integer’ T.type := ‘real’ L1.in := L.in addtype( id.entry, L.in ) addtype( id.entry, L.in ) 单词 id 的属性(符号表入口) 在符号表中为变量填加类型信息
包括:控制结构、数据结构、单词 充分了解它们的实现方法
目标语言的语义
了解中间代码的语义 了解运行环境
实现赋值语句的翻译
语义过程
产生一条中间代码 产生新的临时变量
gen(code) newtemp
属性设置
中间代码序列 存储位置
code
place
赋值语句的四元式翻译
S → id := E S.code := E.code || gen( id.place':='E.place ) E → E1 + E2 E.place := newtemp; E.code := E1.code || E2.code || gen(E.place':='E1.place'+'E2.place) E → E1 * E2 E.place := newtemp; E.code := E1.code || E2.code || gen(E.place':='E1.place'*'E2.place)
attr print(
语义规则 print( E.val ) E.val := E1.val + T.val E.val := T.val T.val := T1.val * F.val T.val := F.val F.val := E.val F.val := digit.attr
是单词 digit 的属性 val ) 是输出函数
习题
1. 下列文法是一个二进制数的文法。试根据 该文法,编写一个语法制导定义,描述由 S 生成的二进制数的数值计算。 S -> L . L L -> L B | B B -> 0 | 1 2. 参照下列表达式文法编写语法制导定义, 描述表达式的类型计算。要求在不同精度的 数的计算中,结果取精度高的类型。 E -> E + T | T T -> n.n | n
语义规则 L.in := T.type T.type := ‘integer’ T.type := ‘real’ L1.in := L.in addtype( id.entry, L.in ) addtype( id.entry, L.in )
将语义动作中的计算向前移,使继承属性的计 算出现在其文法符号之前
E → - E1 E → ( E1 ) E → id E → num
E.place := newtemp; E.code := E1.code || gen(E.place':=0-'E1.place) E.place:= E1.place; E.code:= E1.code E.place:= id.place; E.code:= ' ' E.place:= num.val;E.code:= ' '
例6-6:a := b * (- c) + b *
root
(- 34) 的语法结构树
:= id a + * id b * id b - 0 id c - 0 num 34
地址 算符 操作数 操作数 0 1 2
语法结构树的 三元式表示
3 4 5 6 7 8 9 10
id id * id num * + id :=
需求:算术表达式的求值 设计:
编制算术表达式的文法 引入属性表示语义信息
将值
val 作为表达式 E、项 T 和因子 F 的属性
用语义规则描述表达式的求值
属性文法(语法制导定义)
产生式 L → E E → E1 + T E → T T → T1 * F T → F F → ( E ) F → digit
6.2 中间语言
用于编译程序
源程序经过语义分析被译成中间代码
序列
(中间语言的语句)
用中间语言过渡的好处:
便于编译系统的实现、移植、代码优
化
常用的中间语言
三地址代码(四式) 语法结构树(三元式)
后缀式 特点 形式简单、语义明确、便于翻译 独立于目标语言
语法制导编译
例6-4:real id1,id2,id3 的
分析树和属性计算
S-属性定义:
仅包括综合属性
对于所有A
→ X1 X2 …Xn, 的属性
A的属性计算仅用X1…Xn
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左至
右计算
对于所有 Xi
A→X1 X2 … Xn
属性计算仅使用A X1 X2 … Xi-1 的属性
L Print(19) E.val=19 + T.val=4 F.val=4 F.val=5 digit.attr=5 digit.attr=4
D T.type=real real L.in=real id1
addtype
L.in=real L.in=real , , id2
addtype
id3
addtype
其他三地址代码
goto l param x call p, n (n是参数个数) return x x := y[i] x[i] := y x := &y x := *y *x = y 无条件转移 实在参数 过程调用 过程返回 数组运算 指针运算
6.3 赋值语句的翻译
翻译的需求
充分了解各种语言现象的语义
组成语句的翻译结果(中间代码序列)
中间代码的生成过程
S.code => E.code || gen( ‘a:=‘E.place ) /* ‘a’ => id.place */ => E1.code || E2.code || gen( ‘t1:=‘E1.place’+’E2.place ) || gen( ‘a:=t1’ ) /* newtemp => t1 => E.place */ => E11.code || gen( ‘t2:= 0 -’ E11.place ) /* newtemp => t2 => E1.place */
|| E21.code || E22.code || gen( ‘t3:=’ E21.place’*’E22.place ) /* newtemp => t3 => E2.place */ || gen( ‘t1:=t2+t3’ ) || gen( ‘a:=t1’ ) => gen( ‘t2:= 0 - c’ ) || gen( ‘t3:=b*34’ ) /* ‘c’ => E11.place */ /* ‘b’ => E21.place */ /* ‘34’ => E22.place */ || gen( ‘t1:=t2+t3’ ) || gen( ‘a:=t1’ ) /* ‘ ’ => E21.code => E22.code */
例6-2:说明语句的类型信息统计
说明语句的作用
支持语义分析,提供语义检查的依据
设计
编写说明语句的文法 将类型信息作为类型描述