- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第05章 语义分析中
第05章 语义分析 主要内容: 语义分析基础 符号表 类型分析 声明和执行体的语义分析 5.3 类型分析 5.3.1 类型的等价性和相容性 类型的等价性 1)按名等价:type tp=array[1..10]of integer; var a,b:tp; 则称a,b是相同类型的变量 2)结构等价:type tp1=array[1..10]of integer; type tp2=array[1..10]of integer; var a:tp1; b:tp2; 则称a,b是相同类型的变量 类型的相容性:主要有: 1)运算分量类型的相容性; 2)赋值语句左右类型的相容性; 3)形参和实参类型的相容性; 类型分析的作用:构造类型的内部表示,进行类型检查。 分析过程:读Token序列,识别出各种类型,类型检查,返回类型内部表示的地址。 5.3.2 类型分析的总控算法 功能:类型检查, Ptr返回类型的内部表示地址。 Void TypeProcess(Ptr){ switch(token.class){ case ID : NameTYPE(Ptr);break; //类型名 case ENUM: EnumTYPE(Ptr);break; //枚举类 case ARRAY: ArrayTYPE(Ptr);break; //数组类 case RECORD: RecordTYPE(Ptr,0,null);break//记录类 case UNION: UnionTYPE(Ptr,0,null);break;//联合类 case POINTER:PointerTYPE(Ptr);break; //指针类 default:error() }; next_token(); return; } 5.3.3 类型名分析 形式:id /*类型标识符*/ 处理子程序: void NameType(Ptr) { FindEntry(token.seman,total,Entry,Present); //查符号表 if(Present=flase) error; //无声明错 if(Entry?kind)!=typeKind} error; //非类型标识符 Ptr = Entry ? idType; } 5.3.4 枚举类型分析 形式:(id1,… ,idn) 分析任务: 1)扫描及检查枚举类型的语义错误; 2)构造该类型的内部表示,用Ptr指针指向它; 3)构造枚举常量标识符的符号表项。 处理子程序: void EnumType(Ptr){ list=nil; L0:next_token(); //读表的下一个元素 Link(list,token.seman); //连接到内部枚举表 next_token(); if(token.class==“,”) goto L0; Ptr:=★(enumSize,enumTy,List); //生成枚举类型的内部表示 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 != “nil”) goto L1; } 5.3.5 数组类型分析 形式:array[c1..c2] of T 算法要点: ? 扫描C1时把其值计算到Low中; ? 扫描C2时把其值计算到Up中; ? 扫描T时构造出其内部结点(由ElemPtr指向); ? 构造数组结点: Ptr:=★(size,arrayTy,Low,Up,ElemPtr) ?实现算法: void A
文档评论(0)