综合属性和继承属性
sdt编译原理
sdt编译原理
SDT(Syntax-directed translation)是一种编译原理,用于在源代码的语法分析过程中将源代码转换为目标代码或其他形式的输出。
SDT的核心思想是将翻译操作与语法规则相结合,使得翻译过程与语法分析过程同步进行。
在SDT中,每个语法规则都与一个或多个动作相关联,这些动作定义了在语法分析过程中需要执行的操作。
这些动作可以是计算、赋值、控制流语句等,用于生成目标代码或实施语义动作。
在执行这些动作时,SDT使用语法树作为中间表示的数据结构。
SDT的编译过程可以分为以下几个步骤:
1. 词法分析:将源代码分解为词法单元(token)序列。
2. 语法分析:根据定义的文法规则将词法单元序列组织成语法树。
3. 属性计算:在语法分析的同时,执行与语法规则相关联的动作,进行属性计算。
4. 目标代码生成:根据属性计算的结果,生成目标代码或其他形式的输出。
在SDT中,属性是与语法树节点关联的值,可以是终结符或非终结符的一些特征信息,比如类型、值、地址等。
属性可以在语法规则中被引用和修改。
属性的计算是通过语法规则中的继承和综合属性描述来进行的。
继承属性是从父节点向子节点传递的属性,综合属性是从子节
点向父节点传递的属性。
继承属性和综合属性的定义和计算规则由语法规则中的动作来指定。
属性的计算过程通常是采用自上而下递归的方式进行的。
总的来说,SDT是一种使用语法规则和动作相结合的方法,将语法分析与语义动作、属性计算、目标代码生成等操作同步进行,实现源代码到目标代码的转换。
编译原理 第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) 上下文无关文法和属性/规则的结合;
属性文法和语法制导翻译
id1
如果一属性文法不存在属性 之间的循环依赖关系,那么 称该文法为良定义的
T type
5 in L
4
real
7 in L y 8 ,
y6 id3 entry 3
9 in L y 10 ,
id2 entry 2
id1 entry 1
属性的计算顺序
无环有向图的拓扑排序
无环有向图中节点m1,m2,…,mk的拓扑排序是:若 mi→mj是从mi到mj的边,那么在此排序中mi先于mj 依赖图的任何拓扑排序都给出了一个分析树中各节点 语义规则计算的正确顺序,即在计算f之前,语义规则
real id1,id2,id3
语法制导翻译
基于属性文法的处理过程通常是:
对符号串进行语法分析,
构造语法分析树
根据需要遍历语法树并在语法树的各结点处按语义规 则进行计算。
这种由源程序的语法结构驱动的处理办法就是语法制 导翻译法。
在某些情况下,在进行语法分析的同时完成语义规则
的计算而无须明显地构造语法树或构造属性之间的依
real L.in=real ,
id3
L.in=real ,
id2
id1
产生式 D→TL T→int T→real L→L1 , id
L→id
语义规则 L.in := T.type T.type := integer T.type := real L1.in := L.in addtype(id.entry, L.in) addtype(id.entry, L.in)
为每个包括过程调用的语义规则引入一个虚综合属性b,把每条 语义规则都变成b=f(c1,c2,...,ck)的形式 依赖图的每个结点表示一个属性 边表示属性间的依赖关系。如果属性b依赖于属性c,那么从c到 b就有一条有向边
第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本身的属性值来定义
两个概念
将语义规则同语法规则(产生式)联系起来要 涉及两个概念
编译原理试题
中间语言与语法制导翻译重点与难点重点:语法制导翻译的基本思想,属性文法,翻译模式,说明语句的翻译方案。
三地址码,各种语句的目标代码结构、属性文法与翻译模式。
难点:属性的意义,对综合属性,继承属性,固有属性的理解,属性计算,怎么通过属性来表达翻译。
布尔表达式的翻译,对各种语句的目标代码结构、属性文法与翻译模式的理解。
基本要求掌握语法制导翻译的基本思想,属性文法,综合属性,继承属性,固有属性,属性计算,S_属性文法,L_属性文法,说明语句的翻译方案,翻译模式、属性文法的实现掌握中间语言与语义分析的基本概念;熟练掌握语法(结构)树、三地址代码、赋值与控制语句的翻译、说明语句的翻译;掌握组合数据说明的翻译、过程调用翻译。
例题解析例1 给定文法 E --> T { R.i := T.p }R { E.p := R.s }R --> addopT { R1.i := mknode( addop.val, R.i, T.p ) }R { R.s := R1.s }R --> { R.s := R1.s }T --> ( E ) { T.p := E.p }T --> id { T.p := mkleaf( id, id.entry ) }T --> num { T.p := mkleaf( num, num.val ) }(1) 指出文法中的各非终结符具有哪些综合属性和哪些继承属性⑵画出按本翻译模式处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树【解】(1)E的综合属性 p,R的继承属性i,综合属性s;T的综合属性p(2) 处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树如下+(ID, a) +(NUM, 20) -( ID, b) (NUM, 10)例2 定义一个计算器的属性文法,完成一个输入表达式值的计算和显示, 【解】计算器的文法L → EE → E1 + T | TT → T1 * F | FF → ( E ) | digit引进属性val,计算器的属性文法:L → E print( E.val )(L的虚属性)E → E1 + T E.val := E1.val + T.valE → T E.val := T.valT → T1 * F T.val := T1.val * F.valT → F T.val := F.valF → ( E ) F.val := E.valF → digit F.val := digit.lexvallexval 是单词 digit 的属性例3给出对输入串6-3 3*5+4 的分析树与属性计算【解】3*5+4 的分析树与属性计算例4定义一个说明语句的属性文法【解】说明语句的文法D → T LT → intT → realL → L1,idL → id要解决的问题:记录标识符的类型和类型信息传递方法:引进属性type,和in,用T.type记录类型信息,并传给L.in,说明语句的属性文法如下:D → T L L.in := T.typeT → int T.type := ‘integer’T → real T.type := ‘real’L → L1,id L1.in := L.inaddtype( id.entry, L.in )L → id addtype( id.entry, L.in )entry 单词 id 的属性addtype 在符号表中为变量填加类型信息例5 给出输入串real id1,id2,id3 的分析树和属性计算例6 设下列文法生成变量的类型说明D → id LL → , id L | : TT → integer | real试构造一个翻译模式,把每个标识符的类型存入符号表。
第四章 程序语言的性质
1型文法—上下文有关文法
产生式的形式为: , 其中任意非终结符 串, 是终结符和非终结符的任意序列,但 中的符号个数应不多于的符号个数
从开始符开始导出的串的长度是递增的 在生成串时,需要使用固定数量的存储空间,例如 识别上下文无关文法无法识别的串ancnbn 上下文有关文法太复杂,很难用于程序设计语言 人们对上下文有关文法的很多特征还不太清楚
这是综合属性,包含程序中声明的名字集合。该属性 可以沿树向下传递,成为继承属性,用于正确地生成 数据的代码。
28
属性文法的使用
首先创建语法分析树。属性文法假设你已经知道表达 式是如何推导出来的,它并不关心是如何分析推导出 来的。 定义属性的函数可以是任意给定的,因此定义属性的 过程完全是手工完成的。 如果只有综合属性,并且文法是 LR(k),那么,属性 文法可以用来在语法分析时自动产程中间代码。 这就是 YACC 如何工作的,它利用属性文法来计算所 有非终结符的值。
25
属性文法
例:考虑算术表达式的简单文法。
E→T|E+T T→P|T×P P→I|(E)
其语义通过文法中非终结符间的关系集合定义。如: 下面函数生成该文法生成的任意表达式的值:
产生式 E→E+T E→ T T→T×P T→P P→ I P→(E) 属性 Value(E1)=V(E2)+V(T) V(E)=V(T) V(T1)=V(T2)×V(P) V(T)=V(P) V(P)=数I的值 V(P)=V(E)
如Hoare的公理语义。
22
语义建模(5)—规约模型
描述实现程序的各个函数的关系,只要 我们可以证明一个实现符合了所有的函 数间的关系,则称实现相对于规约是正 确的。 代数数据类型是形式规约的一种形式。
(完整word版)编译原理练习题
一章:1、编译程序各阶段都涉及。
A、词法分析B、表格管理C、语法分析D、语义分析2、下列哪个程序不是编译程序的组成部分?。
A、词法分析程序B、代码读入程序C、代码生成程序D、语法分析程序3、编译程序各阶段的工作往往是进行的。
A、顺序B、并行C、成批D、穿插4、词法分析所依据的是。
A、语义规则B、构词规则C、语法规则D、等价变换规则5、编译程序的语法分析器可以发现源程序中的。
A、语义错误B、语法和语义错误C、错误并校正D、语法错误6、高级语言源程序经编译后产生的程序是。
A、源程序B、目标程序C、函数D、过程1、扫描器的任务是从源程序中识别出一个个单词符号。
2、高级语言源程序有两种执行方式,即解释和编译。
判断:高级语言编写的源程序都必须通过编译,产生目标代码后才能运行。
多遍扫描的编译程序的多遍是指多次重复读源程序。
高级语言程序到低级语言程序的转换是基于语义的等价变换。
编译程序中错误处理的任务是对检查出的错误进行修改。
目标程序一定是机器语言程序。
连接装配程序可把经编译程序产生的目标程序变成可执行的机器语言程序。
简答题:1、请指出下列错误信息可能是编译的哪个阶段报告的?①else没有匹配的if;②数组下标越界;③使用的函数没有定义;④在数中出现了非数字信息。
答:①语法分析阶段②语义分析与中间代码生成阶段③语义分析与中间代码生成阶段④词法分析阶段2、何谓源程序、中间代码和目标代码?它们三者之间有何种关系?答:所谓源程序是指用某种高级语言编写的程序,它是编译程序的加工对象。
目标程序是指低级语言(机器语言或汇编语言)编写的程序,它是编译程序的加工结果。
中间代码是其结构介于源程序和目标程序之间的一种机内表示形式,它是编译程序产生的中间临时结果。
它们三者之间的关系是等价关系,即结构不同,但语义相同。
二章:1、文法G:S-xSx|y所识别的语言是。
A、xyx B 、(xyx)* C、x n yx n(n≥0) D、x*yx*2、设有文法G[S]=({S,B},{b},{S-b|bB,B-bS},S),该文法所描述的语言是。
第五章 语法制导翻译(1)
另一例 非L属性的语法制导定义
文法符号B的继承属性依赖于它右边文法符号C的 属性。
产生式 ABC
语义规则 A.s := B.b B.i := f(C.c, A.s)
编译原理
27
例5.10
编译原理
28
例5.10 简单类型声明的SDD
产 生 式 语 义 规 则
D TL
T int
id2 2 entry
编译原理
30
float id1, id2, id3的分析树的依赖图
D T 4 type float in 7 in 5 L 8
L 6
, id2 2 entry id3 3 entry
in 9
L 10
,
id1 1 entry
编译原理 31
float id1, id2, id3的注释分析树
(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); p5 p3 p1 + p4 id entryc p1, p2, ..., p5是指向结点 的指针,entrya和entryc 分别是指向符号表中标 识符a和c的指针。
编译原理
35
为表达式建立语法树的语法制导定义
产生式
EE1+T E E1-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.val)
编译原理考试知识点复习
第一章:编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。
解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码第三章:Chomsky对文法中的规则施加不同限制,将文法和语言分为四大类:0型文法(PSG)◊ 0型语言或短语结构语言文法G的每个产生式α→β中:若α∈V*VNV*, β∈(VN∪VT)* ,则G是0型文法,即短语结构文法。
1型文法(CSG)◊ 1型语言或上下文有关语言在0型文法的基础上:若产生式集合中所有|α|≤|β|,除S→ε(空串)外,则G是1型文法,即:上下文有关文法另一种定义:文法G的每一个产生式具有下列形式:αAδ→αβδ,其中α、δ∈V*,A∈VN,β∈V+;2型文法(CFG)◊ 2型语言或上下文无关语言文法G的每个产生式A→α,若A∈VN ,α∈(VN∪VT)*,则G是2型法,即:上下文无关文法。
3型文法(RG)◊ 3型语言或正则(正规)语言若A、B∈VN,a∈VT或ε,右线性文法:若产生式为A→aB或A→a左线性文法:若产生式为A→Ba或A→a都是3型文法(即:正规文法)最左(最右)推导在推导的任何一步α⇒β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换规范推导:即最右推导。
规范句型:由规范推导所得的句型。
句子的二义性(这里的二义性是指语法结构上的。
)文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。
文法的二义性一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。
编译原理知识点参考
第三章3.1 对于词法分析器的要求1.词法词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。
词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序。
2.程序语言的单词符号:关键字、标识符、常数、运算符、界符。
3.输出的单词符号的表示形式:(单词种别,单词自身的值)Eg:while (i>=j) i--;输出单词符号:< while, - >< (, - >< id, 指向i的符号表项的指针><>=, - >< id, 指向j的符号表项的指针>< ), - >< id, 指向i的符号表项的指针>< --, - >< ;, - >4.词法分析器作为一个独立子程序:结构简洁、清晰和条理化,有利于集中考虑词法分析一些枝节问题。
5.词法分析器3.2 词法分析器的设计1.词法分析器2.输入、预处理:输入串放在输入缓冲区中。
预处理子程序:剔除无用的空白、跳格、回车和换行等编辑性字符;区分标号区、捻接续行和给出句末符等扫描缓冲区(指向开始位置,向前搜索确定终点)3.单词符号的识别、超前搜索:(1)基本字识别Eg:DO99K=1,10 DO 99 K = 1,10IF(5.EQ.M)GOTO55 IF (5.EQ.M) GOTO 55DO99K=1.10IF(5)=55需要超前搜索才能确定哪些是基本字(2)标识符(3)常数(4)算符和界符4.状态转换图(有限方向图)<1>结点代表状态<2>状态之间用箭弧连结,箭弧上的标记(字符)代表射出结状态下可能出现的输入字符或字符类。
<3>一个状态转换图可用于识别(或接受)一定的字符串。
5.语法分析的状态转换图6.状态转换图的实现思想:每个状态结对应一小段程序。
编译技术_大连理工大学中国大学mooc课后章节答案期末考试题库2023年
编译技术_大连理工大学中国大学mooc课后章节答案期末考试题库2023年1.最多包含两个a的{a,b}上的语言()。
参考答案:b*(a|ε)b*(a|b*)b*2.描述文法符号的属性有哪两种()①L-属性②R-属性③综合属性④继承属性参考答案:③④3.在每一步归约中,一个子串和某个产生式的()匹配,然后用该产生式的()符号代替这个子串参考答案:右部,左部4.Yacc程序不包含下面的哪一部分()参考答案:定义5.词法分析程序的输出结果是()参考答案:单词的种别编码和单词属性值6.对于NFA和DFA模型说法错误的是参考答案:DFA与NFA的状态转换完全相同7.与(a|b)*(a|b)等价的正规式是()。
参考答案:(a|b)(a|b)*8.在规范归约中,用()来刻画可归约串。
参考答案:句柄9.过程的display表记录了()参考答案:过程的嵌套层次10.对于DFA模型,说法错误的是()。
参考答案:DFA从任何状态出发,对于任何输入符号,可有多个转换11.对于NFA和DFA模型说法错误的是()。
参考答案:DFA与NFA的状态转换完全相同12.有如图所示的有穷自动机,与之等价的正规式为()。
【图片】参考答案:(0|1)*(000|111)(0|1) *13.与(a|b)*等价的正规式是()。
参考答案:(a*|b*)*14.Chomsky把文法分为4种类型,其中描述能力最强的是()。
参考答案:0型15.下面文法()和正规表达式a*b描述的语言相同。
参考答案:S→b | aS16.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即()。
参考答案:单词17.词法分析器用于识别_____。
参考答案:单词18.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组()。
参考答案:产生式19.文法分为四种类型,即0型、1型、2型、3型。
其中2型文法是()参考答案:上下文无关文法20.文法分为四种类型,即0型、1型、2型、3型。
中间代码生成
计算机科学与工程学院课程设计报告题目全称:常用边缘算法的实现学生学号: 2506203010 姓名:王嘉指导老师:职称:指导老师评语:签字:课程设计成绩:编译器中间代码生成的研究与实现作者:王嘉学号:2506203010指导老师:吴洪摘要:在编译器的翻译流水线中,中间代码生成是处于核心地位的关键步骤。
它的实现基于语法分析器的框架,并为目标机器代码的实现提供依据。
虽然在理论上没有中间代码生成器的编译器也可以工作,但这将会带来编译器的高复杂度,低稳定性和难移植性。
现代编译理论不仅要求中间代码的生成,还要求基于中间代码的优化。
本文研究并实现了一个轻量级类C语言的中间代码生成器,并就中间代码生成的原理进行了细致的阐述。
关键字:中间代码生成、语法制导翻译、翻译模式、语法树、三地址码一、目的及意义在编译器的分析综合模型中,前端将源程序翻译成一种中间表示,后端根据这个中间表示生成目标代码。
目标语言的细节要尽可能限制在后端。
尽管源程序可以直接翻译成目标语言,但使用与机器无关的中间形式具有以下优点:1.重置目标比较容易:不同机器上的编译器可以在已有前端的基础上附近一个适合这台新机器的后端来生成。
2.可以在中间表示上应用与机器无关的代码优化器。
本文介绍如何使用语法制导方法,基于一种轻量级的类C语言FineC的词法分析器和语法分析器,一遍地将源程序翻译成中间形式的编程语言结构,如声明、赋值及控制流语句。
为简单起见,我们假定源程序已经经过一遍扫描,生成了相应的词法记号流和符号表、词素表结构。
基于FineC语法标准的语法分析器框架也已经能够正常工作。
我们的任务就是补充这个框架,使其在语法分析的过程中生成相应的中间代码,并将必要的变量和函数声明存放在一个符号表链中。
二、目标语言词法和语法标准:这里定义一个编程语言称作FineC(“fine”指代轻量、精妙)。
它是一种适合编译器设计方案的语言。
本质上是C语言的一个限制了数据类型、算术操作、控制结构和处理效率的轻量子集。
《编译原理课程教案》第5章:中间代码生成
例: 综合属性的计算
Eval:=19 +
L
n
Tval:=4
Eval:=15
Tval:=15
Tval:=3 Fval:=3 *
Fval:=4 Fval:=5
digitlexval:=4
0.L→En 1.E→E1+T 2.E→T 3.T→T1*F 4.T→F 5.F→(E) 6.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
练习
• 求 -B+C*D 的逆波兰表示形式、三元式和 四元式
逆波兰:B – C D * + 三元式: (1) (-,B,) (2) (*,C,D) (3) (+,(1),(2)) 四元式: (1) (-,B, , t1) (2) (*,C,D,t2) (3) (+,t1,t2,t3)
到目前为止,已知 输入的语法单位, 又知道 要翻译的结果的形式, 翻译的方法是什么?
5+4# +4# +4#
#T*F #T# #E
F i
0. T L→En T*F
i s5
8+ 9
s6 r2 10 r4
s5 s5 s5
11
acc r2 #E+ r2 r4 r4 r6 r6
GOTO -15 E T F 1 -15 2 3
-158
#E+4 #E+F
r1 #E r3 r5
-15-2 -15-4 -19
构造语法树; 根据需要遍历语法树; 在语法树的各结点处按语义规则进行计算。
编译原理试题
中间语言与语法制导翻译重点与难点重点:语法制导翻译的基本思想,属性文法,翻译模式,说明语句的翻译方案。
三地址码,各种语句的目标代码结构、属性文法与翻译模式。
难点:属性的意义,对综合属性,继承属性,固有属性的理解,属性计算,怎么通过属性来表达翻译。
布尔表达式的翻译,对各种语句的目标代码结构、属性文法与翻译模式的理解。
基本要求掌握语法制导翻译的基本思想,属性文法,综合属性,继承属性,固有属性,属性计算,S_属性文法,L_属性文法,说明语句的翻译方案,翻译模式、属性文法的实现掌握中间语言与语义分析的基本概念;熟练掌握语法(结构)树、三地址代码、赋值与控制语句的翻译、说明语句的翻译;掌握组合数据说明的翻译、过程调用翻译。
例题解析例1 给定文法 E --> T { R.i := T.p }R { E.p := R.s }R --> addopT { R1.i := mknode( addop.val, R.i, T.p ) }R { R.s := R1.s }R --> { R.s := R1.s }T --> ( E ) { T.p := E.p }T --> id { T.p := mkleaf( id, id.entry ) }T --> num { T.p := mkleaf( num, num.val ) }(1) 指出文法中的各非终结符具有哪些综合属性和哪些继承属性⑵画出按本翻译模式处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树【解】(1)E的综合属性 p,R的继承属性i,综合属性s;T的综合属性p(2) 处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树如下+(ID, a) +(NUM, 20) -( ID, b) (NUM, 10)例2 定义一个计算器的属性文法,完成一个输入表达式值的计算和显示,【解】计算器的文法L → EE → E1 + T | TT → T1 * F | FF → ( E ) | digit引进属性val,计算器的属性文法:L → E print( E.val )(L的虚属性)E → E1 + T E.val := E1.val + T.valE → T E.val := T.valT → T1 * F T.val := T1.val * F.valT → F T.val := F.valF → ( E ) F.val := E.valF → digit F.val := digit.lexvallexval 是单词 digit 的属性例3给出对输入串6-3 3*5+4 的分析树与属性计算【解】3*5+4 的分析树与属性计算例4定义一个说明语句的属性文法【解】说明语句的文法D → T LT → intT → realL → L1,idL → id要解决的问题:记录标识符的类型和类型信息传递方法:引进属性type,和in,用T.type记录类型信息,并传给L.in, 说明语句的属性文法如下:D → T L L.in := T.typeT → int T.type := ‘integer’T → real T.type := ‘real’L → L1,id L1.in := L.inaddtype( id.entry, L.in ) L → id addtype( id.entry, L.in )entry 单词 id 的属性addtype 在符号表中为变量填加类型信息例5 给出输入串real id1,id2,id3 的分析树和属性计算例6 设下列文法生成变量的类型说明D → id LL → , id L | : TT → integer | real试构造一个翻译模式,把每个标识符的类型存入符号表。
编译原理 第4章 new1语义分析和中间代码生成
(3) E→(E(1))
(4) E→i
val[TOP]= val[TOP+1]
val[TOP]=lexval (注:lexval为i的整型内 部值)
文法的LR分析表见表3.20。
第4章 语义分析和中间代码生成
扩充分析栈工作的总控程序功能,使其在完成语法 分析的同时也能完成语义分析工作(这时的语法分析栈 已成为语义分析栈);即在用某一个规则进行归约之后, 调用相应的语义子程序完成与所用产生式相应的语义动 作,并将每次工作后的语义值保存在扩充后的“语义值” 栈中。
语义规则的左部符号E、T、F等的属性值的计算由其
各自相应的右部符号决定,这种属性也称为综合属性。 与产生式S→E关联的语义规则是一个函数print(E.val), 其功能是打印E产生式的值。S在语义规则中没有出现, 可以理解为其属性是一个虚属性。
第4章 语义分析和中间代码生成 简单变量类型说明的文法G[D]如下:
(2) 控制流检查,用以保证控制语句有合法的转向点。如C 语言中不允许goto语句转入case语句流;break语句需寻找包含它 的最小switch、while或for语句方可找到转向点,否则出错。 (3) 一致性检查,如在相同作用域中标识符只能说明一次、 case语句的标号不能相同等。
第4章 语义分析和中间代码生成
同,因此很容易将其翻译成四元式形式。
第4章 语义分析和中间代码生成
考虑以下文法G[A]:A→i=E
E→E+E∣E*E∣−E∣(E)∣i 在此,非终结符A代表“赋值句”。 为了实现由表达式到四元式的翻译,需要给文法 加上语义子程序,以便在进行归约的同时执行对应的
语义子程序。
第4章 语义分析和中间代码生成
第4章 语义分析和中间代码生成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第17页
编译原理
属性文法和语法制导翻译
for 语法树中每一结点n do for 结点n的文法符号的每一个属性a do 为a在依赖图中建立一个结点;
for 语法树中每一个结点n do for 结点n所用产生式对应的每一个语义规则 b:=f(c1,c2,…,ck) do for i:=1 to k do 从ci结点到b结点构造一条有向边;
编译原理
属性文法和语法制导翻译
介绍有关语义分析及翻译的问题。
语义描述和语义处理的方法主要是属性文法和语 法制导翻译方法。
本章中,将首先介绍属性文法的基本概念,然后 介绍基于属性文法的处理方法,讨论如何在自上 而下分析和自下而上分析中实现属性的计算。
第1页
编译原理
本章内容概要
属性文法
综合属性 继承属性
属性文法和语法制导翻译
第13页
编译原理
句子real id1,id2,id3的带注释的语法树。
属性文法和语法制导翻译
第14页
编译原理
属性文法和语于属性文法的处理过程通常是:
对单词符号串进行语法分析,构造语法分析树, 然后根据需要遍历语法树并在语法树的各结点处 按语义规则进行计算。
第4页
编译原理
属性文法和语法制导翻译
属性通常分为两类:
综合属性和继承属性。
综合属性用于“自下而上”传递信息,而继承属性用于“自上 而下”传递信息。
在一个属性文法中,对应于每个产生式A→α都有一套与之相 关联的语义规则,每条规则的形式为
b:=f(c1,c2,…,ck)这里,f是一个函数,而且或者 (1)b是A的一个综合属性并且c1,c2,…,ck 是产生式右边
第10页
编译原理
属性文法和语法制导翻译
第11页
编译原理
属性文法和语法制导翻译
继承属性
在语法树中,一个结点的继承属性由此结点的父结点 和/或兄弟结点的某些属性确定。 用继承属性来表示程序设计语言结构中的上下文依赖 关系很方便。在下面的例子中,继承属性在说明中为 各种标识符提供类型信息。
第12页
编译原理
第18页
编译原理
属性文法和语法制导翻译
第19页
编译原理
属性文法和语法制导翻译
属性的计算次序
一个有向非循环图的拓扑序是图中结点的任何顺序 m1,m2,…mk,使得边必须是从序列中前面的结点指向 后面的结点。
如果mi→mj是mi到mj的一条边,那么在序列中mi必 须出现在mj之前。
第20页
编译原理
对出现在产生式右边的继承属性和出现在产生式左边的综 合属性都必须提供一个计算规则。
属性计算规则中只能使用相应产生式中的文法符号的属性, 这有助于在产生式范围内“封装”属性的依赖性。然而, 出现在产生式左边的继承属性和出现在产生式右边的综合 属性不由所给的产生式的属性计算规则进行计算,它们由 其它产生式的属性规则计算或者由属性计算器的参数提供。
文法符号的属性;或者
(2) b是产生式右边某个文法符号的一个继承属性并且c1, c2,…,ck 是A或产生式右边任何文法符号的属性。
在两种情况下,我们都说属性b依赖于属性 c1,c2,…,ck
第5页
编译原理
属性文法和语法制导翻译
(1)终结符只有综合属性,它们由词法分析器提供;
(2)非终结符既可有综合属性也可有继承属性,文法开始符 号的所有继承属性作为属性计算前的初始值。
属性文法和语法制导翻译
一个依赖图的任何拓扑排序都给出一个语法树中结点的语 义规则计算的有效顺序。
第6页
编译原理
属性文法和语法制导翻译
语义规则所描述的工作可以包括属性计算、静态语义检查、 符号表操作、代码生成等等。
第7页
编译原理
属性文法和语法制导翻译
例如,考虑非终结符A,B和C,其中,A有一个继承 属性a和一个综合属性b,B有综合属性c,C有继承 属性d。产生式A→BC可能有规则
C .d:=B.c+1
基于属性文法的处理方法 依赖图 属性的计算次序 树遍历的属性计算方法 一遍扫描的处理方法 抽象语法树 S-属性文法的自下而上计算 分析栈中的综合属性
第2页
属性文法和语法制导翻译
编译原理
L属性文法和自顶向下翻译
翻译模式 自顶向下翻译 递归下降翻译器的设计
自下而上计算继承属性
从翻译模式中去掉嵌入在产生式中间的动作 分析栈中的继承属性 模拟继承属性的计算 用综合属性代替继承属性
属性文法和语法制导翻译
第3页
编译原理
属性文法和语法制导翻译
属性文法
属性翻译文法是在上下文无关文法的基础上,为每个 文法符号(终结符或非终结符)配备若干相关的“值” (称为属性)。 这些属性代表与文法符号相关信息,例如它的类型、 值、代码序列、符号表内容等等。 属性与变量一样,可以进行计算和传递。 属性加工的过程即是语义处理的过程。对于文法的每 个产生式都配备了一组属性的计算规则,称为语义规 则。
第16页
编译原理
属性文法和语法制导翻译
在为一棵语法树构造依赖图以前,我们为每一个包含过 程调用的语义规则引入一个虚综合属性b,这样把每一 个语义规则都写成
b:=f( c1,c2,…,ck)
的形式。依赖图中为每一个属性设置一个结点,如果属 性b依赖于属性c,则从属性c的结点有一条有向边连到 属性b的结点。更详细地说,对于给定的一棵语法分析 树、依赖图是按下面步骤构造出来的:
A .b:=A.a+B.c
而属性A .a和B.c在其它地方计算。
第8页
编译原理
属性文法和语法制导翻译
第9页
编译原理
属性文法和语法制导翻译
综合属性
在语法树中,一个结点的综合属性的值由其子结点的 属性值确定。因此,通常使用自底向上的方法在每一 个结点处使用语义规则计算综合属性的值。仅仅使用 综合属性的属性文法称S-属性文法
这种由源程序的语法结构所驱动的处理办法就是 语法制导翻译法。
语义规则的计算可能产生代码、在符号表中存放 信息、给出错误信息或执行任何其他动作。对输 入符号串的翻译也就是根据语义规则进行计算的 结果。
输入串→ 语法树→ 依赖图→ 语义计算次序
第15页
编译原理
属性文法和语法制导翻译
依赖图
如果在一棵语法树中一个结点的属性b依赖于属性c,那 么这个结点处计算b的语义规则必须在确定c的语义规则 之后使用。 在一棵语法树中的结点的继承属性和综合属性之间的相 互依赖关系可以由称作依赖图的一个有向图来描述。