基于属性文法的处理方法、S-属性文法(1)
L-属性文法和自顶向下翻译(1)
8
翻译模式示例:把带加号和减号的中缀表
达式翻译成相应的后缀表达式
E→TR
R→addop T {print(addop.lexeme)} R1 | T→num {print(num.val)}
E
例:9-5+2
T
R
9 {print(‘9’)} -
T {print(‘-’)} R
15
产生式 语义规则
S→B
B.ps :=10
翻译模式
B→B1B2
S.ht :=B.ht B1.ps :=B.ps
B2.ps :=B.ps
S → {B.ps:=10} B {S.ht:=B.ht}
B.ht := max(B1.ht, B2.ht)
B→B1 sub B2 B1.ps :=B.ps B2.ps :=shrink(B.ps)
编译原理
第六章 属性文法和语法制导翻译
1
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
2
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
3
3. 产生式左边非终结符的综合属性只有在它所引用 的所有属性都计算出来以后才能计算。计算这种 属性的动作通常可放在产生式右端的末尾
S → A1A2 A→a
{A1.in:=1; A2.in:=2} {print(A.in)}
12
排版软件 TeX、LaTeX
The quadratic formula is b b2 4ac 2a
文法符号及其语义属性
19
3*5+4n的带注释的语法树
L
E.val=19 n
E.val=15 + T.val=4
T.val=15
F.val=4
T.val=3 * F.val=5 digit.lexval=4
F.val=3 digit.lexval=5
digit.lexval=3
返回
20
6.1 属性文法
二、基本规则
1. 语义规则的形式:
产生式Aα的语义规则的形式为b:=f(c1,c2,…,ck)
其中:(1) f是一个函数;通常以表达式的形式出现
b有 (2) 或者b—A的综合属性,且c1,c2,…,ck是α中文法
两种 可能
符号的属性;
(3) 或者b—α中某个文法符号的继承属性, 且c1,c2,…,ck是A或α中任何文法符号的属性.
• 方法:对文法中的每个产生式都附加一个语义动作或语义子程 序,在语法分析过程中,每当需要使用一个产生式进行推导或 归约,语法分析程序除执行相应的语法分析动作外,还要执 行相应的语义动作或调用相应的语义子程序。
引言(续)
• 这种模式既把语法分析与语义处理分开,又令其平行地进 行,让其在同一遍扫描中同时完成语法分析和语义处理两 项工作。
例6.7: 例6.4中
L→L1, id L1.in :=L.in
D
addtype(id.entry, L.in)
L→id addtype(id.entry, L.in)
语法分
析树的 T 4
依赖图
type
5 L 6 - addtype(id.entry, L.in) in
real 7 L 8 addty,pe in
综合属性和继承属性
第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页
编译原理
西理工编译原理试题集1-7
01-普通作业一(第一章)一、选择题(从备选项中选出一个或多个正确答案)。
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. 词组二、判断题(对于下列陈述中正确的说法选择回答“对”,否则选择回答“错”)。
1. 编译程序是一种常见的应用软件。
2. C语言的编译程序可以用C语言编写。
3. 编译方式与解释方式的区别之一在于是否生成目标程序。
4. 中间代码生成是编译程序不可或缺的部分。
5. 含有优化的编译程序执行效率高。
三、解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍四、一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
五、何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系?参考答案:一、选择题1. D2. A3. AC4. C5. B二、判断题1.错2.对3.对4.错5.错三、(1)把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言书写的目标程序的翻译程序。
(2)源程序,是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的文本文件。
(3)为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名。
(4)编译程序的前端通常指:词法分析、语法分析、语义分析等生成最终代码以前的一系列步骤。
第5章 属性文法与语义分析
• 属性文法的基本思想
目是将语言结构的语义以属性(attribute)的形式赋予代表此结构 的文法符号,而属性的计算以语义规则(semantic rules)的形 式赋予由文法符号组成的产生式。在进行语法分析推导或归约的 同时通过语义规则实现对属性的计算,以达到对语义的处理。
5.2.1 名字的作用域
程序设计语言范围的划分可以有两种不同的方式,并列 的和嵌套的。例如,Pascal语言的过程定义可以是嵌套的,即 一个过程内部可以再定义另一个过程;而C/C++语言的过程 只能是并列的,即过程中不能再定义过程。但是C/C++允许 程序块(block)嵌套,每个程序块的范围以{ }界定, { }内 可以再嵌套{ } 。
例:下述源程序说明了C的程序块符合上述作用域规则。
main( )
{ int a=0; int b=0;
/* 最外层,不妨定为B0层 */
{ int b=1;
/* B1层,被B0嵌套 */
{ int a=2; int c=4; int d=5; /* B2层,被B1嵌套 */ printf("%d %d\n",a,b);
当从某个作用域退出时,从栈顶把该作用域的所有名字全 部摘走,存放在一个不活动的临时表中,以备后用。例如, 当分析从B2退出并进入B3时,则把栈顶条目a=2摘走,而将 条目b=3加入。这种临时摘走的方式也称为临时删除或假删除 ,只有确认某名字永远不会再被使用,才被真正删除。
设符号表中有n个条目,那么成功查找的平均时间复杂度是 n/2,不成功查找的时间复杂度是n+1。因此,在符号表中插 入n个名字和完成e次查找的时间复杂度应该是n(n+e)。当n和e 很大时,在线性表上进行查找的效率显然很低。
编译原理习题课(3)
四元式序列: (1) + (2) (3) + (4) * (5) + (6) + (7) -
a b T1 T1 - T2 c d T3 T2 T3 T4 a b T5 T5 c T6 T4 T6 T7
23
赋值语句的翻译
简单算术表达式及赋值语句 数组元素的引用 产生有关类型转换的指令
24
P218-4. 按7.3节所说的办法,写出下面赋值句
L→En print(E.val)
E→E1+T E.val := E1.val+T.val
E→T
E.val :=T.val
T→T1*F T.val :=T1.val* F.val
T→F
T.val :=F.val
F→ (E) F.val :=E.val
F→digit F.val :=digit.lexval
5
digit.lexval=4
E → T { R.i:=T.val } R { E.val:=R.s }
P164-2. 对表达式((a)+(b))R:→ +
(的1)抽按象照语表法6树.4所;示的属性文R 法→ TR构- 1{ {造RR1..该i:s=:=R表.Ri+1达T.s.v式}al }
(式2)的按抽照象图语6法.17树所。示的翻译R模→式TR1,{{ RR构1.s.i::=造=R{RR.该.ii-.}sT表:.=vaR达l }1.s }
综合属性:“自下而上”传递信息 继承属性性文法的处理方法
依赖图 树遍历 一遍扫描
L-属性文法适合于一遍扫描的自上而下分析 S-属性文法适合于一遍扫描的自下而上分析
4
L
P164–1按照表6.1所
编译原理_国防科技大学中国大学mooc课后章节答案期末考试题库2023年
编译原理_国防科技大学中国大学mooc课后章节答案期末考试题库2023年1.对于文法G(S'),该文法识别活前缀的DFA如下图,状态I5包含的项目有G(S'):(0) S' → S(1) S → iSeS(2) S → iS(3) S → a【图片】答案:S → iSeŸS_S → ŸiSeS_S → ŸiS_S → Ÿa2.(a+b)/(c-d)对应的逆波兰式(后缀式)是答案:ab+cd-/3.表达式(a+b)/c-(a+b)*d对应的间接三元式表示如下,其中三元式表中第(3)号三元式应为间接码表三元式表(1) OP ARG1 ARG2 (2) (1) + a b (1) (2) / (1)c (3) (3) (4) (4) - (2) (3)答案:( *, (1), d)4.设AS 为文法的综合属性集, AI 为继承属性集, 则对于下面的属性文法G(P)定义中,AS和AI正确描述是产生式语义规则P → xQR Q.b:=R.d R.c:=1R.e:=Q.a Q → u Q.a:=3 R → v R.d:=R.c R.f:=R.e答案:AS={ Q.a, R.d, R.f } AI={ Q.b, R.c, R.e }5.考虑下面的属性文法G(S)【图片】过程enter(name, type)用来把名字name填入到符号表中,并给出此名字的类型type。
按照该属性文法,关于语句【图片】 , 【图片】 , 【图片】:integr的语义描述准确的是答案:说明 , , 是integer变量,把 , , 三个名字填入符号表中,并在类型栏中填上integer6.考虑下面的属性文法G(S)【图片】对于输入字符串abc进行自下而上的语法分析和属性计算,设S.u的初始值为5,属性计算完成后,S.v的值为答案:187.关于属性文法,下列说法中正确的是答案:属性文法是对上下文无关文法的扩展。
属性文法和语法制导翻译
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就有一条有向边
编译原理习题及答案
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个输入符号就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成从而也就可以确定当前所应采取的分析动作移进还是按某一产生式进行归约等
15春西交《编译原理》在线作业 答案
西交《编译原理》在线作业
一、单选题(共30 道试题,共60 分。
)
1. 自上而下分析面临的四个问题中,不包括( )
A. 需消除左递归;
B. 存在回朔;
C. 虚假匹配;
D. 寻找可归约串
正确答案:D
2. __________不是编译程序的组成部分。
A. 词法分析程序
B. 代码生成程序
C. 设备管理程序
D. 语法分析程序
正确答案:C
3. 文法开始符号的所有________作为属性计算前的初始值。
A. 综合属性
B. 继承属性
C. 继承属性和综合属性
D. 都不是
正确答案:B
4. 编译程序使用_______区别标识符的作用域。
A. 说明标识符的过程或函数名;
B. 说明标识符的过程或函数的静态层次;
C. 说明标识符的过程或函数的动态层次;
D. 标识符的行号;
正确答案:B
5. 两个不同过程的活动,其生存期是________。
A. 重叠的,不嵌套的;
B. 不重叠的,嵌套的;
C. 重叠的,嵌套的;
D. 不重叠的,不嵌套的;
正确答案:B
6. LR语法分析栈中存放的状态是识别_______的DFA状态。
A. 前缀;
B. 可归前缀;
C. 项目;。
编译原理6-3-S-属性文法.
+4n T*5
+4n T*F +4n T +4n E 4n E+ n E+4 n E+F
3-5
3-5 15 15 15- 15-4 15-4 F dight F dight T T*F E T
val [ntop ] := val [top 1]
n E+T
n E En L
第六章 属性文法和语法制导翻译
6.1 6.2 6.3 6.4 6.5 属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译 自下而上计算继承属性
6.3 S-属性文法的自下而上计算
综合属性 可以在分析输入符号串的同时由自下而上的 分析器来计算。 S-属性文法的翻译器通常可借助于LR分析器实现。 在对输入串进行语法分析的同时对属性进行计算。
TF
F (E) F digit
注:
ntop: 新的栈顶指针 ntop = top r +1 , r 产生式右边长度 如 F (E) 应为 val [top - 2 ] := val [top 1]
表6.6 翻译输入3*5+4n所作的动作
产 生 式 LEn 代 码 段 print (val [ top] ) 输入 State Val - 用到的产生式 3*5+4n -
15-4 T F
19 19- 19 L En E E+T
分析栈中的综合属性
假设语义规则 A. a := f( X.x, Y.y, Z.z) 对应于产生式 A→XYZ 假设综合属性是刚好在每次 归约前计算的
state val
编译原理第7章 语法制导翻译和中间代码生成
• 检查静态语义 • 生成中间代码/目标代码
语义处理
语义处理的环境:符号表 • 为语义分析提供类型、作用域等信息。 • 为代码生成提供类型、作用域、存储类别、
存储(相对)位置等信息。
语义处理
PL/0编译程序的语义处理(一)call语句的处理
if sym = callsym
then
源语言程序
词法分析
前
语法分析
端
处理Biblioteka 语义分析语 义 处 理
后 端
代码生成
处
理
汇编代码
语义处理
语义处理的任务: • 静态语义检查
• 静态语义:语法规则的良形式条件 • 静态语义检查:审查静态语义
• 动态语义处理
• 动态语义:程序单元执行的操作 • 动态语义处理:生成(中间/目标)代码
语义处理
语义处理的实现: • 属性文法:描述语义规则。 • 语法制导翻译:在语法分析的同时,执行
类型的基本概念
声明和定义,使用: • 声明:
• 程序通过声明语句把标识符的名称、类型和 作用域等信息传递给编译器。
• 声明语句本身传递名字和类型信息,声明语 句的位置传递作用域信息。
• 定义:
• 变量、类的声明就是定义。 • 函数可以先声明一个原型,在定义中再给出
实现的代码。
类型的基本概念
强类型语言和弱类型语言: • 强类型语言
第七章语法制导翻译和中间代码生成
7.1语义处理概述 7.2属性文法和语法制导翻译 7.3 中间代码生成(一些语句的翻译) 7.4符号表
7.1 语义处理(语义分析和中间代码生成)
在编译中的逻辑阶段
源语言程序
词法分析
中南大学《编译原理》课程作业(在线作业)二及参考答案
(一) 单选题1. 已知文法G[S]及相应翻译方案S→aAb {print “1”} S→a {print “2”} A→AS{print “3”} A→c {print “4”} 输入acab,输出是()。
(A)4231 (B) 3214 (C) 1234 (D) 3421参考答案:(A)2.a:=(b+c)*e+(b+c)/f的逆波兰式是()。
(A)abc*e+bc+f/+:=(B)abc+e*bc+f/+:=(C)abc+e*b+c+f/:=(D)abc+eb*c+f/+:=参考答案:(B)3. 规范归约也称为()。
(A)最上归约(B) 最左归约(C) 最下归约(D) 最右归约参考答案:(B)4. 规范归约使用进行()归约。
(A)句柄(B) 最左素短语(C) 最右素短语(D) 素短语参考答案:(A)5. 素短语是指这样一个短语,()含有一个终结符,并且,除它自身外不再含任何更小的素短语。
(A)至多(B) 只(C) 至少(D) 不参考答案:(C)6. 表达式(a+b)*(c+d)后缀式为()。
(A)abcd++*(B)abcd*++(C)ab*cd++(D)ab+cd+*参考答案:(D)7. 在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定称为()。
(A)继承属性(B)一致属性(C)原子属性(D)综合属性参考答案:(A)8. 在形式语言中,()常被称为规范推导。
(A)最上推导(B) 最左推导(C) 最下推导(D) 最右推导参考答案:(D)9. 自下而上分析的中心问题是()。
(A)判断栈中符号可约性,以及如何归约(B) 判断栈底符号可约性,以及如何归约(C) 判断栈顶符号可约性,以及如何归约(D) 判断栈外符号可约性,以及如何归约参考答案:(C)10. 属性文法的属性分为()两类。
(A)综合属性和继承属性(B)一致属性和继承属性(C)原子属性和继承属性(D)综合属性和传递属性参考答案:(A)11. 对于文法的每个产生式都配备了一组属性的计算规则,称为()。
编译原理作业集-第六章-修订(精选.)
第六章属性文法和语法制导翻译本章要点1. 属性文法,基于属性文法的处理方法;2. S-属性文法的自下而上计算;3. L-属性文法的自顶向下翻译;4. 自下而上计算继承属性;本章目标掌握和理解属性方法、基于属性文法的处理方法、S-属性文法和自下而上计算、L-属性文法和自顶向下翻译、自下而上计算继承属性等内容。
本章重点1.语法制导翻译基本思想。
2.语义规则的两种描述方法:语法制导的定义和翻译方案。
语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则(或叫语义动作)的计算次序和位置。
3.基于属性文法的处理方法,综合属性定义(S属性定义)和L属性定义。
4.设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点。
这种设计可看成是一种程序设计,是一种事件驱动形式的程序设计,因此它比一般的编程要难得多。
这里的事件是句子中各种语法结构的识别。
5.语义规则的三种计算方法:分析树方法、基于规则的方法和忽略规则的方法。
6.S属性的自下而上计算(边语法分析边属性计算,忽略规则的方法)。
7.L属性的自上而下计算(边语法分析边属性计算,忽略规则的方法)。
8.递归计算(先语法分析后属性计算,基于规则的方法)。
本章难点1. 设计简单问题的语法制导定义和翻译方案;作业题一、单项选择题:1. 文法开始符号的所有________作为属性计算前的初始值。
a. 综合属性b. 继承属性c. 继承属性和综合属性d. 都不是2. 对应于产生式A→XY继承属性Y.y的属性计算,可能正确的语义规则是________。
a. A.a:=f(X.x,Y.y);b. )Y.y:=f(A.a,Y.y);c. Y.y:=f(X.x);d. A.a:=f(Y.y);3. 描述文法符号语义的属性有两种,一种称为__ __,另一种称为__ ___。
a. L-属性b. R-属性c. 综合属性d. 继承属性4. 出现在产生式________和出现在产生式________不由所给的产生式的属性计算规则进行计算,而是由其他产生式的属性规则计算或者由属性计算器的参数提供。
编译原理6-1-属性文法
表6.1 一个简单台式计算器的属性文法
属性的计算
产 生 式 换行符 语 义 规 则
规则
LEn
print (E.val) L的虚属性
E E1 + T
E.val := E1 .val + T.val
ET
E.val := T.val
T T1 * F
T.val := T1.val * F.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;
addtype (id.entry,L.in ) L id addtype (id.entry,L.in )
第六章 属性文法和语法制导翻译
6.1 属性文法 6.2 基于属性文法的处理方法 6.3 S-属性文法的自下而上计算 6.4 L-属性文法和自顶向下翻译 6.5 自下而上计算继承属性
语义分析
静态语义分析 类型检查、控制流检查 、一致性检查 名字的作用域分析
动态语义分析 栈溢出 数组越界 a[i]
综合属性
A
B
C
S-属性文法
仅仅使用综合属性的属性文法称 S-属性文法 在语法树中,一个结点的综合属性的值由其
子结点的属性值确定。 通常使用自底向上的方法在每一个结点处使用
语义规则计算综合属性的值。
☆ 表6.1 一个简单台式计算器的属性文法
带注释的语法树
(结点带有语义信息 )
8+5*2n
第6章 属性文法及语法制导翻译 (编译原理 陈火旺)讲诉
(1) 终结符只有综合属性,它由词法分析器提供
属性文法的说明(1)
P136
例如 digit.lexval 表示单词符号“数”的词法值 id.entry 表示单词符号“标识符”的符号表入口
(2) 非终结符既可以有综合属性也可以有继承 属性,在属性文法的语义规则中计算 (3) 关于属性计算的规定
A
A X1X2…Xn b:=f(c1,c2,…,ck)
A.b
带注释的 语法树
14
X1 X2 … Xn
X1.c1 X2 .c2 … Xn . ck
两种属性:继承属性
• 继承属性用于“自上而下”传递信息。 • 继承属性:在语法树中,一个结点的继承属 性由此结点的父结点和(或)兄结点的某些属 性确定。 • 可以用继承属性来表示程序语言结构中的上 下文依赖关系。 • 继承属性的计算可以结合自上而下的语法分 析进行。 A. c
A X1 … X … Xn
A X1X2…Xn b:=f(c1,c2,…,ck)
k
X1.c1 … X.b
… Xn
17
6.2 基于属性文法的处理方法 • 属性文法: 产生式 语义规则 .
A α b:=f(c1,c2,…,ck) • 语义规则的计算可以执行任何翻译动作。对输入串 的翻译也就是根据语义规则进行计算得出结果。 • 属性文法是比较抽象的翻译说明,隐藏了一些实现 细节, 主要是无须指明翻译时语义规则的计算次序。 • 本节讨论语义规则的计算方法,指明属性文法中语 义规则的计算次序,从而把语义规则改造为计算属 性的语义程序,把静态的语义规则改写为可动态执 行的语义动作 --- 语法制导翻译方法。
4
6.1 属性文法
• 属性文法, 也称属性翻译文法或语法制导定义, 是Knuth在1968年首先提出来的。 • 属性:在上下文无关文法的基础上为每个文法 符号X(终结符或非终结符)配备若干个相关的 “值”---这些“值”就称为文法符号X的属性。 • 属性值的设置和语法结构的语义以及翻译程序 的需要有关。 • 属性代表与文法符号相关语义信息,如类型、 值、代码序列、符号表内容等
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17
假设S.a的初始值为0,输入串为xyz
产生式 语义规则
S→XYZ Z.h := S.a
X.c := Z.g
S.b := X.d -2
X→x
Y.e := S.b X.d :=2*X.c
S:a=0, b=0
Y→y Z→z
Y.f := Y.e*3 Z.g :=Z.h+1
X:c=1 d=2
Y:e=0 f=0
begin
化简到足够小时,问题的解法
if N是一个非终结符 then其实非常简单
/*假设它的产生式为N→X1…Xm*/ for i :=1 to m do
if XiVN then /*即Xi是非终结符*/ begin
计算Xi的所有能够计算的继承属性; VisitNode (Xi) end;
计算N的所有能够计算的综合属性
7
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结点构造一条有向边;
以某种次序遍历语法树,直至计算出所有属性
深度优先,从左到右的遍历
15
计算思维的典型方法--递归
While 还有未被计算的属性问题d的o 解决又依赖于类似问题 VisitNode(S) /*S是开的始解符决号,只*/不过后者的复杂程
度或规模较原来的问题更小
procedure VisitNode (N:N一o旦d将e)问; 题的复杂程度和规模
id1 1
id2 2
entry
entry 10
良定义的属性文法
如果一属性文法不存在属性之间的循环依 赖关系,那么称该文法为良定义的
11
属性的计算次序
一个依赖图的任何拓扑排序都给出一个语 法树中结点的语义规则计算的有效顺序
属性文法说明的翻译是很精确的
基础文法用于建立输入符号串的语法分析树 根据语义规则建立依赖图 从依赖图的拓扑排序中,我们可以得到计算语
6.2 基于属性文法的处理方法
输入串 语法树 按照语义规则计算属性
由源程序的语法结构所驱动的处理办法就是语 法制导翻译法
语义规则的计算
产生代码 在符号表中存放信息 给出错误信息 执行任何其它动作
对输入符号串的翻译也就是根据语义规则进行 计算的结果
4
6.2 基于属性文法的处理方法
依赖图 树遍历 一遍扫描
Z:h=0 g=1
x
y
z
18
小结
基于属性文法的处理方法
依赖图 树遍历
19
8
E→E1+E2
E.val:=E1.val+E2.val
val E
E1
+
va,id3的 带注释的语法树的依赖图
D
产生式
语义规则
D→TL L.in := T.type
T→int T.type := integer
T→real T.type := real
9 L 10 ,
in id1 1 entry
id2 2 entry
addtype (id1.entry,a9);
13
6.2 基于属性文法的的处理方法
依赖图 树遍历 一遍扫描
14
6.2.2 树遍历的属性计算方法
通过树遍历的方法计算属性的值
假设语法树已建立,且树中已带有开始符号的 继承属性和终结符的综合属性
L→L1, id L1.in :=L.in addtype(id.entry, L.in)
L→id addtype(id.entry, L.in)
T4
type
5 L 6 - addtype(id.entry, L.in) in
real 7 L 8 addty,pe in
id3 3
entry
9 L 10 addty,pe in
5
6.2 基于属性文法的处理方法
依赖图 树遍历 一遍扫描
6
依赖图
在一棵语法树中的结点的继承属性和综合属性之 间的相互依赖关系可以由依赖图(有向图)来描述
为每一个包含过程调用的语义规则引入一个虚综 合属性b,这样把每一个语义规则都写成
的形式
b:=f(c1,c2,…,ck)
依赖图中为每一个属性设置一个结点,如果属性 b依赖于属性c,则从属性c的结点有一条有向边 连到属性b的结点。
编译原理
第六章 属性文法和语法制导翻译
1
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
2
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
3
end
16
例 考虑属性的文法G。其中,S有继承属性a,综 合属性b;X有继承属性c、综合属性d;Y有继承 属性e、综合属性f;Z有继承属性h、综合属性g
产生式 S→XYZ
X→x Y→y Z→z
语义规则 Z.h := S.a X.c := Z.g S.b := X.d -2 Y.e := S.b X.d :=2*X.c Y.f := Y.e*3 Z.g :=Z.h+1
义规则的顺序
输入串 语法树 依赖图 语义规则计算次序
12
句子real id1,id2,id3带注释的语法树的依赖图
D
a4:=real;
a5:=a4
T4 type
5L6 in
addtype (id3.entry,a5); a7:=a5;
real 7 L 8 , in
id3 3 addtype (id2.entry,a7); entry a9:=a7