属性文法 本节要点 义 ●属性文法 ●属性等式 ●合成属性和继承属性 ●依赖图 ●属性计算顺序 ●S-属性文法和-属性文法
属性文法 本节要点 ⚫ 语义 ⚫ 属性文法 ⚫ 属性等式 ⚫ 合成属性和继承属性 ⚫ 依赖图 ⚫ 属性计算顺序 ⚫ S-属性文法和L-属性文法
属性文法 本节要点 属性文法的应用 ●值的计算 ●类型计算 ●抽象语法树生成 翻译模式
属性文法 本节要点 ⚫ 属性文法的应用 ⚫ 值的计算 ⚫ 类型计算 ⚫ 抽象语法树生成 ⚫ 翻译模式
语义分析、属性文法 主要参考资料 程序设计语 实践之路 Michael L. Scott, Programming Languages Pragmatics, Morgan Kaufmann,2000,2005) 中文版由表宗燕译电子工业出版社出版,2005 ●2编译原理及实践 Kenneth C. Louden机械工业出版社.1997 3程序设计语言编译原理(第3版).陈火旺国防工业出版社2000 4编译原理李建中等译机械工业出版社.2005 (Compilers Principles, Techniques, and Tools)
语义分析、属性文法 主要参考资料 ⚫ 1.程序设计语言——实践之路 Michael L. Scott, Programming Languages Pragmatics, Morgan Kaufmann, 2000, 2005) 中文版由裘宗燕译.电子工业出版社出版,2005 ⚫ 2.编译原理及实践.Kenneth C.Louden.机械工业出版社.1997 ⚫ 3.程序设计语言编译原理(第3版).陈火旺.国防工业出版社.2000 ⚫ 4.编译原理.李建中等译.机械工业出版社.2005 ⚫ (Compilers Principles,Techniques, and Tools)
语义 法分析关注程序的结构、而语义关注的是 程序的意义。 语义:一组规则,用它可以定义一个程序的 意义 ●语义规则可分为静态语义和动态语义 编译器在编译期间推行静态语义规则,生成的代 码在执行时实施动态语义规则 有些错误不可能在编译时捕获,必须推迟到程序 执行时,如:被0除,数组下标越界等
语义 语法分析关注程序的结构,而语义关注的是 程序的意义。 语义:一组规则,用它可以定义一个程序的 意义。 语义规则可分为静态语义和动态语义 ⚫ 编译器在编译期间推行静态语义规则,生成的代 码在执行时实施动态语义规则 ⚫ 有些错误不可能在编译时捕获,必须推迟到程序 执行时,如:被0除,数组下标越界等
请语义的描述方法 ●描述方法: ●自然语言描述 ●隐藏错误、二义性和不完整性 ●形式描述: 操作语义 指称语义 a代数语义 ●属性文法(目前流行的方法) ●语义分析和中间代码生成都可以通过在分析树或者语法树上 加标注的方法实现,这些标注称为属性
语义的描述方法 描述方法: ⚫ 自然语言描述 ⚫ 隐藏错误、二义性和不完整性 ⚫ 形式描述: 操作语义 指称语义 代数语义 ⚫ 属性文法(目前流行的方法) ⚫ 语义分析和中间代码生成都可以通过在分析树或者语法树上 加标注的方法实现,这些标注称为属性
语义分析器的角色 不同的语言语义分析器扮演不同的角色 强制不同 ● FORTRAN和C允许在表达式中混合使用各种类型 Ada类的语言根本不允许 ●执行动态检查多少不同 ●C语言几乎不做,除了硬件顺便做的(除0,数组越界等) ●Java尽可能地检查许多规则,以便保证无法信任的程序不会对其 运行所在的机器的存储或文件造成任何破坏。 通常语义分析器创建一棵带标注的语法树,随后由中 间代码生成器 线性化为某种理想机器的汇编语 ●语义分析和中间代码生成可以与语法分析交错进行, 也可单独作为一遍
语义分析器的角色 不同的语言语义分析器扮演不同的角色 ⚫ 强制不同 ⚫ FORTRAN和C允许在表达式中混合使用各种类型; ⚫ Ada一类的语言根本不允许。 ⚫ 执行动态检查多少不同 ⚫ C语言几乎不做,除了硬件顺便做的(除0,数组越界等) ⚫ Java尽可能地检查许多规则,以便保证无法信任的程序不会对其 运行所在的机器的存储或文件造成任何破坏。 通常语义分析器创建一棵带标注的语法树,随后由中 间代码生成器将它线性化为某种理想机器的汇编语言。 语义分析和中间代码生成可以与语法分析交错进行, 也可单独作为一遍
2.6.1属性文法 属性文法(属性翻译文法) Knuh在1968年提出 ●在上下文无关文法的基础上,为每个文法符号 终结符或非终结符)配备若干相关的“值”(称为 属性)。 ●属性描述文法符号对应程序结构的特性,如: ●变量的数据类型 ●符号表 ●表达式的值。 存储器中变量的位置 程序的目标代码 数的有效位数
2.6.1 属性文法 属性文法(属性翻译文法) ⚫ Knuth在1968年提出 ⚫ 在上下文无关文法的基础上,为每个文法符号 (终结符或非终结符)配备若干相关的“值”(称为 属性)。 ⚫ 属性描述文法符号对应程序结构的特性,如: ⚫ 变量的数据类型。 ⚫ 符号表 ⚫ 表达式的值。 ⚫ 存储器中变量的位置 ⚫ 程序的目标代码 ⚫ 数的有效位数
2.6.1属性文法 属性的表示: 属性直接与语言的文法符号终结符号或非终结符号) 相联系。如果X是一个文法符号,a是X的一个属性 那么我们把与X关联的a的值记作Xa ●属性可以进行计算和传递 语义规则:对于文法的每个产生式都配备了 组属性的计算规则(属性等式 ●属性文法可看成是上下文无关文法+语义规
2.6.1 属性文法 属性的表示: ⚫ 属性直接与语言的文法符号(终结符号或非终结符号) 相联系。如果X是一个文法符号,a 是X的一个属性, 那么我们把与X关联的a的值记作X.a。 属性可以进行计算和传递 语义规则:对于文法的每个产生式都配备了 一组属性的计算规则(属性等式) 属性文法可看成是上下文无关文法+语义规 则
属性等式 若有一个属性的集台a1∴,ak,语法制导语义 的原理应用于每个文法规则 Xo→X1X2Xn(Xo∈vN,X∈NVN∪V)),每 个文法符号X的属性X1a的值与规则中其他符号的 属性值有关。如果同一个符号X在文法规则中出现 不止一次,那么每次必须用合适的下标与在其他地 方出现的符号区分开来。每个关系用属性等式或语 义规则表示,形式如下 ajij(Ao·a1,∴…,A0·ak X1a1, X. a k
若有一个属性的集合a1 , . . . , ak ,语法制导语义 的原理应用于每个文法规则 X0→X1 X2 . . .Xn ( X0∈VN,Xi∈(VN∪VT ) ),每 个文法符号Xi的属性Xi .aj的值与规则中其他符号的 属性值有关。如果同一个符号Xi在文法规则中出现 不止一次,那么每次必须用合适的下标与在其他地 方出现的符号区分开来。每个关系用属性等式或语 义规则表示,形式如下: Xi.aj=fij(X0.a1,...,X0.ak, X1.a1,...,X1.ak,...,Xn.a1,...,Xn.ak ) 属性等式
思考 ●为什么在属性等式中说“如果同一个符 号X在文法规则中出现不止一次,那么 每次必须用合适的下标与在其他地方出 现的符号区分开来”?
思考 为什么在属性等式中说“如果同一个符 号Xi在文法规则中出现不止一次,那么 每次必须用合适的下标与在其他地方出 现的符号区分开来”?