eg.8一个说明语句的翻译方案(续) 有关符号的属性 Type-变量所具有的类型,如 整型NT 实型REAL 数组类型aray(元素个数,元素类型) 指针类型 pointer(所指对象类型) T width一该类型数据所占的字节数 offset一变量的存储偏移地址 2021/2/11 《编译原理与技术》讲义 16
2021/2/11 《编译原理与技术》讲义 16 e.g. 8 一个说明语句的翻译方案(续) - 有关符号的属性 T.type - 变量所具有的类型,如 整型 INT 实型 REAL 数组类型 array(元素个数,元素类型) 指针类型 pointer(所指对象类型) T.width - 该类型数据所占的字节数 offset - 变量的存储偏移地址
eg.8一个说明语句的翻译方案(续) T type Twidth 整型 INT 4 实型 REAL 数组aray( number,T1) number val*T1widh 指针 pointer (T,) 4 enter(name,type, offset)-一将类型type和偏移 offset填入符 号表中name所在的表项。 2021/2/11 《编译原理与技术》讲义 17
2021/2/11 《编译原理与技术》讲义 17 e.g. 8 一个说明语句的翻译方案(续) T.type T.width 整型 INT 4 实型 REAL 4 数组 array(number, T1) number.val * T1 .width 指针 pointer(T1) 4 enter(name,type,offset)-将类型type和偏移offset填入符 号表中name所在的表项
eg.8一个说明语句的翻译方案(续) (1)P→>MD (2)D>D1;D (3)D-≯id:T ∥/填入变量的相关属性 enter( id name, T type, offset) ∥计算下一可用偏移位置 offset offset t width (4)M→ε{ offset:=0∥偏移初始为0} 2021/2/11 《编译原理与技术》讲义 18
2021/2/11 《编译原理与技术》讲义 18 e.g. 8 一个说明语句的翻译方案(续) (1)P→M D (2)D→D1 ; D2 (3)D→id : T { // 填入变量的相关属性 enter( id.name, T.type, offset) // 计算下一可用偏移位置 offset = offset + T.width } (4)M→ { offset := 0 // 偏移初始为0}
eg.8一个说明语句的翻译方案(续) (5) T->int T type:= INT; T width: =41 (6) T->real( T type REAL, T width: =43 (7) T->array[ number ]of T1 T type =array( number. val, T, type) Twidth' number val T, width (8)T>pointer(T1) iT. type: pointer(T, type); Twidth: =41 2021/2/11 《编译原理与技术》讲义 19
2021/2/11 《编译原理与技术》讲义 19 e.g. 8 一个说明语句的翻译方案(续) (5)T→int { T.type := INT; T.width := 4 } (6)T→real { T.type := REAL; T.width := 4 } (7)T→array [ number ] of T1 { T.type := array( number.val, T1 .type); T.width := number.val * T1 .width } (8)T→pointer( T1 ) { T.type := pointer( T1 .type) ; T.width := 4 }
eg.9一个嵌套说明语句的翻译方案 文法G2如下: P>D D→>D1, D>id T D>proc id, D1, S T→int| real array[ number]ofT1|个T1 s→>a 2021/2/11 《编译原理与技术》讲义
2021/2/11 《编译原理与技术》讲义 20 e.g. 9 一个嵌套说明语句的翻译方案 文法G2如下: P→D D→D1 ; D2 D→id : T D→ proc id ; D1 ; S T→int | real | array [ number ] of T1 | T1 S→a