资源描述:
《编译原理及实现技术 教学课件 作者 刘磊 第06章 语义分析和符号表.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、语义分析和符号表主要内容:语义分析概述(必要性、功能、描述方法)符号表类型表达式声明和程序体的语义分析语义分析的必要性语法和语义的区别;语法:关于什么样的字符串才是该语言在组成结构上合法的程序的法则。语义:关于结构上合法的程序的意义的法则。语义分析的分类语义种类静态语义:在编译阶段(从程序文本上)可以检查的语义。动态语义:通过程序的执行才能检查的语义。语义错误各种条件表达式的类型是不是boolean型?运算符的分量的类型是否相容?赋值语句的左右部的类型是否相容?形参和实参的类型是否相容?下标表达式的类型是否为所允许的类型?变体记录中表示情形的常量是否
2、为合法类型?函数说明中的函数类型和返回值的类型是否一致?V[E]中的V是不是变量,而且是数组类型?V.id中的V是不是变量,而且是记录类型?id是不是该记录类型中的域名?V↑中的V是不是指针或文件变量?y+f(....)中的f是不是函数名?形参个数和实参个数是否一致?p(....)语句中的p是不是过程名?形参个数和实参个数是否一致?每个使用性标识符是否都有声明?在同层内有无标识符被声明多次?标号是否有声明?有无重复声明和重复定位错误?有无非法转入错误?子界类型中的下界和上界类型是否相容?下界是否小于等于上界?语义分析的内容:类型分析;标识符相关
3、信息;语义分析的功能:检查语义错误构造标识符属性表(符号表)语义分析的实现:与语法分析相结合语义分析的功能图示语义分析语法分析树TokenList语义定义自然语言描述规定符号表判定标识符的内部表示类型的内部表示值的内部表示三种内部表示Code标识符的内部表示标识符种类:常量名、类型名、变量名、函数名、过程名、域名。TYPEidkind=(consKind,typeKind,varKind,fieldKind,procKind,funcKind)内部表示(AttributeIR):常量:类型:变量:域名*:过函:ValueKindTypePtrForwardKin
4、dTypePtrOffLevelAccessKindTypePtrHostTypeOffKindTypePtrSizeForwardClassParmLevelKindTypePtrOff例有声明如下:CONSTpai=3.14;TYPEvector=ARRAY[1..10]OFinteger;VARx,y:real;r,s:vector;设当前层数和可用offset值分别为L和0,构造标识符pai,vector,x,y,r和s的属性表示。类型的内部表示类型的种类:标准、子界、枚举、数组、记录、集合、文件、指针类型等等。TypeKind=(intTy,boolT
5、y,charTy,realTy,enumTy,subTy,arrayTy,recordTy,setTy,fileTy,pointerTy)内部表示:(TypeIR)标准类型:sub:enum:array:UpLowHostTypeKindSizeLengElemsKindSizeElemTypeIndexTypeKindSizeKindSizerecord:FixBody:VariBody:set:file:pointer:VariBodyFixBodyKindSizeNextOffFixUnitTypeidVariUnitsCaseUnitNextVariBo
6、dyFixBodyOffCaseTypeidBaseTypeKindSizeCompTypeKindSizeTypeNameKindSize例有如下的类型定义:at=ARRAY[1..10]OFARRAY[1..100]OFinteger;rt=RECORDx:real;a:at;CASEu:booleanOFfalse:(k:integer);true:(y:real;b:boolean)END构造类型的内部表示。值的内部表示非结构类型值的内部表示:实型:指针:有序类型:整数形式有序类型的常量表示:整型常量:ord(N)=N布尔常量:ord(false)=0,
7、ord(true)=1字符常量:ord(C)=ASCⅡ(C)枚举常量:设有枚举类型(D,A,B),则有ord(D)=0,ord(A)=1,ord(B)=2子界常量:设有子界类型C1..C2,则值空间为[ord(C1)...ord(C2)]符号表标识符的作用:声明部分:定义了各种对象及对应的属性和使用规则。程序体:对所定义的对象进行各种操作。$ididnameIdnameAttributeIR必要性Token:新表-符号表(种类、类型等信息):有关符号表的操作:添加、作用域删除、查询处理符号表的模块:定义符号表数据结构定义符号表上的操作符号表符号表的作用:为语义检
8、查和代码生成提供标识符的