资源描述:
《《语义分析中》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第05章语义分析主要内容:语义分析基础符号表类型分析声明和执行体的语义分析5.3类型分析5.3.1类型的等价性和相容性类型的等价性1)按名等价:typetp=array[1..10]ofinteger;vara,b:tp;则称a,b是相同类型的变量2)结构等价:typetp1=array[1..10]ofinteger;typetp2=array[1..10]ofinteger;vara:tp1;b:tp2;则称a,b是相同类型的变量类型的相容性:主要有:1)运算分量类型的相容性;2)赋值语句左右类型的相容性;3)形参和实参类型的相容性;类型分析的作用:构造类型的内部表示
2、,进行类型检查。分析过程:读Token序列,识别出各种类型,类型检查,返回类型内部表示的地址。5.3.2类型分析的总控算法功能:类型检查,Ptr返回类型的内部表示地址。VoidTypeProcess(Ptr){switch(token.class){caseID:NameTYPE(Ptr);break;//类型名caseENUM:EnumTYPE(Ptr);break;//枚举类caseARRAY:ArrayTYPE(Ptr);break;//数组类caseRECORD:RecordTYPE(Ptr,0,null);break//记录类caseUNION:UnionTYP
3、E(Ptr,0,null);break;//联合类casePOINTER:PointerTYPE(Ptr);break;//指针类default:error()};next_token();return;}5.3.3类型名分析形式:id/*类型标识符*/处理子程序:voidNameType(Ptr){FindEntry(token.seman,total,Entry,Present);//查符号表if(Present=flase)error;//无声明错if(Entrykind)!=typeKind}error;//非类型标识符Ptr=EntryidType;}如:V
4、ARid:t;5.3.4枚举类型分析形式:(id1,…,idn)分析任务:1)扫描及检查枚举类型的语义错误;2)构造该类型的内部表示,用Ptr指针指向它;3)构造枚举常量标识符的符号表项。例:设枚举类型(a,b),则首先产生枚举类型的内部表示,其中EntryList表示一个指针,指向枚举表。SizeenumTyEnumListPtr:aPtrConsKind0bPtrConsKind1aEntry:bEntry:其次,在符号表区里为常量a和b构造相应表项如下:处理子程序:voidEnumType(Ptr){list=nil;L0:next_token();//读表的下一个
5、元素Link(list,token.seman);//连接到内部枚举表next_token();if(token.class==“,”)gotoL0;Ptr:=★(enumSize,enumTy,List);//生成枚举类型的内部表示SizeenumTyEnumListPtr:m=0;L1:name=first(List);//取List的首元素List=tail(List);//去掉List的首元素Enter(name,(Ptr,constKind,m),entry,present);//建立符号表项if(present)error();m=m+1;if(List!=“
6、nil”)gotoL1;}如:(a,b)的符号表EntryList:aPtrConsKind0bPtrConsKind15.3.5数组类型分析形式:array[c1..c2]ofT算法要点:扫描C1时把其值计算到Low中;扫描C2时把其值计算到Up中;扫描T时构造出其内部结点(由ElemPtr指向);构造数组结点:Ptr:=★(size,arrayTy,Low,Up,ElemPtr)实现算法:voidArrayType(Ptr){//array[C1..C2]ofTnext_token();//读“[”next_token();Low=token.seman;/
7、/处理下标next_token();//读“..”next_token();Up=token.seman;//处理上标next_token();next_token();//读“]of”if(Low>Up)errorTy;new(ElemPtr);next_token();TypeProcess(EelemPtr);//处理元素类型Sizes:=(Up-Low+1)(*ElemPtr.Size);//求本类型长度Ptr:=★(size,arrayTy,Low,Up,ElemPtr);//生成数组类型的内部表示}5.3.6记录