第八章 语法制导翻译

合集下载

编译原理分知识点习题 语法制导和翻译

编译原理分知识点习题 语法制导和翻译
解答:布尔表达式的语义子程序为:
规则语义动作
(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.试卷保密,考生不得将试卷带出考场或撕页,否则成绩作废。

请监考老师负责监督。

2.请各位考生注意考试纪律,考试作弊全部成绩以零分计算。

3.本试卷满分100分,答题时间为90分钟。

4.本试卷分为试题卷和答题卷,所有答案必须答在答题卷上,答在试题卷上不给分。

一、【单项选择题】(本大题共10小题,每小题2分,共20分)在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在答题卷相应题号处。

1、一个编译程序中,包含词法分析、()、中间代码生成、代码优化、目标代码生成等五个部分。

[A] 语法分析[B] 文法分析[C] 语言分析[D] 解释分析2、词法分析器用于识别()。

[A] 字符串[B] 语句[C] 单词[D] 标识符3、语法分析器则可以发现源程序中的()。

[A] 语义错误[B] 语法和语义错误[C] 错误并校正[D] 语法错误4、下面关于解释程序的描述正确的是()。

(1) 解释程序的特点是处理程序时不产生目标代码。

(2) 解释程序适用于COBOL 和FORTRAN 语言。

(3) 解释程序是为打开编译程序技术的僵局而开发的。

[A] (1)(2)[B] (1)[C] (1)(2)(3)[D] (2)(3)5、解释程序处理语言时, 大多数采用的是()方法。

[A] 源程序命令被逐个直接解释执行[B] 先将源程序转化为中间代码, 再解释执行[C] 先将源程序解释转化为目标程序, 再执行[D] 以上方法都可以6、编译过程中, 语法分析器的任务就是()。

(1) 分析单词是怎样构成的(2) 分析单词串是如何构成语句和说明的(3) 分析语句和说明是如何构成程序的(4) 分析程序的结构[A] (2)(3)[B] (2)(3)(4)[C] (1)(2)(3)[D] (1)(2)(3)(4)7、编译程序是一种()。

[A] 汇编程序[B] 翻译程序[C] 解释程序[D] 目标程序8、文法G 所描述的语言是()的集合。

第八章 语法制导翻译和中间代码生成

第八章 语法制导翻译和中间代码生成

目标代码
5
语义分析
语义分析的任务:在词法分析和语法分析的基础上,
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
分析所写源程序的含义,在理解含义的基础上为生成 相应的目标代码作好准备或直接生成目标代码。 1)静态语义检查 例:类型检查、运算、维数、越界 2)语义翻译(具体的动作) 例:语句的翻译(中间代码或目标代码生成)
16
简化定义
对每个产生式,设属性定义性出现的集合为
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
若Xi是产生式左部非终结符(即i=0),则称属性 Xi.a是综合属性(Synthesized Attributes) 若Xi出现在产生式的右部(即i≠0 ),则称Xi.a是 继承属性(Inherited Attributes)
2
教学内容
第一节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
属性文法 语法制导翻译概论 中间代码的形式 简单赋值语句的翻译 布尔表达式的翻译 控制语句的翻译 说明语句的翻译 数组和结构的翻译
3
第二节 第三节 第四节 第五节 第六节 第七节 第八节
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
2.组成
语法树上的每个节点的所有属性在依赖图上各有 一个节点,如果属性y依赖于属性x,那么从x的节点 到y的节点有一条有向边。 【注】如果语法树一节点的属性y依赖某个节点的属 性x,那么属性y的语义产生式的计算必须在属性x的 语义产生式的计算之后进行。 24
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
13
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
3、文法规则number→number digit ,表明文法的个 数不止一个。我们必须表示出这个文法规则左边符 号的值和右边符号的值之间的关系。通过使用下标 进行区分,将文法写成如下形式: number1→number2 digit

语法制导翻译方案

语法制导翻译方案

语法制导翻译方案1. 简介语法制导翻译是一种通过编译器根据源语言的语法结构来生成目标语言代码的方法。

它使用语法规则和语义动作来将源代码翻译为目标语言,并在翻译过程中进行语义分析和语法分析。

在这篇文档中,我们将介绍语法制导翻译的基本原理和实现方法,并给出一个具体的实例来说明如何使用语法制导翻译方案进行代码翻译。

