类型表达式 类型的等价性 按名等价: type tp= array[1..10] of integer var a, b tp: 则称a,b是相同类型的变量 结构等价: type tp1 array[1..10] of integer type tp2=array [1.10]of integer var a: tpl b: tp2; 则称a,b是相同类型的变量 类型的相容性
类型表达式 类型的等价性 按名等价:type tp=array[1..10]of integer; var a,b:tp; 则称a,b是相同类型的变量 结构等价:type tp1=array[1..10]of integer type tp2=array[1..10]of integer; var a:tp1; b:tp2; 则称a,b是相同类型的变量 类型的相容性
类型相容性 运算分量类型的相容性 ÷赋值语句左右类型的相容性; 形参和实参类型的相容性 类型相容: ◆类型等价则相容 ◆整型或整型子界类型与整型、实型相容 ◆两个子界类型定义的范围相包含则相容 ◆对结构类型,如果同一结构,且子类型 相容则相容
类型相容性 运算分量类型的相容性; 赋值语句左右类型的相容性; 形参和实参类型的相容性; 类型相容: ⬧类型等价则相容 ⬧整型或整型子界类型与整型、实型相容 ⬧两个子界类型定义的范围相包含则相容 ⬧对结构类型,如果同一结构,且子类型 相容则相容
类型的分析 作用:构造类型的内部表示,类型检查。 分析过程:读 Token序列,识别出各种类型, 类型检查,返回类型内部表示的地址 array arrKind ow=1 tp1=intPtr 10 up=10 tp2=intPtr IndexPtr=(1, subTy, intPtr, 1,10) of integer ElemPtr=intPtr size=(up-low+1)*sizeof (int) aPtr:=(size, arrTy, IndexPtr, ElemPtr)
类型的分析 作用:构造类型的内部表示,类型检查。 分析过程:读Token序列,识别出各种类型, 类型检查,返回类型内部表示的地址。 array [ 1 .. 10 ] of integer arrKind … low=1 tp1=intPtr … up=10 tp2=intPtr IndexPtr= (1,subTy, intPtr ,1 ,10) … … ElemPtr=intPtr size=(up-low+1) * sizeof (int) aPtr := ( size, arrTy, IndexPtr, ElemPtr )
类型出现的位置: 类型定义 TYPE id=t; 变量声明 VAR id:t 过/函声明 Proce/ Func p(A1:t…,)(:t 类型的种类: name, subr ange, enum, array record, set file, pointer ÷类型分析模块: 类型检查,返回类型的内部表示地址Pr和 Forward
类型出现的位置: 类型定义 TYPE id = t; 变量声明 VAR id : t; 过/函声明 Proce/Func P(A1:t1,…)(:t) 类型的种类: name,subrange,enum,array,record,set, file,pointer…… 类型分析模块: 类型检查,返回类型的内部表示地址Ptr和 Forward
NameType 形式:id(类型标识符) ÷处理思想: 查符号表→>无声明错 ◆ type ind? ◆ TypePtr为Ptr的值 ◆ Forward:=0
NameType 形式:id (类型标识符) 处理思想: ⬧ 查符号表 → 无声明错 ⬧ typekind ? ⬧ TypePtr 为Ptr的值 ⬧ Forward:=0
EnumTvpe 形式:(a1,…,an) 处理思想: ◆生成a1,l的符号表 EntryList: (a;,Ptr, conskind,i),Ptr需回填 ◆生成内部表示: Ptr: =(enumSize, enumTy, EntryList, n) ◆回填 EntryList中的Ptr值 ◆ Forward:=0
EnumType 形式:(a1,… ,an) 处理思想: ⬧ 生成a1,…an的符号表EntryList: (ai,Ptr,consKind,i),Ptr需回填 ⬧ 生成内部表示: Ptr:=★(enumSize,enumTy,EntryList,n) ⬧ 回填EntryList中的Ptr值 ⬧ Forward:=0
SubRangeType 形式:C1C 处理思想: ◆从G1求出其内部类型地址Ptr1和值N1; ◆从C2求出其内部类型地址Ptr2和值N2; ◆检查Ptr1=Ptr2,N1≤N2; ◆Ptr:=★( subsize, subTy,Ptr1,N,N2) ◆ Forward:=0
SubRangeType 形式:C1..C2 处理思想: ⬧ 从C1 求出其内部类型地址Ptr1和值N1; ⬧ 从C2 求出其内部类型地址Ptr2和值N2; ⬧ 检查Ptr1 =Ptr2,N1 N2; ⬧ Ptr:=★(subSize,subTy,Ptr1 ,N1 ,N2 ) ⬧ Forward := 0
ArrayType 形式: array to of t1 处理思想 ◆返回To,T1的内部表示地址 Indexptr,E| emPtr ◆判定 Indepth是否为下标类型 ◆计算size=( IndexPtr个,Up I ndexPtr1Low+1)×( ElemPtr↑.Size) ◆Ptr:=★(size, arrarY, Indexptr,E| emPtr)
ArrayType 形式:array T0 of T1 处理思想: ⬧ 返回T0,T1的内部表示地址IndexPtr,ElemPtr ⬧ 判定IndexPtr是否为下标类型 ⬧ 计算size = (IndexPtr↑. UpIndexPtr↑. Low +1) (ElemPtr↑. Size); ⬧ Ptr:=★(size,arrayTy,IndexPtr,ElemPtr)
Set Type 形式: set of t ÷处理思想: ◆返回T的内部表示地址 BasePtr ◆检查 BasePtr是否为有序类型; ◆Ptr:=★( setsize, setTy, Baseptr)
SetType 形式:set of T 处理思想: ⬧ 返回T的内部表示地址BasePtr; ⬧ 检查BasePtr 是否为有序类型; ⬧ Ptr:=★(setSize,setTy,BasePtr)
File type +形式: file of t +处理思想: 返回T的内部表示地址 compUtr; ◆Ptr:=★( filesize, fileT, CompPtr) 返回地址Ptr
FileType 形式:file of T 处理思想: ⬧ 返回T的内部表示地址compPtr; ⬧ Ptr:=★(fileSize,fileTy,CompPtr) 返回地址Ptr