第五章语法割导翻译 中间代码生成
第五章 语法制导翻译及 中间代码生成
5.1引言 ·词法分析与语法分析仅仅是编译程序的一小部分。 ·在早期的一些编译程序中,是在语法分析的基础上根据源 程序中各语法成份的语义,直接产生机器语言或汇编语言 形式的目标代码。 ·现在的编译系统一般都将经过语法分析的源程序先翻译为 某种形式的中间语言代码,然后再将其翻译为目标代码。 ·优点: -使编译程序各组成部分功能更单一; -使得编译程序的逻辑结构更为清晰,从而 -使编译程序更易于编写与调整;同时 一为代码优化和程序的可移植性提供了条件
5.1 引言 • 词法分析与语法分析仅仅是编译程序的一小部分。 • 在早期的一些编译程序中,是在语法分析的基础上根据源 程序中各语法成份的语义,直接产生机器语言或汇编语言 形式的目标代码。 • 现在的编译系统一般都将经过语法分析的源程序先翻译为 某种形式的中间语言代码,然后再将其翻译为目标代码。 • 优点: –使编译程序各组成部分功能更单一; –使得编译程序的逻辑结构更为清晰,从而 –使编译程序更易于编写与调整;同时 –为代码优化和程序的可移植性提供了条件
5.1引言(续) ·本章要讨论的中间代码生成,是指把单词符号串形式的源程序转换为 另一种等价的便于代码优化处理和目标代码生成表示。 ·目前常见的中间语言有逆波兰表示、三元式、四元式等等。 ·遗憾的是,中间代码生成与语言的语义密切相关,而语义的形式化描 述是一个非常困难的; ·存在一种称为语法制导翻译的模式,这种模式实际上是对前后文无关 文法的一种扩充。 ·方法:对文法中的每个产生式都附加一个语义动作或语义子程序,在语 法分析过程中,每当需要使用一个产生式进行推导或归约,语法分析 程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用 相应的语义子程序
5.1 引言(续) • 本章要讨论的中间代码生成,是指把单词符号串形式的源程序转换为 另一种等价的便于代码优化处理和目标代码生成表示。 • 目前常见的中间语言有逆波兰表示、三元式、四元式等等。 • 遗憾的是,中间代码生成与语言的语义密切相关,而语义的形式化描 述是一个非常困难的; • 存在一种称为语法制导翻译的模式,这种模式实际上是对前后文无关 文法的一种扩充。 • 方法:对文法中的每个产生式都附加一个语义动作或语义子程序,在语 法分析过程中,每当需要使用一个产生式进行推导或归约,语法分析 程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用 相应的语义子程序
5.1引言(续) 。 这种模式既把语法分析与语义处理分开,又令其平行地进 行,让其在同一遍扫描中同时完成语法分析和语义处理两 项工作。 ·由此可见,抽象文法符号的具体语义信息,是在与语法分 析同步的语义处理过程中获取和加工的。 ● 文法符号X的语义信息我们称之为语义属性或简称为属性 (Attributes) ·我们用形处X.ATTR的记号来表示文法符号X的相关语义属 性。 ·如果一个文法符号人在一产生式中多次出现,为了在语义 上能够对其进行区分,可冻加不同的上标
5.1 引言(续) • 这种模式既把语法分析与语义处理分开,又令其平行地进 行,让其在同一遍扫描中同时完成语法分析和语义处理两 项工作。 • 由此可见,抽象文法符号的具体语义信息,是在与语法分 析同步的语义处理过程中获取和加工的。 • 文法符号X的语义信息我们称之为语义属性或简称为属性 (Attributes)。 • 我们用形如X.ATTR的记号来表示文法符号X的相关语义属 性。 • 如果一个文法符号X在一产生式中多次出现,为了在语义 上能够对其进行区分,可添加不同的上标
文法符号及其语义属性 ·例如,文法GE: 产生式 语义子程序 E→E(1)+T E.Val=E(1).val+T.val;) 语法分 语义分 析栈 析栈 E→T{E.Val=T.Val;} T T.Val T→digit {T.Val=digit; + ·为了能在语法分析过程中平行地进行语义 处理,可在语法分析栈旁边并行地设置一 E 个语义信息栈 #
文法符号及其语义属性 • 例如,文法G[E]: 产生式 语义子程序 E→E(1)+T {E.Val=E(1) .val+T.val;} E→T {E.Val=T.Val;} T→digit {T.Val=digit;} • 为了能在语法分析过程中平行地进行语义 处理,可在语法分析栈旁边并行地设置一 个语义信息栈 语法分 析栈 语义分 析栈 T T.Val + ‘+’ E … … #