类型等价 不同的语言有不同的类型等价的定义 结构等价 或者它们是相同的基本类型 或者是相同的构造算子作用于结构等价的类型 而得到的。 或者一个类型是另一个类型表达式的名字 名等价 类型名仅仅代表其自身
类型等价 • 不同的语言有不同的类型等价的定义 • 结构等价 – 或者它们是相同的基本类型 – 或者是相同的构造算子作用于结构等价的类型 而得到的。 – 或者一个类型是另一个类型表达式的名字 • 名等价 – 类型名仅仅代表其自身
声明 文法 D→Tid;D|e T+BC| record{D“}2 C int float Canum] C ·含义: D生成一系列声明; T生成不同的类型; B生成基本类型int/ float; C表示分量,生成[nm]序列 注意 record中包含了各个字段的声明。字段声明和变量 声明的文法一致
声明 • 文法 – D → T id ; D | ε – T → B C | record ‘{’ D ‘}’ – C → int | float – C → ε | [num] C • 含义: – D生成一系列声明; – T生成不同的类型; – B生成基本类型int/float; – C表示分量,生成[num]序列; – 注意record中包含了各个字段的声明。字段声明和变量 声明的文法一致
局部变量的存储布局 变量的类型可以确定变量需要的内存 即类型的宽度 可变大小的数据结构只需要考虑指针 函数的局部变量总是分配在连续的区间; 因此给每个变量分配一个相对于这个区间开始 处的相对地址 变量的类型信息保存在符号表中;
局部变量的存储布局 • 变量的类型可以确定变量需要的内存 – 即类型的宽度 – 可变大小的数据结构只需要考虑指针 • 函数的局部变量总是分配在连续的区间; – 因此给每个变量分配一个相对于这个区间开始 处的相对地址 • 变量的类型信息保存在符号表中;
计算T的类型和宽度的SDT 综合属性:type, width 全局变量t和w用于将类型和宽度信息从B传递到C→ε 相当于C的继承属性,因为总是通过拷贝來传递,所以在 SDT中只赋值一次。也可以把t和w替换为C.t和C.w T→B it=Btype; w= B width;) T type=C type, Iwidth=C width, B→int IB type= integer; B width=4; 1 B Hoat [Btype=float; Bwidth=8; I iC type=t; Cwidth=w, C,[ num C1 C type= array(num value, C1type, Cwidth= num value x C1width;)
计算T的类型和宽度的SDT • 综合属性:type, width • 全局变量t和w用于将类型和宽度信息从B传递到C→ ε – 相当于C的继承属性,因为总是通过拷贝来传递,所以在 SDT中只赋值一次。也可以把t和w替换为C.t和C.w
SDT运行的例子 输入:int[2][3] ype= array(2, array (3, integer) width= 24 b type integer ype= array(2, array(3, integer)) integer w width= 24 width=4 int [2] type array (3, integer dth= 12 [3] e= integer dth 4
SDT运行的例子 • 输入:int[2][3]