语义分析和语法制导翻译-编译原理-06-(二)

合集下载

06第6章 语法制导翻译技术PPT课件

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-语义分析和语法制导翻译

6-1-语义分析和语法制导翻译
(Inherited Attributes)。
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. 常量折叠:将程序中的常量表达式计算出结果,并将计算结果直接替换原表达式,以减少运行时的计算量。

编译原理课件06属性文法和语法制导翻译

编译原理课件06属性文法和语法制导翻译
编译原理课件06属性文法 和语法制导翻译
属性文法和语法制导翻译是编译原理领域的两个核心概念。本课程将深入探 讨这两个主题,让大家全面了解编译原理的精髓。
属性文法:理论基础
属性文法定义
与上下文无关文法的区别
属性文法定义了语法结构的属性, 包括终结符和非终结符上的属性 和符号间的依赖。
上下文无关文法的语法结构是确 定的,而属性文法的语法结构中 包含了属性的信息。
产生式规则
属性文法的产生式规则由形式化 的产生式和附加的语义规则组成。
语法制导翻译:应用实例
1 基本概念
语法制导翻译将属性值与语法树相结合,用 于将源语言转换为目标语言。
2 方法
语法制导翻译可以通过S属性翻译计算自底向 上地求解,或手动注入Semantic动作。
3 过程
语法制导翻译的过程包括生成属性语法树, 计算语法树的属性,以及将属性与具体操作 相结合。
4 应用实例
语法制导翻译可用于编译器和解释器中,例 如C语言和Java编译器。
语法制导翻译:方法与实践
1
构建属性语法树
将上下文无关文法转化为属性文法,并构建出属性语法树。下而上或自上而下的语法属性计算。
3
执行动作
根据语法属性的计算结果,执行对应的语义动作。
属性文法和语法制导翻译的应用举例
创造思维
转型准备
编译原理培养了我们的创造思维, 让我们能够从编译器底层的实现 中提升自己的能力。
编译原理培养了我们的技术能力 和团队协作精神,为我们的未来 职业道路打下了基础。
编译器
编译器使用语法制导翻译将高级语言转换为机 器代码。
代码生成
属性文法可以用于指令选择与寄存器分配,优 化生成的目标代码。

编译原理期末试题8套含答案大题集

编译原理期末试题8套含答案大题集

《编译原理》期末试题(一)一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分)1.编译程序是对高级语言程序的解释执行。

(× )2.一个有限状态自动机中,有且仅有一个唯一的终态。

(×)3.一个算符优先文法可能不存在算符优先函数与之对应。

(√ )4.语法分析时必须先消除文法中的左递归。

(×)5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。

(√)6.逆波兰表示法表示表达式时无须使用括号。

(√ )7.静态数组的存储空间可以在编译时确定。

(×)8.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。

(×) 9.两个正规集相等的必要条件是他们对应的正规式等价。

(× )10.一个语义子程序描述了一个文法所对应的翻译工作。

(×)二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.词法分析器的输出结果是_____。

A.( ) 单词的种别编码B.( ) 单词在符号表中的位置C.( ) 单词的种别编码和自身值D.( ) 单词自身值2.正规式M 1 和M 2 等价是指_____。

A.( ) M1和M2的状态数相等B.( ) M1和M2的有向边条数相等C.( ) M1和M2所识别的语言集相等D.( ) M1和M2状态数和有向边条数相等3.文法G:S→xSx|y所识别的语言是_____。

A.( ) xyx B.( ) (xyx)* C.( ) xnyxn(n≥0) D.( ) x*yx*4.如果文法G是无二义的,则它的任何句子α_____。

A.( )最左推导和最右推导对应的语法树必定相同B.( ) 最左推导和最右推导对应的语法树可能不同C.( ) 最左推导和最右推导必定相同D.( )可能存在两个不同的最左推导,但它们对应的语法树相同5.构造编译程序应掌握______。

第6章 语法制导翻译和语义分析详述

