第七章语法制导翻译和中间代码
源语言程序
中间代码
汇编代码
词法分析
语义分析
语法分析
中间代码生成
代码生成
在编译中的逻辑阶段
前端处理
后端处理
语义处理
语义处理(语义分析和中间代码生成)
1、使逻辑结构简单明确
2、与机器相关的某些实现细节放在代码生成阶段
3、可进行代码优化
源语言程序
汇编代码
词法分析
语义分析
语法分析
代码生成
前端处理
后端处理
语义处理
语义处理
语义处理
语义处理的任务:
静态语义分析
静态语义:语法规则的良形式条件(合法的程序是否有意义)
静态语义检查:审查静态语义
动态语义处理
动态语义:程序单元执行的操作
动态语义处理:执行翻译,生成(中间/目标)代码
语义处理
语义处理的实现:
属性文法:描述语义规则。(上下文无关文法+语义规则)
语法制导翻译技术:
根据翻译目标的要求确定每个产生式所包含的语义
根据产生式的语义,分析文法中每个符号的语义
把这些语义以属性的形式附加到相应的文法符号上
根据产生式的语义,给出符号属性的求值规则(语义规则),从而形成语法制导定义
在语法分析过程中,当使用该产生式时,执行语义规则描述的动作(对相应的属性求值),从而完成翻译,生成中间代码/目标代码
属性文法
属性文法(attribute grammar)
是一个三元组: A=(G,V,F)
F:
V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连
G:是一个上下文无关文法
表达式文法 E→T+T| T or T T → n | true | false
E → T1 + T2
{ = int AND = T1. type
:=int }
E → T1 or T2
{ = bool AND =
:=bool }
T → n { := int }
T → true { := bool }
T → false { := bool }
类型检查的属性文法:
属性通常分为两类:综合属性和继承属性。
简单地说,
综合属性用于“自下而上↑”传递信息,
继承属性用于“自上而下↓”传递信息。
语义规则所描述的工作可以包括:
属性计算
静态语义检查
有些语义规则可能产生副作用(如打印一个值,符号表操作,代码(中间)生成),也可能是个函数,通常把这样的语义规则写成过程调用或过程段。看成是产生式左部符号的虚拟综合属性。
语义规则
L E
E E1+T
E T
T T1 * F
T F
F (E)
F digit
Print()
:=+
:=
:=
:=
:=
:=
产生式
综合属性val
综合属性
左部符号的综合属性是从该产生式右部文法符号的属性值计算出来的;
在分析树中,如果一个结点的某一个属性由其子结点的属性确定,则称这种属性为该结点的综合属性。
产生副作用的语义规则,如打印一个值、向符号表中插入信息或更新一个全程变量等。
语义规则函数都不具有副作用的语法制导定义称为属性文法。
在语法制导定义中,一条语义规则完成一个计算属性值的动作。digit是终结符,只使用综合属性,且其属性值由词法分析器提供,通常不要计算属性值。
L
=19
=15
=4
=15
=4
=3
=3
=5
=4
=5
=3
+
*
3*5+4的带注释的分析树
如果一个语法制导定义仅仅使用综合属性,则称这种语法制导定义为S属性定义。通常采用自底向上的方法对其分析树加注释,即从树叶到树根,按照语义规则计算每个节点的属性值。
编译原理课件 第 7 讲 语法制导翻译和中间代码生成(1) 来自淘豆网www.taodocs.com转载请标明出处.