- 3
- 0
- 约1.47万字
- 约 57页
- 2016-12-29 发布于北京
- 举报
第八章 语法制导翻译和中间代码生成 8.1 语法制导翻译概述 1、语法制导翻译的概念 在语法分析过程中根据各个规则所相联的语义动作或所对应的语义子程序进行翻译的办法。 2、要求 语法结构具有规定的语义。 3、本质 在进行语法分析的同时,完成相应的语义处理,关键是如何根据被识别出的语法成分进行语义处理。 4、语义分析的任务 1)静态语义检查 例:类型、运算、维数、越界 a+b-1*true 2)动态语义处理(真正的翻译) 例:变量的存储分配 例:表达式的求值 例:语句的翻译(中间代码的生成) 总目标:生成等价的中间代码/目标代码 5、处理方法 1)对应每一个文法规则编制一个语义子程序,当一个规则获得匹配时,调用相应的语义子程序实现语义检查与翻译。 2)在文法规则的右部适当位置,插入相应的语义动作,按照分析的进程,执行遇到的语义动作。 注意:语义——可以看成是相应文法符号的属性。 6、语法制导翻译的具体实现途径 使用LR分析器实现:通过对符号栈 加上语义,扩充LR分析器的分析能力,使 它在用某个文法规则进行归约的同时,调用相应的语义子程序或产生某种中间代码形式。 8.2 属性文法 1、现代编译系统多采用语法制导翻译方法,该方法使用属性文法为工具来说明程序设计语言的语义。 2、属性文法是Knuth在1968年提出的。 3、属性文法的特点 1)是一种接近形式化的语义描述方法; 2)每个语法符号有相应的属性符号; 3)每个文法规则都有相应的计算属性的规则:属性变量=属性表达式 一、属性文法举例 规则 属性(计算)规则/语义规则 E → E1 + E2 E.val := E1.val + E2.val E → E1 * E2 E.val := E1.val * E2.val E →(E1) E.val := E1.val E →id E.val := id .val 二、属性文法的定义 1、定义为三元组A=(G,V,F)。 其中:G是上下文无关文法;V是属性的有穷集;F是关于属性的谓词/断言,充当计算规则。说明:任何布尔表达式都是谓词。 2、属性(语义信息)与终结符或非终结符相联;谓词与文法规则相联。 3、静态语义审查即验证关于所编译源程序的谓词是否全为真。可用带语义信息结点的语法树来表示与输入串对应语法树的静态语义审查。 三、用法 1、根据文法符号的语义,为文法符号设置属性。 2、为每个文法规则设置语义规则(用于描述各属性的关系——计算规则) 3、两种使用形式: 用于语法制导定义:语义的抽象说明。 用于翻译模式的定义:规定实现方法(计算次序)。 例1:计算器的设计 对下列文法: L → E E → E1 + T | T T → T1 * F | F F → ( E ) | digit 用属性文法描述语法制导的翻译过程如下: L → E 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 其中:lexval 是单词 digit 的属性 例2:说明语句的设计 说明语句的文法 D → T L T → int T → real L → L1,id L → id 2、说明语句类型信息传递的实现 1)方法 编写说明语句的文法,将类型信息作为类型描述 T 的属性 type 和变量表 L 的属性 in。 2)目的 分析说明语句 D,为变量指定类型。 3、属性文法的实现 D → T L 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 ) 其中:entry 为单词 id 的属性;addtype 表示在符号表中为变量填加类型信息; 四、属性分类 1、综合属性 设 A→X1X2…Xn 为一个文法规则,则A.s=f(c1,c2,…,ck)中,c1,c2
原创力文档

文档评论(0)