说明语句的设计 例real idl,id2,id3 说明语句的文法 1.①→ TL T.type .in 类型2. → int real real 描述3.灯 》 real real 变量4. Li,id LI.in 表5. real id real ■要解决的问题 L2.in ide ◆记录标识符的类型 real real ◆类型信息传递 idi 继承属性自上 real 而下传递信息 023/2/28 KD
2023/2/28 1 说明语句的设计 例 real id1,id2,id3 说明语句的文法 1. D → T L 2. T → int 3. T → real 4. L → L1,id 5. L → id D T L real L1 , id3 L2 , id2 id1 要解决的问题 记录标识符的类型 类型信息传递 real real real .type real .in real .in real .in real 继承属性自上 而下传递信息 类型 描述 变量 表
说明语句的属性文法 ■用语义规则描述变量说明。 ■ 该属性文法描述如下: 产生式 语义规则(属性计算规则) 继承属性 1. D→TL ①.in:=T.type 2. T→int T.type:=integer 3. T→real T.type :real 综合属性 4. L→L1,id LI.in :L.in addtype(id.entry,L.in 5. L→id addtype(id.entry,L.in entry 单词id的属性,id在符号表的入口 addtype在符号表中为变量添加类型信息 2023/2/28 节目录 ☒
2023/2/28 2 1. D→TL L.in := T.type 2. T→int T .type := integer 3. T→real T.type := real 4. L→L1 ,id L1 .in := L.in addtype( id.entry, L.in ) 5. L→id addtype( id.entry, L.in ) entry 单词 id 的属性,id在符号表的入口 addtype 在符号表中为变量添加类型信息 用语义规则描述变量说明。 该属性文法描述如下: 产生式 语义规则(属性计算规则) 说明语句的属性文法 综合属性 继承属性 节目录
例real id1,id2,id3的语法树和属性计算pl72 D 依赖关系 (4) ⑤ 拓扑排序 T.type2real一 in=real t w.in-reat addtype real ⑥ real id.e® addtype real ⑨ L2.in=real,id2.entry 自下而上无 addtype real 法直接实现 ⑩ 自上而下存在左 idi.entry 递归,可改造 2023/2/28 节目录 ☒D3
2023/2/28 3 例real id1,id2,id3的语法树和属性计算 p172 D T L real L1 , id3 L2 , id2 id1 addtype .type=real .in=real .in=real .in=real 依赖关系 拓扑排序 自下而上无 法直接实现 .entry .entry .entry 自上而下存在左 递归,可改造 real addtype real addtype real ④ ⑤ ⑦ ⑥ ⑨ ⑧ ① ② ③ ⑩ 节目录
说明语句的翻译模式 将语义动作中的计算向前移,使继承属性 的计算出现在其文法符号之前 1. D→T{L.in:=T.type}L 2.T→int {T.type:=integer} 3. T-real {T.type:=real} 4.L-L1.in:=L.in}L1,id addtype(id.entry,L.in)} 5.L→id {addtype(id.entry,L.in)} 问题:如何自下而上计算继承属性? e20 23/2/28
2023/2/28 4 说明语句的翻译模式 将语义动作中的计算向前移,使继承属性 的计算出现在其文法符号之前 1. D→T {L.in:=T.type} L 2. T→int {T.type:=integer} 3. T→real {T.type:=real} 4. L→{L1.in:=L.in} L1,id {addtype(id.entry,L.in)} 5. L→id {addtype(id.entry, L.in)} 问题:如何自下而上计算继承属性?
自下而上计算继承属性p176 ■解决方法 从翻译模式中去掉嵌入在产生式中间的动作 1.D→T M L 2.T→int [T.type:=integer} 3.T→real {T.type:=real} 4.L→ N Ll,id {addtype(id.entry,L.in)} 5.L→id 引入6.Maddty(id.enttypb}in)} ■引入7.N→e{L.in:=L.in} 2023/2/28 I 5
2023/2/28 5 解决方法 从翻译模式中去掉嵌入在产生式中间的动作 自下而上计算继承属性 p176 1. D→T{L.in:=T.type}L 2. T→int {T.type:=integer} 3. T→real {T.type:=real} 4. L→{L1.in:=L.in}L1,id {addtype(id.entry,L.in)} 5. L→id 引入6. {addtype(id.entry,L.in)} M→ε {L.in:=T.type} 引入7. N→ε {L1.in:=L.in} M N