2. 基本原理语法制导翻译的基本原理是通过使用语法规则和语义动作来将源语言的语句转换为目标语言的等价语句。

它结合了语义分析和语法分析的过程,并通过语法规则和语义动作建立源语言和目标语言之间的映射关系。

在语法分析的过程中,编译器会根据语法规则来判断源语言的语句是否合法,并进行相应的语法转换。

在语义分析的过程中,编译器会根据语义动作来处理源语言的语句,并生成目标语言的等价语句。

3. 实现方法3.1 语法规则语法规则是语法制导翻译的核心部分,它定义了源语言和目标语言之间的转换规则。

语法规则通常由产生式表示,它描述了源语言的各种语句的组合方式和语义含义。

在编译器的实现过程中,需要根据语法规则来判断源语言的语句是否符合规范,并进行相应的转换。

3.2 语义动作语义动作是语法制导翻译中的一种处理方式,它在语法分析的过程中根据语法规则进行相应的处理。

语义动作通常由一段代码表示,它用于实现特定的语义操作,例如变量声明、函数调用等。

在编译器的实现过程中,需要根据语义动作来处理源语言的语句,并生成目标语言的等价语句。

3.3 语法制导翻译的流程语法制导翻译的流程通常包括以下几个步骤:1.词法分析:将源代码分割为一个个的词法单元,并进行词法分析,生成词法分析结果。

2.语法分析:根据语法规则对词法分析结果进行语法分析,生成语法分析树。

3.语义分析:根据语义动作对语法分析树进行语义分析,生成目标语言的等价语句。

4.代码生成:根据目标语言的语法规则将目标语言的等价语句转化为目标语言的代码。

3.4 代码示例以下是一个简单的示例,演示了如何使用语法制导翻译方案将一个简单的算术表达式翻译为目标语言的等价表达式。

第8讲 语法制导翻译_1