第6章 语法制导翻译和语义分析详述
随着编译的进展,对语法分析产生的语法树进行语义分析,且分析 的结果用中间代码描述出来。对于一棵等待翻译的语法树,它的各个结 点都是文法中的一个符号X,该X可以是终结符或非终结符。根据语义处 理的需要,在用产生式A→αXβ进行归约或推导时,应能准确而恰当地表 达文法符号X在归约或推导时的不同特征。
例如,判断变量X的类型是否匹配,要用X的数据类型来描述;判断 变量X是否存在,要用X的存储位置来描述;而对X的运算,则要用X的 值来描述;因此,语义分析阶段引入X的属性,如X.type、X.place、X.val 等来分别描述变量X的类型、存储位置以及值等不同的特征。
其值由说明中的关
in:继承属性,
键字确定
产生式 (1)D→TL (2)T→int (3)T→float
(4)L→L1,id
(5)L→id
语义规则 {L.in = T.type;} {T.type = int;} {T.type = float;} {L1.in = L.in; addtype(id.entry,L.in); } {addtype(id.entry,L.in);}
(3)常见的中间代码形式
①后缀式(逆波兰表示式) ②图表示法 ❖ 抽象语法树 ❖ DAG图 ③三地址代码 ❖ 四元式 ❖ 三元式 ❖ 间接三元式
2、 常见的中间代码形式
(4)后缀式(逆波兰式)
①定义 后缀式表示法(逆波兰表示法),由波兰逻辑学家卢卡西维奇
(Lukasiewicz)发明,它把运算量(操作数)写在前面,把运算符写在 后面(后缀)的一种表达式表示方法。其归纳定义如下: a) 如果E是一个变量或常数,则E的后缀式是E自身。 b) 如果E是E1 op E2 形式的表达式,op是二元操作符,则E的后缀式为 E1´E2´op,其中E1´,E2´分别是E1和E2的后缀式。 c) 若E是(E1)形式的表达式,则E的后缀式就是E1的后缀式。

编译原理第六章属性文法和语法制导翻译

编译原理第六章属性文法和语法制导翻译

第六章 属性文法和语法制导翻译要紧内容:[1] 法制导翻译的大体思想; [2] 属性文法的大体概念; [3] 基于属性文法的处置方式;[4] 在自上而下分析和自下而上分析中的属性计算。

大体要求:[1] 明白得语法制导翻译和属性文法的大体思想和方式, [2] 把握属性的计算方式。

教学要点:本章中,咱们将第一介绍属性文法的大体概念,然后介绍基于属性文法的处置方式,讨论如安在自上而下分析和自下而上分析中实现属性的计算。

讲义摘要:6.1 属性文法一、语义分析的任务一、静态语义分析或静态审查。

例如,类型检查、操纵流检查(操纵流语句必需使操纵转移到合法的地址 )、维数检查、越界检查、名字的作用域分析 等。

二、动态语义处置。

若是静态语义正确,语义处置那么要执行真正的翻译。

例如,变量的存储分派;表达式的求值;语句的翻译(中间代码的生成)。

3、总目标:生成等价的中间代码二、属性文法 一、属性所谓属性,其涉及的概念比较普遍,经常使用以描述事物或人的特点、性质,品质等等。

比如,谈到一个 物体,能够用“颜色”描述它,谈起某人,能够利用“有幽默感“来形容他。

对编译程序利用的语法树的结点,能够用"类型"、"值"或"存储位置"来描述它。

二、属性文法(也称属性翻译文法)属性文法是Knuth 在1968年第一提出的。

它是在上下文无关文法的基础上,为每一个文法符号(终结符或非终结符)配备假设干相关的“值”(称为属性)。

这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。

属性与变量一样,能够进行计算和传递。

属性加工的进程即是语义处置的进程。

关于文法的每一个产生式都配备了一组属性的计算规那么,称为语义规那么。

语义规那么所描述的工作能够包括属性计算、静态语义检查、符号表操作、代码生成等等。

3、属性文法的形式化概念形式上讲,一个属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。

编译原理课件-ch06--语义分析-95页PPT精选文档

