语义分析器的角色 不同的语言语义分析器扮演不同的角色 强制不同 ● 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在文法规则中出现不止一次,那么 每次必须用合适的下标与在其他地方出 现的符号区分开来”?