1.导入
语法制导翻译是处理语义的基本方法,它以语法分析为 基础,在语法分析得到语言结构的结果时,对附着于此结构 的语义进行处理,如计算表达式的值、生成中间代码等
2.语法与语义
语法与语义的关系 语法是指语言的结构、即语言的“样子” ;语义是指附着于 语言结构上的实际含意 ,即语言的“意义” 。
对于语法和语义:
• 语义不能离开语法独立存在;
• 语义远比语法复杂;
• 同一语言结构可包含多种含意,不同语言结构表示相同含意;
• 语法与语义之间没有明确的界线。
3 基本概念
语义分析的作用:
1,检查语言结构的语义是否正确,即是否构造正确的句子所表述的意思也合法
2,执行所规定的语义动作,如表达式的值、符号表的填写、中间代码的生成等
1.语法制导翻译
在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作
2.静态语义分析
验证关于所编译的程序的语义规则是否全为“真”
3.语法制导定义SDD:
SDD是对CFG的推广,他将每个文法符号和一个语义属性集合相关联,将每个产生式和一组语义规则相关联,这些规则用于计算该产生式种各个文法符号的属性值
左边是上下文无关文法,右边是其对应的语义规则,T表示的是非终结符Type,它定义了一个属性type,当产生式右部是int时,T的值是int,是real时,T的值就是real。这里的L用来表示生成标识符序列inL,需注意,右边的L与左边的L是同一个符号,角标用来标识在表达式出现的位置
4.语法制导翻译方案SDT:
在产生式右部嵌入程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作要放在花括号内。
第一个语句动作表示当分析出T以后,我们就可以利用T的type值来计算L的inh值;第二三个式子表示当产生式右部都分析出来之后,我们就可以来计算产生式左部type值;最后一个表示在计算L1之前就可以根据L的inh值来计算L1的属性值
一个语义动作在产生式中的位置决定了这个动作的执行时间。
补充:SDD和SDT
SDD是关于语言翻译的最高层次规格说明,隐藏了许多具体的实现细节,使用户不必显示地说明翻译发生的顺序
SDT可以看作是对SDD的一种补充,是SDD的具体实施方案,显示的指明了语义规则的计算顺序,以便说明某些实现细节
应用最广的语义分析方法:语法制导翻译
语法制导翻译:在语法分析过程中,随着分析(推导或者规约)的逐步开展,每识别出一个语法结构,根据文法的每个规则所对应的语义子程序进行翻译的方法。是使用CFG(上下文无关文法)来引导对语言的翻译,是一种面向文法的翻译技术
语法制导翻译的基本思想:1.将文法符号所代表的语言结构的意思,用附着于该文法符号的属性表示(表示语义信息的方法:为CFG的文法符号设置语义属性);2. 用语义规则规定产生式所代表的语言结构之间的关系(即 属性之间的关系),即用语义规则实现属性计算(如何计算语义属性:语法福海的语义属性值是用与文法符号所在产生式即语法规则,相关联的语义规则来计算)
对给定的输入串x,构建x的语法分析树,并利用与产生式(语法规则)相关联的语义规则来计算分析树各个节点对应的语义属性值
语义规则的执行:在语法分析推导或归约的每一步骤中,执行 附着在对应产生式上的语义规则,实现对语义的处理,如查添 符号表、生成中间代码、发布错误信息等。
静态语义检查:
- 类型检查
- 控制流检查
- 一致性检查
- 相关名字检查
- 名字的作用域分析
审查每个语法结构的静态语义,即验证语法结构合法的程序是否有合法的意义 如果静态语义正确,生成中间代码或目标代码
4.SDD
定义: SDD是对CFG的推广,他将每个文法符号和一个语义属性集合相关联,将每个产生式和一组语义规则相关联,这些规则用于计算该产生式种各个文法符号的属性值
文法符号的属性:综合属性和继承属性
综合属性:
自下而上传递,综合属性的值由其子结点和其自身的的属性值确定。如产生式E->E1+T的语义规则是E.val=E1.val+T.val
继承属性:
自上而下传递,继承属性的值由此结点的父结点或者兄弟结点的某些属性值确定
综合属性
终结符可以具有综合属性。终结符的综合属性值是由词法分析器提供的词法值,因此在SDD中没有建瓯算终结符属性的语义规则
下面的图片中:digit是终结符,其综合属性值是由词法分析器提供的词法值lexval,圈起来的E表示的是expression表达式;通过第二三个语义规则可知,E的属性值是由它的子节点给的,同理,T和F也由其子节点决定,故三者都是综合属性
语法分析树:每个节点都带有属性值的分析树
继承属性
带有继承属性L.in的SDD:由第2 和3个式子可知,T.type的值是根据产生式右边即子结点决定的,根据第一条和第4条可知,L.inh值是由其兄弟(一起出现在产生式右边的字母)或父亲(产生式左边的值)给的;addtype是副作用,其中终结符的属性lexval是由词法分析器提供的,它表示构成终结符id的的字符序列,功能是在符号表当中创造一条记录,并且将id的类型设置为L.inh所表示的类型,由于使用了id自身的属性和子节点,所以该副作用可以理解为虚综合属性的一条语义规则
属性文法
一个没有副作用的SDD有时也称之为属性文法,属性文法的规则仅仅通过其他属性值和常量来定义一个属性值
SDD求值顺序
SDD为CFG的文法符号设置语义属性。对于给定的输入串x,应用语义规则计算分析树中各结点对应的属性值
计算属性值的顺序思路:语义规则建立了属性之间的依赖关系,在对语法分析树节点的一个属性求值之前,必须首先求出这个属性值所依赖的所有属性值。
依赖图
依赖图:一个描述了分析树中结点属性间依赖关系的有向图
依赖关系:若b依赖于c,则箭头从c指向b
属性计算顺序实现:被依赖的结点计算顺序在依赖的结点前面,这样排序就将一个有向图变成一个线性排序,这个排序称之为拓补排序
对于只具有综合属性的SDD,可以按照任何自底向上的顺序计算他们的值
对于同时具有综合属性和继承属性的SDD,不能保证存在一个顺序来对各个节点上的属性进行求值
从计算的角度看,给定一个SDD,很难确定是否存在某棵语法分析树,使得SDD的属性之间存在循环依赖关系
幸运的是,存在一个SDD的有用子类,他们能够保证对每一棵语法分析树都存在一个求值顺序,因为它们不允许产生带有环的依赖图
5 属性文法
基本概念:
属性是描述语义的有效方法,由此发展而来的属性文法被人物为是上下文无关文法的扩充。
但属性并不是描述语义的有效方法,特别是程序设计语言的动态语义(程序的运行时特性)并不适合用属性文法来描述
上下文无关文法 + 语义规则
即在上下文无关文法基础上,为每个文法符号配备若干相关的“值”(属性) 代表与文法符号相关信息,如类型、值、代码序列、符号表内容等等 根据语义规则,属性可以计算和传递
S-属性文法的自下而上计算
S-属性定义:只含有综合属性的SDD称为S属性的SDD,或者S-属性定义、S-SDD
可以在分析输入符号串的同时由自下而上的分析器来计算
扩充LR分析器的功能:当执行归约产生式的动作时,也执行产生式对应的语义动作;
扩充分析栈:增加一个与分析栈并列的语义栈,用于存放分析栈中文法符号所对应的属性值。
L-属性文法和自顶而下翻译
L-属性定义(也称为L属性的SDD或L-SDD)的直观含义:在一个产生式所关联的各属性之间,依赖图的边可以从左到右,但不能从右到左(因此称为L属性的,L是left的首字母)。
每个S-属性都是L-属性定义
这类属性文法允许我们通过一次遍历就可以计算出所有属性值——树的深度优先遍历
如果对于每个产生式A→X1X2…Xn,其每个语义规则中的每个属性或者是综合属性,或者是Xj的一个继承属性且这个继承属性仅依赖于:
(1)产生式Xj的左边符号X1,X2,…,Xj-1的属性
(2)A的继承属性
反例:继承属性的倒数第一条,Q的值依赖于它右边符号R的属性值,故是非L属性的SDD
1-5 重点
综合属性(S-属性文法):自下而上传递 LR
继承属性(L-属性文法):自上而下传递 LL(1)
6 语法制导翻译方案SDT
在产生式右部嵌入程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作要放在花括号内。
SDT可以看作SDD的具体实施方案
主要讨论以下两种情况:
基本文法可以使用LR分析技术,且SDD是S属性
基本文法可以使用LL分析技术,且SDD是L属性