编译原理课件-ch06--语义分析-95页PPT精选文档
–标识符的每次出现都按首次出现处理 –检索:
• 已经声明,进行类型检查,... • 首次出现,插入操作,从其作用推测出该变量的全部属性
20
Wensheng Li BUPT @ 2008
定位和重定位操作
对于块结构的语言,在建立和删除符号表时还要使 用两种附加的操作,即定位和重定位。
当编译程序识别出块的开始时,执行定位操作。 当编译程序遇到块的结束时,执行重定位操作。 定位操作:
–如果编译的程序块处于该变量的作用域内,则这个变量将 一直保留在符号表中
4
Wensheng Li BUPT @ 2008
语义检查
动态检查:目标程序运行时进行的检查 静态检查:读入源程序、但不执行源程序的情况下
进行的检查
–类型检查
• 对访问数据的操作和被访问数据的类型进行检查,检查操作的合 法性和数据类型的相容性。
两方面的优点:
– 对语法分析程序来讲降低了文法的复杂性 – 允许用更系统的方法对上下文有关的错误进行检测和校正。
11
二、符号表内容
符号表中记录的是和标识符相关的属性 出现在符号表中的属性种类,在一定程度上取决
于程序设计语言的性质。 符号表的典型形式:
变量名 目标地址 类型 维数 声明行 引用行 指针
2
9,14,15
flag
1
0
7
28,29
form
3
2
4
36,37,38
mlist
6
0
6
17,21
x_total 1
03
12,14
18
链域
为了便于产生按字母顺序排列的交叉引用表 如果编译程序不产生交叉引用表,则链域以及语句

第06章 语法制导翻译技术

第06章 语法制导翻译技术