第8讲 语法制导翻译_1
输入:
3*5+4n
副作用(Side effect)
语义规则
E.val=15 + T.val=4
print(E.val)
E.val = E1 .val + T.val E.val = T.val
T.val = T1val × F.val
T.val = F.val
T.val=15
F.val=4
T.val=3 * F.val=5 digit.lexval=4
如果一个SDD是S属性的,可以按照语法分析树节点的任何 自底向上顺序来计算它的各个属性值
S-属性定义可以在自底向上的语法分析过程中实现
L- 属 性 定 义
L-属性定义( 也称为L属性的SDD或L-SDD) 的 直观含义:在一个产生式所关联的各属性之间, 依赖图的边可以从左到右,但不能从右到左 ( 个SDD是L-属性定义,当且仅当它的每个属性要 么是一个综合属性,要么是满足如下条件的继承属 性:假设存在一个产生式A→X1X2…Xn,其右部符 号Xi (1 i n)的继承属性仅依赖于下列属性:
A的继承属性 产生式中Xi左边的符号 X1, X2, … , Xi-1 的属性 Xi本身的属性,但Xi 的全部属性不能在依赖图中形成环路
将每个产生式和一组语义规则相关联,用来计算 该产生式中各文法符号的属性值
文法符号的属性
综合属性 ( synthesized attribute) 继承属性 ( inherited attribute)
综 合 属 性 ( synthesized attribute)
在分析树结点 N上的非终结符A的综合属性只能通 过 N的子结点或 N本身的属性值来定义
两个概念
将语义规则同语法规则(产生式)联系起来要 涉及两个概念

编译原理习题及答案

编译原理习题及答案

2. 正规式 M 1 和 M 2 等价是指_____。 A.( ) M1 和 M2 的状态数相等 C.( ) M1 和 M2 所识别的语言集相等 B.( ) M1 和 M2 的有向边条数相等 D.( ) M1 和 M2 状态数和有向边条数相等
3. 文法 G:S→xSx|y 所识别的语言是_____。 A.( ) xyx B.( ) (xyx)* C.( ) xnyxn(n≥0) D.( ) x*yx*
10.编译程序使用_____区别标识符的作用域。 A. ( ) 说明标识符的过程或函数名 B.( ) 说明标识符的过程或函数的静态层次 C.( ) 说明标识符的过程或函数的动态层次 D. ( ) 标识符的行号 三、填空题(每空 1 分,共 10 分) 1.计算机执行用高级语言编写的程序主要有两种途径:___解释__和__编译___。 2.扫描器是__词法分析器___,它接受输入的__源程序___,对源程序进行___词法分析__并识别出一个个 单词符号,其输出结果是单词符号,供语法分析器使用。 3.自上而下分析法采用___移进__、归约、错误处理、___接受__等四种操作。 4.一个 LR 分析器包括两部分:一个总控程序和___一张分析表__。 5.后缀式 abc-/所代表的表达式是___a/(b-c)__。 6.局部优化是在__基本块___范围内进行的一种优化。 四、简答题(20 分) 1. 简要说明语义分析的基本功能。 答:语义分析的基本功能包括: 确定类型、类型检查、语义处理和某些静态语义检 查。
4lr0分析器所谓lr0分析是指从左至右扫描和自底向上的语法分析且在分析的每一步只须根据分析栈当前已移进和归约出的全部文法符号并至多再向前查看0个输入符号就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成从而也就可以确定当前所应采取的分析动作移进还是按某一产生式进行归约等

第08章语法制导翻译和中间代码生成

第08章语法制导翻译和中间代码生成
28
常用的中间语言
• 三地址代码(四元式) 三地址代码(四元式) • 语法结构树(三元式) 语法结构树(三元式) • 后缀式
特点
• 形式简单、语义明确、便于翻译 形式简单、语义明确、 • 独立于目标语言
29
三元式和树形表示
• 每个三元式由三个部分组成,分别是:算符op, 每个三元式由三个部分组成,分别是:算符op, op 第一运算对象ARG1和第二运算对象ARG2 ARG1和第二运算对象ARG2。 第一运算对象ARG1和第二运算对象ARG2。运算 对象可能是源程序中的变量, 对象可能是源程序中的变量,也可能是某个三 元式的结果,用三元式的编号表示。 元式的结果,用三元式的编号表示。 • 表达式的树形表示很容易实现:简单变量或常 表达式的树形表示很容易实现: 数的树就是该变量或常数自身,如果表达式e1 数的树就是该变量或常数自身,如果表达式e1 e2的树分别为T1和T2,那么e1+e2 e1*e2, 的树分别为T1 e1+e2, 和e2的树分别为T1和T2,那么e1+e2,e1*e2, e1的树分别为 的树分别为: -e1的树分别为:
9
–lexval 是单词 digit 的属性 lexval
例8-3 3*5+4 的
语法树与属性计算
L Print(19) E.val=19
E.val=15 T.val=15 T.val=3 F.val=3 digit.lexval=3 *

T.val=4 F.ቤተ መጻሕፍቲ ባይዱal=4
F.val=5 dgit.lexval=5
• 用中间语言过渡的好处: 用中间语言过渡的好处:
–便于编译系统的实现、移植、代码优化 便于编译系统的实现、移植、 便于编译系统的实现

编译第8章

编译第8章
–是一种接近形式化的语义描述方法 –长于描述静态语义、短于描述动态语义 –每个语法符号有相应的属性符号 –每个产生式有相应的计算属性的规则:
• 属性变量=属性表达式
1、属性文法定义
属性文法(attribute grammar)是一个三元 组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或非 终结符相连,这些属性代表与文法符号相关信息, 如它的类型、值、代码序列、符号表内容等等 .属 性与变量一样,可以进行计算和传递。属性加工 的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称为 语义规则) . 断言或语义规则与一个产生式相联,只 引用该产生式左端或右端的终结符或非终结符相 联的属性.
addtype
id3
addtype
例5-4:real id1,id2,id3 的分析树和属性计算
8.3 中间代码的形式
何谓中间代码: 源程序的一种内部表示,不依赖目标机的 结构,易于机械生成目标代码的中间表示。 为什麽要此阶段 逻辑结构清楚; 利于不同目标机上实现同一种语言; 利于进行与机器无关的优化; 这些内部形式也能用于解释;
• 语义处理
–例:变量的存储分配 –例:表达式的求值 –例:语句的翻译(中间代码的生成)
• 总目标:生成等价的中间代码
语义处理方法
• 对应每一个产生式编制一个语义子程序, 当一个产生式获得匹配时,调用相应的 语义子程序实现语义检查与翻译。 • 在产生式的右部的适当位置,插入相应 的语义动作,按照分析的进程,执行遇 到的语义动作。
8)若把语义子程序改成产生某种中间代 码的动作,就能在语法分析制导下,随 着分析的进展逐步生成中间代码。 9)若把语义子程序改成产生某种机器的 汇编语言指令,就能随着分析的进展逐 步生成某机器的汇编语言代码。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利于进行与机器无关的优化 ;这些内部形式也能用于解释。 . 中间代码的几种形式 逆波兰 四元式 三元式 间接三元式 树
例 : A + B * ( C - D ) + E / ( C - D ) ^N
逆波兰 : 四元式 : ABCD-*+ECD–N^/+ (1) ( C D T1 )
(2) ( * B (4) ( (6) ( / C E
类型相容性 变量先声明后引用 名称相关要求 动态语义 程序单位描述的计算

编译程序的语义处理工作 静态语义审查 解释执行动态 语义(计算)生成代码...
概述
语义形式化 语义建模 文法模型---- 属性文法 命令式或操作式模型 ----- 操作语义学 应用式模型-----指称语义学 公理式模型-----公理语义学
第八章语法制导翻译和中间代码生成
8.1概述 8.2属性文法和语法制导翻译 8.3中间代码
概述
程序设计 语言的语义

语义处理
语 法 分 析 后 的 源 程 序 语义处理
静态语义是对程序约束的描述,这些约束无法通过抽象 语法规则来妥善地描述,实质上就是语法规则的良形式 条件,它可以分为类型规则和作用域/可见性规则两大类
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 T T F F
T T1 * F F (E) digit
设表达式为3*5+4,则语义动作打印数值
19
.
L
E.val=19 E.val=15
+
T.val=4 F.val=4 F.val=5 digit.lexval=4 digit.lexval=5
T.val=15 T.val=3 F.val=3 digit.lexval=3
*
3*5+4的带注释的分析树
继承属性
一个结点的继承属性值是由此结点的父结点和/或兄弟 结点的某些属性来决定的。 例8.2 继承属性L.in
一个属性文法的例子 例8.1 P156 非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性 ,它的值由词法分析器提供。与产生式L→En对应的语义规则仅 仅是打印由E产生的算术表达式的值的一个过程,我们可认为这 条规则定义了L的一个虚属性。某些非终结符加下标是为了区分 一个产生式中同一非终结符多次出现 产 生 式 L E E E1+T 语 义 规 则
(2) EE1+E2 {E.place:= newtemp; emit(E.place―:=‖ E1.place―+‖E2.place)} (3) E - E1 { E.place:=newtemp; emit(E.place―:=‖―uminus‖ E1.place)} (4) E( E1) { E.place:= E1.place} (5) Eid {E.place:=newtemp; P:=lookup(); if Pnil then E.place:=P else error}
属性文法和语法制导翻译
虽然形式语义学(如指称语义学、公理语义 学、操作语义学等)的研究已取得了许多 重大的进展,但目前在实际应用中比较 流行的语义描述和语义处理的方法主要 还是属性文法和语法制导翻译方法
属性文法
属性文法(attribute grammar)是一个三元组 :A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或 非终结符相连,这些属性代表与文法符号相关信 息,如它的类型、值、代码序列、符号表内容 等等 .属性与变量一样,可以进行计算和传递。 属性加工的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称 为语义规则) . 断言或语义规则与一个产生式相 联,只引用该产生式左端或右端的终结符或非终 结符相联的属性.
语法制导的翻译

直观地说,一个语法制导翻译的基础是一个文法,其 中翻译成分依附在每一产生式上。

例8.5: 把下述产生式定义的算术表达式映射到后缀波兰表 示:
产生式 EE+T E T
翻译规则
E=ET+ E=T T=TF T=F F=E F=a
T TF
T F F (E) F a

确定输入a+aa的输出: (E,E)(E+T,ET+) (T+T,TT+) (F+T,FT+) (a+T,aT+) (a+TF,aFF+) (a+FF,aFF+) (a+aF,aaF+) (a+aa,aaa+)
中间代码
. 何谓中间代码 ( Intermediate code ) ( Intermediate representation ) ( Intermediate language ) 源程序的一种内部表示,不依赖目标机的结构,易于机械生成 目 标代码的中间表示。 . 为什么要此阶段? 逻辑结构清楚;利于不同目标机上实现同一种语言;
(1) ) (2) ) D ) (5) )
(5) ( ^ (4) N ) (3) (6) )
例 : A + B * ( C - D ) + E / ( C - D ) ^N
间接三元式 : 间接三元式序列 (1) ( - C D ) 间接码表 (1) (2) (3) ( 1) (4) (5 ) (6 )
公理语义学
形式语义学的一个分支。不同的人在了
解程序的含义时有不同的要求。公理语 义学方法就是研究如何将这些不同的要 求形式化,并根据这些要求严格给出程 序设计语言的有关语义。
属性文法
表达式文法 E—>T+T| T or T T—>n | b ET1 + T 2 { T1.type = int T2.type= T1.type E.type :=int} E T1 or T2 { T1.type = bool T2.type= T1.type E.type :=bool} T n { T.type := int} T b { T.type := bool}
操作语义学
操作语义学,是形式语义学的一个分支。程序
设计语言的实施是在具体的计算机系统中按照 语言的语义编制语言的翻译程序,将语言中各 个成分翻译成计算机系统中相应的一组操作。 语言在计算机系统中的一种实施一旦完成,那 么对这个计算机系统而言,语言各个成分的含 义也就完全确定了。因此语言的实施也可用来 定义语言的语义,即将语言成分所对应的计算 机系统的操作作为语言成分的语义,这种语义 被称作操作语义。由于语言的语义应该是标准 的,不应依附于一个特定的计算机和一种具体 的实施,因此操作语义学是用解释执行程序的 抽象的机器来定义语言的语义。
T1 T2) D T4) T5) T7)
(3) ( + A T2 T3) (5) ( ^ T4 N (7) ( + T3 T6
T5 T6)
例 : A + B * ( C - D ) + E / ( C - D ) ^N
三元式:
(1) ( C D )
(2) ( * B (3) ( + A (4) ( (6) ( / (7) ( + C E
指称语义学
(denotational semantics)


形式语义学的一个分支。人们用程序设计语言编制程序 ,命令计算机系统去加工数据。不同的计算机系统有不同的 结构,因此对同一个命令的执行过程可以不同,但最终效果 应该相同。指称语义学方法认为不应该将程序设计语言中各 个成分的执行过程计入语言成分的语义中。语言成分的语义 ,应该是执行语言成分所要得到的最终效果。这是语言成分 所要表达的含义,是语言成分本身所固有的,不因计算机系 统的不同而改变。执行语言成分产生的最终效果被看作是语 言成分的所指,称作为语言成分的指称物。这种语义学以语 言成分的指称物作为语言成分的语义,故名为指称语义学。 指称语义学中用于定义语义的指称物多数是传统的数学 对象,如整数、集合、映象等,故早期又称为数学语义学。 这一名称容易使人误认为其他形式语义学分支是非数学的, 后已不再使用。
D T.type=real real L.in= real L.in= real , id3
L.in= real id1

.
id2
语法制导的翻译
一个翻译是符号串对的一个集合。在一个编译程

序定义的翻译中,符号串对是源程序和目标程序 。各个编译阶段定义一个翻译,词法分析:(字 符串,单词串)语法分析:(单词串,语法树) 代码生成(语法树,汇编语言) 设是输入字母表且是输出字母表。定义由语言 L1 *到语言L2 *的一个翻译是由*到 *的 一个关系T,使得T的定义域为L1且T的值域为L2 。 使(x,y) ∈T的句子y叫做x的一个输出.
在一个属性文法中,对应于每个产生式 A 都有一 套与之相关联的语义规则,每条规则的形式为 b:=f(c1,c2…ck) 这里,f是一个函数,而且或者 ( 1 ) b 是 A 的一个综合属性并且 c1,c2…ck 是产生式 右边文法符号的属性;或者 ( 2 ) b 是产生式右边某个文法符号的一个继承属 性并且 c1,c2…ck 是 A 或产生式右边任何文法符号的 属性。 在两种情况下,我们都说属性 b 依赖于属性 c1,c2…ck 。

生 产 式 D TL
语 义 规 则 L.in:=T.type
T int T real L L1,id
L id
T.type=integer T.type:=real
相关文档
最新文档