第五章语法制导的翻译 许畅 南京大学计算机系 2022年春季 版权所有南京大学计算机科学与技术系许畅2022春季版
许畅 南京大学计算机系 2022年春季 第五章 语法制导的翻译 版权所有 南京大学计算机科学与技术系 许畅 2022春季版 南大编译许畅
介绍 。使用上下文无关文法引导语言的翻译 CFG的非终结符号代表了语言的某个构造 程序设计语言的构造由更小的构造组合而成 一个构造的语义可以由小构造的含义综合而来 比如:表达式x+y的类型由x、y的类型和运算符+决定 也可以从附近的构造继承而来 比如:声明ntx中x的类型由它左边的类型表达式决定 2
介绍 • 使用上下文无关文法引导语言的翻译 – CFG的非终结符号代表了语言的某个构造 – 程序设计语言的构造由更小的构造组合而成 – 一个构造的语义可以由小构造的含义综合而来 • 比如:表达式x + y的类型由x、y的类型和运算符+决定 – 也可以从附近的构造继承而来 • 比如:声明int x中x的类型由它左边的类型表达式决定 2 南大编译许畅
语法制导定义和语法制导翻译 语法制导定义 将文法符号和某些属性相关联,并通过语义规则来描 述如何计算属性的值 。E今E1+T E.code E.code I T.code I+ 属性cod代表表达式的逆波兰表示,规则说明加法表达 式的逆波兰表示由两个分量的逆波兰表示并置,然后 加上'+'得到 ·语法制导翻译 在产生式体中加入语义动作,并在适当时候执行动作 ·E→E1+T print '+' 3
语法制导定义和语法制导翻译 • 语法制导定义 – 将文法符号和某些属性相关联,并通过语义规则来描 述如何计算属性的值 • E → E1 + T E.code = E1 .code || T.code || '+' – 属性code代表表达式的逆波兰表示,规则说明加法表达 式的逆波兰表示由两个分量的逆波兰表示并置,然后 加上'+'得到 • 语法制导翻译 – 在产生式体中加入语义动作,并在适当时候执行动作 • E → E1 + T { print '+'; } 3 南大编译许畅
语法制导的定义(SDD) Syntax-Directed Definition(SDD)是上下文无 关文法和属性/规则的结合 属性和文法符号相关联,按照需要来确定各个文法符 号需要哪些属性 规则和产生式相关联 对于文法符号X和属性a,我们用X.表示分析树中 某个标号为X的结点的值 一个分析树结点和它的分支对应一个产生式规则,而 对应的语义规则确定了这些结点上属性的取值和计算 4
语法制导的定义 (SDD) • Syntax-Directed Definition (SDD) 是上下文无 关文法和属性/规则的结合 – 属性和文法符号相关联,按照需要来确定各个文法符 号需要哪些属性 – 规则和产生式相关联 • 对于文法符号X和属性a,我们用X.a表示分析树中 某个标号为X的结点的值 – 一个分析树结点和它的分支对应一个产生式规则,而 对应的语义规则确定了这些结点上属性的取值和计算 4 南大编译许畅
分析树和属性值(1) 假设需要知道一个表达式的类型,以及对应代码 将它的值存放的内存地址 我们需要两个属性:type,place 产生式规则:E→E1+T 假设只有int/loat类型 E.type=if (E.type ==T.type)T.type else float; E.place=newTempPlace().;/∥返回一个新的内存位置 产生式规则:F→d F.type =lookupIDTable(id.lexValue)->type; F.place lookupIDTable(id.lexValue)->address; 5
分析树和属性值 (1) • 假设需要知道一个表达式的类型,以及对应代码 将它的值存放的内存地址 – 我们需要两个属性:type, place • 产生式规则:E → E1 + T – 假设只有int/float类型 – E.type = if (E1 .type == T.type) T.type else float; – E.place = newTempPlace(); // 返回一个新的内存位置 • 产生式规则:F → id – F.type = lookupIDTable(id.lexValue)->type; – F.place = lookupIDTable(id.lexValue)->address; 5 南大编译许畅