6.2 语法制导翻译
语法制导翻译:按翻译文法进行的翻译。 给定一输入符号串,根据翻译文法获得翻译该符号串 的动作序列,并执行该序列所规定的动作的过程。 例: 输入序列:a+b*c 活动序列:a@a+b@b*c@c@*@+ 动作序列:@a@b@c@*@+ 翻译结果:abc*+
17
6.2 语法制导翻译
11
例:符号串(a+b)*b
用输入文法推导:
E=>T =>T*F =>F*F =>(E)*F =>(E+T)*F =>(T+T)*F =>(F+T)*F =>(a+T)*F =>(a+F)*F =>(a+b)*F =>(a+b)*b T F ( E ) E T * F b
E
T F a
+
T
F b
12
翻译文法:
① A→@va@wB@xc@yD@z ③ B→c@r ⑤ D→cD@n
② A→b ④ B→a@mA ⑥ D→@sb
翻译文法的LL(1)分析表
符 号 输入符号 a
POP,PUSH(@zD@yc POP, PUSH(b) POP, PUSH(@rc) POP, PUSH(b@s) POP, PUSH(@nDc)
7
分别给出下列表达式的后缀表示
1. a+b*(c-d)
2. (a-b)*c+d 3. -a+b*(-c+d) 4. X:=-(a+b)/(c-d)-(a+b*c) 1. abcd-*+ 2. ab-c*d+
3. a-bc-d+*+

编译原理 语法制导翻译

编译原理 语法制导翻译
搜索方法: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-属性定义
语法树自底向上计算属性

编译原理:第六章 属性文法和语法制导翻译

编译原理:第六章  属性文法和语法制导翻译

id2 2
entry
• 如果一属性文法不存在属性之间的循环依赖关系,那么称该文法为 良定义的
属性的计算次序
• 一个依赖图的任何拓扑排序都给出一个语法树中结 点的语义规则计算的有效顺序 • 属性文法说明的翻译是很精确的
• 基础文法用于建立输入符号串的语法分析树 • 根据语义规则建立依赖图 • 从依赖图的拓扑排序中,我们可以得到计算语义规
• 综合属性
• 在语法树中,一个结点的综合属性的值由其子结点的属性值确定。 • 使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值
• 仅仅使用综合属性的属性文法称S-属性文法
产生式பைடு நூலகம்L→En E→E1+T E→T T→T1*F T→F F→ (E) F→digit
语义规则 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.lexval
E→E1+E2
E.val:=E1.val+E2.val
val E
E1
+
val
E2 val
句子real id1,id2,id3的带注 释的语法树的依赖图
D
产生式 语义规则 D→TL L.in := T.type T→int T.type := integer T→real T.type := real L→L1, id L1.in :=L.in
4
属性文法的说明(2)
③ 与产生式 A X1X2…Xn 相关联的属性计算规 则只能是 A. 综合属性和Xi . 继承属性的计算。不 能有A的继承属性和Xi 的综合属性的计算规则。

哈工大编译原理6-2

哈工大编译原理6-2

11
1、基本思想: 假定E 形如a<d,则将生成 如下的E的代码:
三地址表示:
E.true:
E.false:
if a<b goto E.true (真出口)
goto E.false (假出口)
四元式表示:
E.true: (j<, a , b , E.true) (真出口)
E.false:
(j
, , , E.false ) (假出口)
1
一、 布尔表达式的翻译方法 1、布尔表达式的表示 • 方法一:用数值表示真和假,从而对 布尔表达式的求值可以象对算术表达 式的求值那样一步一步地来计算 例 1 or (not 0 and 0) or 0 =1 or (1 and 0)or 0 优先级:not、and、or =1 or 0 or 0 And、or左结合 =1 or 0 not右结合 =1
If a <b goto L1 Goto Lfalse L1 If c <d goto L2 Goto Lfalse L2 If e<f goto ltrue Goto Lfalse
18
4、用四元式表示中间代码
用四元式实现三地址码,真假出口可表 示为: 真出口: (jnz,a,_,P)表示 if a goto P (jrop,x,y,P)表示 if x rop y goto P 假出口: (j,_,_,P)表示 goto P
100 (J<,a,b,102)
if a<b goto L1
goto Lfalse
101
(j, , ,Lfalse)
L1:if c<d goto l2
goto Lfalse
102 (J<,c,d,104) 103 (j, , ,Lfalse)

编译原理语法制导翻译的实现与优化

编译原理语法制导翻译的实现与优化

编译原理语法制导翻译的实现与优化编译原理是计算机科学中的一门重要课程,研究的是如何将高级语言翻译成机器语言。

而在编译过程中,语法制导翻译是其中的关键步骤之一。

本文将就编译原理语法制导翻译的实现与优化进行探讨。

一、什么是语法制导翻译语法制导翻译是指根据语法规则,利用翻译文法和语法规则,将源代码翻译成目标代码的过程。

在进行语法制导翻译时,需要构建语法制导定义,通过对源代码的语法分析和语义分析,生成目标代码。

二、语法制导翻译的实现步骤1. 词法分析:将源代码分解为基本的词法单元,如标识符、关键字、常数等。

2. 语法分析:根据给定的语法规则,将词法单元构建成语法分析树。

这一步骤可以使用自顶向下的递归下降分析法或自底向上的LR分析法等。

3. 语义分析:在语法分析的基础上,对语法树进行遍历,通过语义规则对每个节点进行语义动作,并生成中间代码。

4. 中间代码生成:将语义分析产生的中间代码转换为目标代码的表示形式。

这一步骤可以使用三地址代码、四元式等形式。

5. 优化:对中间代码进行优化,以提高程序的执行效率和节省系统资源。

优化的方法有很多,包括常量折叠、公共子表达式消除、循环优化等。

6. 目标代码生成:将优化后的中间代码转换为目标机器代码。

这一步骤需要考虑目标机器的特性和指令集,以保证生成的目标代码能够在目标机器上正确运行。

三、语法制导翻译的优化策略1. 常量折叠:在编译过程中,如果遇到常量表达式,可以直接计算得到结果,避免重复计算。

2. 代数优化:对于复杂的数学表达式,可以通过代数运算规则进行简化,减少计算量。

3. 死代码消除:分析程序的数据流,删除不会被执行的语句,减少目标代码的长度。

4. 公共子表达式消除:对于多次出现的表达式,可以将其计算结果保存在临时变量中,减少重复计算。

5. 循环优化:对于循环语句,可以进行循环展开、循环不变代码移动等优化,减少循环次数和重复计算。

四、语法制导翻译的应用领域语法制导翻译广泛应用于编译器、解释器等软件开发领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
E.p
是语法结构树指针 是名字的表项入口 是数值
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:说明语句的类型信息统计

说明语句的作用
支持语义分析,提供语义检查的依据

设计
编写说明语句的文法 将类型信息作为类型描述
相关文档
最新文档