文法符号及其语义属性
2)终结符只有综合属性,它们由词法程序提供.
6.1 属性文法
3.属性的计算/获得
在上下文无关文法的基础上,为每个文法符 号(终结符或非终结符)引进一组属性,且让该文 法中的重写规则附加上语义规则时,称该上下文无 关文法为属性文法。
注:语法制导翻译是指在语法分析的过程中,完成附加在所使 用的产生式上的语义规则所描述的动作。
10
属性文法
属性文法(attribute grammar)是一个三元组: A=(G,V,F),其中
文法符号及其语义属性
引言
• 后面要讨论的中间代码生成,是指把单词符号串形式的源程 序转换为另一种等价的便于代码优化处理和目标代码生成的 表示方法。
• 目前常见的中间语言有逆波兰表示、三元式、四元式等等。
• 遗憾的是,中间代码生成与语言的语义密切相关,而语义的 形式化描述是一件非常困难的事情;
• 存在一种称为语法制导翻译的模式,这种模式实际上是对上 下文无关文法的一种扩充。
6.1 属性文法
二、基本规则
1. 语义规则的形式:
产生式Aα的语义规则的形式为b:=f(c1,c2,…,ck)
其中:(1) f是一个函数;通常以表达式的形式出现
b有 (2) 或者b—A的综合属性,且c1,c2,…,ck是α中文法
两种 可能
符号的属性;
(3) 或者b—α中某个文法符号的继承属性, 且c1,c2,…,ck是A或α中任何文法符号的属性.
G:是一个上下文无关文法
V:有穷的属性集,每个属性与文法的一个终结符或非 终结符相连,这些属性代表与文法符号相关信息, 如它的类型、值、代码序列、符号表内容等等 .属 性与变量一样,可以进行计算和传递。属性加工 的过程即是语义处理的过程。
F:关于属性的属性断言或一组属性的计算规则(称为 语义规则) . 断言或语义规则与一个产生式相联,引 用该产生式左端或右端的终结符或非终结符相联 的属性.
(1) 产生式右边的继承属性 产生式左边的综合属性
由该产生式提供的计 算规则计算获得
(2) 产生式左边的继承属性 产生式右边的综合属性
由其它产生式的属性 规则计算或由属性计 算器的参数提供
15
6.1 属性文法
例6.1:考虑非终结符A,B和C,其中,A有一个继承属性
a和一个综合属性b,B有综合属性c,C有继承属
T + E … #
语义分 析栈 T.Val ‘+’
…
语义处理(语义分析和中间代码生成)
在编译中的逻辑阶段
源语言程序
词法分析
前
语法分析
端
处
理
语义分析
语 义
处
理 中间代码生成
中间代码
后
端
代码生成
处
理
汇编代码
语义处理
源语言程序
词法分析前语法Fra bibliotek析端处
理
语义分析
语 义 处 理
后 端
代码生成
处
理
汇编代码
第六章 属性文法和语法制导翻译
语义规则 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
17
6.1 属性文法
文法符号及其语义属性
• 例如,文法G[E]:
产生式
语义子程序
E→E(1)+T {E.Val=E(1).val+T.val;}
E→T {E.Val=T.Val;}
T→digit
{T.Val=digit;}
• 为了能在语法分析过程中平行地进行 语义处理,可在语法分析栈旁边并行 地设置一个语义信息栈
语法分 析栈
⇒属性b依赖于属性c1,c2,…,ck
12
6.1 属性文法
2.VT—VN的属性
(1) VT — 只有综合属性,由词法分析器提供. (2) VN — 既可有综合属性也可有继承属性;
开始符号S的所有继承属性作为属性计算 前的初始值.
13
出现在产生式左边的继承属性和出现在产生式右边的 综合属性不由所给定的产生式的属性计算规则进行 计算,它们由其它产生式的属性规则计算或者由属 性计算器的参数提供。
性d。
产生式ABC可能有规则:
A.a—左部继承属性 A.b—左部综合属性
C.d:=B.c+1 A.b:=A.a+B.c
B.c—右部综合属性 C.d—右部继承属性
属性A.a和B.c在其它地方计算。
16
6.1 属性文法
例6.2: 一个简单台式计算器的属性文法
产生式 LEn EE1+T ET TT1*F TF F(E) Fdigit
• 由此可见,抽象文法符号的具体语义信息,是在与语法分 析同步的语义处理过程中获取和加工的。
• 文法符号X的语义信息我们称之为语义属性或简称为属性 (Attributes)。
• 我们用形如X.ATTR的记号来表示文法符号X的相关语义属 性。
• 如果一个文法符号X在一产生式中多次出现,为了在语义 上能够对其进行区分,可添加不同的上标。
6.1 属性文法 6.2 基于属性文法的处理方法 6.3 S—属性文法的自下而上计算 6.4 L—属性文法和自顶向下翻译 6.5 自下而上计算继承属性
7
6.1 属性文法 一、基本概念
1.属性
广义:用以描述事物或人的特征、性质、品质等等。 狭义:代表与文法符号相关的信息,其信息值即为
属性值。 例如:其类型、值、代码序列、符号表内容等。
• 方法:对文法中的每个产生式都附加一个语义动作或语义子程 序,在语法分析过程中,每当需要使用一个产生式进行推导或 归约,语法分析程序除执行相应的语法分析动作外,还要执 行相应的语义动作或调用相应的语义子程序。
引言(续)
• 这种模式既把语法分析与语义处理分开,又令其平行地进 行,让其在同一遍扫描中同时完成语法分析和语义处理两 项工作。
8
6.1 属性文法
注:
(1)属性与变量一样,可以进行计算和传递。 (2)属性加工的过程即是语义处理的过程。 (3)属性 综合属性:用于“自下而上”传递信息。
继承属性:用于“自上而下”传递信息。
9
6.1 属性文法
2. 语义规则
为文法的每一个产生式配备的计算属性的计 算规则,称为语义规则。
3. 属性文法
第14讲 属性文法
real ⑥ L ⑨ addtype, in
L1.in :=L.in addtype(id.entry, L.in) ⑧ addtype(id.entry, L.in) in
L ⑩ addtype , id1 ①
entry
id2 ② entry
id3 ③ entry
良定义的属性文法
如果一属性文法不存在属性之间的循环依赖关 系,则称该文法为良定义的
A. C.d:=B.c+1
视频区域
B. A.b:=B.c+C.d
C. B.c := A.a
编译原理
带注释的语法树
带注释的语法树
D
T.type=real
L.in=real
real
L.in=real ,
L.in=real ,
id2
id1
视频区域
id3
带注释的语法树
在语法树中,一个结点的综合属性的值由其子 结点和它本身的属性值确定
产生式
L→En
带注释的语法树
E→E1+T E→T
句子3*5+4n
T→T1*F T→F
L F→ (E)
F→digit
E.val=19
n
语义规则 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
视频区域
以上下文无关文法为基础
为每个文法符号(终结符或非终结符)配备若干相 关的“值”(称为属性),代表与文法符号相关信 息,如类型、值、代码序列、符号表内容等
中国科学技术大学陈意云编译原理全套参考资料chapter4
中国科学技术大学陈意云编译原理全套参考资料chapter4 第四章语法制导的翻译在3.7节用Yacc写的例子中,我们看到一种有用的描述形式:语言结构的属性附加在代表语言结构的文法符号上,这些属性值由附加在文法产生式的语义动作来计算,这些语义动作在归约对应的产生式时进行计算,由此得到结果。
这种描述形式可用来描述编译器的语义分析,因此本章系统地研究这种称之为“语法制导下的语言翻译”的描述方法及其实现。
它的语义动作(有时称为语义规则)的计算可以产生代码、把信息存入符号表、显示出错信息、或完成其它工作。
语义规则的计算结果就是我们所要的记号流的翻译。
本章讨论语义规则和产生式相联系的两种方式:语法制导的定义和翻译方案。
语法制导定义是较抽象的翻译说明,它隐蔽了一些实现细节;而翻译方案陈述了一些实现细节,主要是指明了语义规则的计算次序。
在第五章说明语义检查和第七章描述中间代码生成时,大量使用这两种方法。
本章还讨论语法制导定义和翻译方案的实现方法。
概念上的方法是,首先分析输入的记号串,建立分析树,然后从分析树得到描述结点属性间依赖关系的有向图,从这个依赖图得到语义规则的计算次序,然后进行计算,最终得到翻译的结果。
实际的实现并不需要按上面步骤逐步进行,本章将讨论几种不同限制下的实现方法。
4.1 语法制导的定义语法制导的定义是上下文无关文法的推广,其中每个文法符号都有一个属性集合,它分成两个子集,分别叫做该文法符号的综合属性集合和继承属性集合。
如果我们把分析树上的结点看成是保存对应文法符号的属性的记录,那么属性对应记录的域。
属性可以表示任何东西:串、数、类型、内存单元,或其它想表示的东西。
分析树结点的属性值由该结点所用产生式的语义规则定义。
在语法制导定义中,我们把其中的文法称为基础文法。
本节介绍语法制导定义的形式及其概念上的实现模型。
4.1.1 语法制导定义的形式在语法制导定义中,每个文法符号有一组属性,每个文法产生式A , ,有一组形式为b := f (c, c, …, c )的语义规则,其中f 是函数,b和c, c, …, c 是该产生式的文法符号的12k12k属性,并且:(1) 如果b是A的属性,c , c , …, c 是产生式右部文法符号的属性或A的其它属12k性,那么b叫做文法符号A的综合属性。
编译原理 第02章_文法和语言的基本知识
2.3.2 语言的形式定义
S→01 | 0S1
S 0S100S11…0n-1S1n-10n1n * 即S0n1n
可见,此文法定义的语言为 L(G[S])={ 0n1n | n≥1}
2.3.2 语言的形式定义
例4 设有文法G[S]:S→0S | 1S |ε 该文法所定义的语言是什么?
由该文法所确定的语言为 L(G[S])={ε, 0, 1, 00, 01, 10, 11, …} ={ x | x∈{0,1}* }
2.3.1 文法的形式定义
2. 文法
规则的非空有穷集合,通常表示 成四元组 G={VN,VT, P, S } VN是规则中非终结符号的集合。 VT是规则中终结符号的集合。
P 是文法规则的集合。
2.3.1 文法的形式定义
S 是一个非终结符号,称为文法 的开始符号或文法的识别符号,它至 少要在一条规则中作为左部出现。由 它开始,识别出我们所定义的语言。 由文法定义可知,文法是对语言 结构的定义和描述,文法四大要素中 关键是规则的集合。
2.3.2 语言的形式定义
广义推导
* 0n表示从0出发,经0步或若干步, 可推导出n。 * 意味着 + 或者 = 。 也就是说0 n 0 n 0 n
对上例 E→E+T | T T→T*F | F F→(E) | i *E * i+i*i 我们有: E E
2.3.2 语言的形式定义
4. 句型和句子
设有文法G[S](S是文法G的开始符号) * 如果S x, x ∈(V ∪V )* 则称符号串x
N T
为文法G[S]的句型。 * x, x ∈V * 则称符号串x为文法 如果S T G[S]的句子。
2.3.2 语言的形式定义
编译原理概念_名词解释
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。
解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码句子的二义性(这里的二义性是指语法结构上的。
):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。
文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。
LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)第1个L:从左到右扫描输入串第2个L:生成的是最左推导1:向右看1个输入符号便可决定选择哪个产生式某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归文法符号的属性:单词的含义,即与文法符号相关的一些信息。
如,类型、值、存储地址等。
一个属性文法(attribute grammar)是一个三元组A=(G, V, F)G:上下文无关文法。
V:属性的有穷集。
每个属性与文法的一个终结符或非终结符相连。
属性与变量一样,可以进行计算和传递。
F:关于属性的断言或谓词(一组属性的计算规则)的有穷集。
断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性。
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性。
电子科技大学14秋《计算机编译原理》在线作业2答案
14秋《计算机编译原理》在线作业2单选题多选题判断题一、单选题(共15 道试题,共75 分。
)1. 描述一个语言的文法是。
A. 唯一的B. 不唯一的C. 可能唯一D. 可能不唯一-----------------选择:B2. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类:采用自顶向下分析方法时,要求文法中不含有()。
A. 右递归B. 左递归C. 直接右递归D. 直接左递归-----------------选择:B3. 算符文法是指()的文法。
①没有形如U::=...VW...的规则(U,V,W ∈VN)②终结符号集VT中任意两个符号对之间至多有一种优先关系成立③没有相同的规则右部④没有形如U::= ε的规则。
A. ①B. ①②C. ①②③D. ①②③④-----------------选择:A4. 如果文法G是无二义的,则它的任何句子α()。
A. 最左推导和最右推导对应的语法树必定相同B. 最左推导和最右推导对应的语法树可能不同C. 最左推导和最右推导必定相同D. 可能存在两个不同的最左推导,但它们对应的语法树相同-----------------选择:A5. 同心集合并有可能产生新的()冲突A. 归约B. “移进”/“移进”C. “移进”/“归约”D. “归约”/“归约”-----------------选择:D6. SLR(1)分析法的名字中,“R”的含义是()。
A. 自左向右进行分析B. 自右向左进行分析C. 采用最右推导的逆过程——最左归约。
编译原理 文法
我〈谓语 我〈动词〉〈直接宾语〉 我是〈直接宾语〉 我是〈名词〉 我是大学生
3
句子构成规则
“我是大学生”的构成符合上述规则,而法与否的依据,这些规则是一种元语言,
用它描述汉语。这里仅仅涉及汉语句子的结构描
述。其中一种起描述作用的元语言称为文法。
21
文法的定义
例: 文法G=(VN,VT,P,S) VN = { S }, VT ={ 0, 1 } P={ S→0S1, S→01 } S为开始符号
22
文法的定义
例 文法G=(VN,VT,P,S) VN ={标识符,字母,数字} VT ={a,b,c,…x,y,z,0,1,…,9} P={<标识符>→<字母> <标识符>→<标识符><字母> <标识符>→<标识符><数字> <字母>→a,…, <字母>→z <数字>→0,…, <数字>→9 } S=<标识符>
19
文法和语言的形式定义
文法即是通过生成方式描述语言的:语言中的每个
句子可以用严格定义的规则来构造。下面给出文 法的定义。进而在文法定义的基础上,给出推导
的概念,句型、句子和语言的定义。
20
文法的定义
文法G定义为四元组(VN,VT,P,S )其中 VN为非终结符号(或语法实体,或变量)集; VT为终结符号集; P为产生式(也称规则)的集合; VN,VT和P是非空有穷集。 S称作识别符号或开始符号,它是一个非终结符,至少要 在一条产生式中作为左部出现。 VN和VT不含公共的元素,即VN ∩ VT = φ 用V表示VN ∪ VT ,称为文法G的字母表或字汇表 规则,也称产生式或生成式,是形如α→β或α∷=β的(α,β)有 序对,其中α是字母表V的正闭包V+中的一个符号,β是V* 中的一个符号。α称为规则的左部,β称作规则的右部。
第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 很大时,在线性表上进行查找的效率显然很低。
第二章2.2.4 语法树与文法二义性
例3: G(E):E i| E + E| E * E| ( E )
2.2.4语法树
句型i * i + i
E
E
E
+
E
E
*
E
i
i
i
E* E
i E+ E
i
i
(i*i)+i
i*(i+i) 22
三、语法树的应用
2.2.4语法树
1、一个有用的定理 定义1 由某一结点及其所属分支组成的部分
树称为原树的一棵子树。 定义2 只有单层分支的子树称为简单子树。
E
+
T
TF|T*F F(E)|i
T
F i (1) *i (2) +i (3)
T* F
F
i
i
短语:i *i +i 、 i *i、 i i (1) 、i (2) 、 i (3)
简单短语: i (1) 、i (2) 、 i (3) 句柄: i (1)
35
文法G:
E
ET|E+T
E
+
T
TF|T*F F(E)|i
10
2.2.3 推导和归约
7.句子 设有文法G,S是文法G的开始符号,如果有: S
+ , ∈VT* 则称为G的句子。 7.语言
所有句子的集合称为文法的语言。 记作: L(G) = {α| S * , ∈VT* }
11
2.2.4 语法树与文法二义性
2.2.4 语法树
一、语法树(推导树、生成树或分析树)
产生式的形式为: 或 ::=
5
2.2.3 推导和归约
文法符号及其语义属性
V:有穷的属性集,每个属性与文法的一个终结符或非 终结符相连,这些属性代表与文法符号相关信息, 如它的类型、值、代码序列、符号表内容等等 .属 性与变量一样,可以进行计算和传递。属性加工 的过程即是语义处理的过程。
F:关于属性的属性断言或一组属性的计算规则(称为 语义规则) . 断言或语义规则与一个产生式相联,引 用该产生式左端或右端的终结符或非终结符相联 的属性.
for i :=1 to k do 从 Ci 结点到 b 结点构造一条有向边;
返回
29
6.2 基于属性文法的处理方法
例6.5: AXY ⇒ A.a:=f (X.x, Y.y) X.i:=g (A.a, Y.y)
X.x
A.a
X.i Y.y
30
6.2 基于属性文法的处理方法
3.例题
例6.6: 将下面的产生式应用于语法树中
⇒属性b依赖于属性c1,c2,…,ck
12
6.1 属性文法
2.VT—VN的属性
(1) VT — 只有综合属性,由词法分析器提供. (2) VN — 既可有综合属性也可有继承属性;
开始符号S的所有继承属性作为属性计算 前的初始值.
13
出现在产生式左边的继承属性和出现在产生式右边的 综合属性不由所给定的产生式的属性计算规则进行 计算,它们由其它产生式的属性规则计算或者由属 性计算器的参数提供。
产生式
语义规则
EE1+E2
E.val:=E1.val+E2.val
E
E1
+
val
val E2
⇒ E.Val是从 E1.val和E2.val 综合得出
val
31
产生式
第五章——属性文法
T1:= - c T2:=b * T1 T5:=T2+T2 a:=T5
(b)DAG的三地址代码
图示法
三地址代码特点:
1.三地址代码的语句类似于汇编语言代码。 2.语句可以带有符号标号,并且存在各种控 制流语句。 3.三地址代码可以存放在一个数组中。
三地址代码语句的具体实现: (记录)
第五章 语法制导翻译技术 中间代码生成
属性文法:Attributed
Grammar
描述语义的工具 语法制导翻译: Syntax-Directed Translation
几种中间代码表现形式
5.2 属性文法
接近形式化的语义描述方法
属性文法(A符号配 备若干相关的“属性”,对每个产生式都配备 一组属性的计算规则(语义规则Semantic Rules)。
A都有一组语义规则(Semantic Rules),每 条语义规则的形式为:
• b:=f(c1,c2,…,ck)
其中,f是一个函数,属性b与ci之间,或者
• (1)b是A的一个综合属性且c1,c2,…,ck是产生式右 边文法符号的属性;或者 • (2)b是产生式右边某文法符号的继承属性且 c1,c2,…,ck是A或产生式右边任何符号的属性。
简单算术表达式和赋值语句的翻译
(1) Aid := E { P:=lookup () ; if Pnil then emit( P“:=”E.place) else error } (2) EE1+E2 {E.place:= newtemp; emit(E.place“:=” E1.place“+”E2.place)}
E→T
T → T1 * F T→F
