文法符号及其语义属性
- 格式:ppt
- 大小:670.50 KB
- 文档页数:7
中国科学技术大学陈意云编译原理全套参考资料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的综合属性。
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。
解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码句子的二义性(这里的二义性是指语法结构上的。
):文法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单选题多选题判断题一、单选题(共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. 采用最右推导的逆过程——最左归约。
第二章文法与语言一个程序设计语言是一个记号系统,同自然语言一样,它的完整的定义应包括语法和语义两个方面。
所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。
上下文无关文法完全可以描述程序设计语言的语法。
语法规定了特定符号序列的合法性,而与符号的含义没有关系。
比如在C语言中,X=Y+Z、X+=Y、X++等都是合法的,而X=X*则非法。
这和我们在自然语言中遇到的情况相同。
但是在程序设计语言中,表达式组成部分的类型也决定着它们的合法性。
对于语义的分析与处理到目前为止仍然没有公认的形式系统用于自动构造正确的编译程序。
2.1 文法的概念从形式语言的角度看,一个语言也就是字符串集。
如果字符串集是有穷的,可以用枚举的办法表示出来。
当集合无穷时,枚举的办法就不行了,需要寻找合适的有穷表示方法----文法就是表示无穷字符串集的强有力的一种工具。
我们先来分析汉语句子的文法表示,采用巴克斯范式(BNF或EBNF):句子→主语·谓语主语→代词∣名词代词→我∣你∣他名词→司机∣农民∣学生∣汽车∣锄头谓语→动词·直接宾语动词→学习∣拿起∣开直接宾语→代词∣名词其中的每一条称为产生式或语法规则,符号“→”也可以写成“∷=”;符号“·”和“∣”是集合运算符号,“·”表示“连接”,该符号往往被省略,“∣”表示“或”,该符号两边的符号串称候选。
由上面的规则可以产生或推导出句子,引进符号“=>”表示推导,比如句子“司机开汽车”的推导过程为:句子=>主语·谓语=>名词·谓语=>司机·谓语=>司机·动词·直接宾语=>司机·开·直接宾语=>司机·开·名词=>司机开汽车试推导句子:农民拿起锄头2.2 符号和符号串每种程序设计都有它的字符集,其中的字符用来构造单词,单词构造更大的语法单位,<表达式>、<语句>等复合对象。
第八章属性文法§8.1 简述属性文法( Attribute Grammar)的概念首先由Knuth在1968年提出。
顾名思意属性文法是带属性的一种文法。
虽称是文法,但它不是用来描述文法,而是用来描述文法符号的属性关系的。
因为其属性规则与产生式紧密相关,称它是面向文法的一种方法。
凡是与文法的相关的问题均可试用属性文法这一工具。
属性文法的最成功的应用是编译器的自动生成。
有过一些成功的系统,如GAG[kastens 82],HLP[Raiha 78],SDCG[paulson 82];一些现实程序设计语言的编译程序前端,也用属性文法生成出来,其中包括pascal[kastens&etal 82]和Ada[Unl&etal 82]。
属性文法可用来描述代码生成和优化[Ganapthi & Fisher 82][ Neal & Amirchachy 74],程序正确性与程序变换[Gernert 75],数据流分析[Farrow 77][Babich & Jazayerl 78]。
Reps利用AG实现了基于属性文法的语言的程序设计环境[Peps 83]。
为了方便起见,将knuth所提出的属性文法称为简单属性文法并记为AG。
在给出AG的形式定义之前, 首先考虑一个文法例(8.1.0),它产生二进制数。
二进制数由0,1和小数点“.”组成。
G[R]: 1. R→N 4. N→ND2. R→N.N 5. D→0 (8.1.0)3. N→D 6. D→1文法本身并不含什么意义,它只说明什么样的终极符串是合法的。
文法G[R]的合法终极符串(句子)为通常的二进制数, 可288––带小数点,但至多能带一个小数点。
根据定义10.1, 001、111等都是文法G[R]的合法句子。
那么它们究竟代表什么意义,可给出种种不同的定义。
假设就定义它们代表的是相应的十进制实数, 比如前面几个二进制表示分别代表实数2.5,1和7。
编译原理-属性⽂法和语法制导翻译1.属性⽂法:在上下⽂⽆关⽂法的基础上,为每个⽂法符号引进⼀组属性,且让该⽂法中的重写规则附加上语义规则时,称该上下⽂⽆关⽂法为属性⽂法。
(属性⽂法往往以语法制导定义和翻译模式两种形式出现。
具体说明问度娘)注意:(1)属性与变量⼀样,可以进⾏计算和传递。
(2)属性加⼯的过程即是语义处理的过程。
(3)属性分为综合属性(⽤于“⾃下⽽上”传递信息)和继承属性(⽤于“⾃上⽽下”传递信息)。
(1. 语义规则的形式:产⽣式A—>α的语义规则的形式为b:=f(c1,c2,…,ck)。
就是属性b依赖于属性c1,c2,…,ck。
其中:f是⼀个函数;b—A的综合属性,且c1,c2,…,ck是α中⽂法符号的属性;b—α中某个⽂法符号的继承属性, 且c1,c2,…,ck是A或α中任何⽂法符号的属性.(2.VT—VN的属性(1) VT — 只有综合属性,由词法分析器提供.(2) VN — 既可有综合属性也可有继承属性; 开始符号S的所有继承属性作为属性计算前的初始值.(3.属性的计算/获得(1)由该产⽣式提供的计算规则计算获得:产⽣式右边的继承属性,产⽣式左边的综合属性。
(2)由其它产⽣式的属性规则计算或由属性计算器的参数提供:产⽣式左边的继承属性,产⽣式右边的综合属性2.综合属性:通常使⽤⾃底向上的⽅法(由⼦确⽗),S—属性⽂法:仅使⽤综合属性的属性⽂法.3.继承属性:⽤继承属性来表⽰程序设计语⾔结构中的上下⽂依赖关系很⽅便.(由⽗兄却该结点继承属性)4.基于属性⽂法的处理⽅法:(1.依赖图:继承属性和综合属性之间的相互依赖关系的有向图。
构造过程:为每个包含过程调⽤的语义引⼊⼀个虚综合属性b,改写为b=f(c1,c2,…,ck)的形式-->为每个属性设置⼀个结点--->若属性b依赖于属性c,则从属性c的结点有⼀条有向边连到属性b的结点。
(2. 属性的计算次序:(1)良定义的:若⼀个属性⽂法不存在属性之间的循环依赖关系,则称该⽂法为良定义的。