资源描述:
《语义分析在编译程序中的作用.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、语义分析在编译程序中的作用词法分析语法分析语义分析中间代码优化中间代码生成目标代码生成分析合成第六章语义分析6.1语义分析概述6.2符号表6.3类型的语义分析6.4声明的语义分析6.5程序体的语义分析6.6属性文法和动作文法6.1语义分析概述语法(Syntax)和语义(Semantics)的区别语义分析的必要性程序设计语言语义的分类如何描述程序设计语言的语义?语义分析的主要任务语法和语义的区别语法:是描述一个合法定义的程序结构的规则例如:<函数调用语句>id(<实参表达式>)语义:说明一个合法定义的程序的含义intx;floatf();x();x=
2、f();符合变量声明的语法、语义符合函数声明的语法、语义符合函数调用的语法、不符合语义符合赋值语句的语法、不符合语义语义分析的必要性一个语法正确的程序不能保证它是有意义的!程序中容易出现各种语义错误:标识符未声明操作数的类型与操作符的类型不匹配……程序设计语言语义的分类静态语义编译时(compile-time)可以检查的语义例如:标识符未声明动态语义目标程序运行时(run-time)才能检查的语义例如:除零溢出错误如何描述程序设计语言的语义?程序设计语言的形式语义属性文法(用于描述静态语义)操作语义(OperationalSemantics)指称语义
3、(DenotationalSemantics)代数语义(AlgebraSemantics)公理语义(AxiomaticSemantics)形式语义技术没有形式语法成熟硕士研究生的课程-《形式语义学》语义分析的主要任务根据声明部分建立符号表存储标识符的属性,以便检查语义错误和为代码生成提供信息;在整个程序范围内检查语义错误声明和使用相关的错误类型相关的语义错误一般地,语义分析是伴随着语法分析完成的;常见的语义错误声明和使用相关的语义错误标识符没有声明;重复声明;如何检查?每当遇到新声明的标识符,查符号表如果当前有效的所有标识符中有相同名字的,则是重复声
4、明错误;否则生成它的属性信息,保存到符号表中;每当遇到标识符的使用,查符号表如果没有找到,说明该标识符没有声明;否则,得到该标识符的属性,进行进一步分析;常见的语义错误类型相关的语义错误各种条件表达式的类型不是布尔类型;运算符的分量类型不相容;赋值语句左右类型不相容;形实参类型不相容;函数调用参数个数不同;f(…..)中f不是函数标识符;下标表达式(数组)不是合法类型;函数说明和函数返回类型不相容;……第六章语义分析6.1语义分析概述6.2符号表6.3类型的语义分析6.4声明的语义分析6.5程序体的语义分析6.6属性文法和动作文法6.2符号表什么是符
5、号表(SymbolTable)?符号表可看作是从标识符名字到它的属性的映射;用于存储程序中声明的标识符及其属性;标识符名字属性xint,variable,……pvoid,function,(inti),…………….6.2符号表为什么在语义分析时需要符号表(SymbolTable)?从标识符的Token定义,我们仅仅知道了标识符的名字,对于其它属性,例如类型,种类等没有记录对于标识符的更多信息需要进行语义分析,从而检查语义错误;标识符名字属性xint,variable,……pvoid,function,(inti),…………….6.2符号表为表示标识符
6、的属性,我们需要建立标识符的内部表示类型的内部表示值的内部表示符号表的组织标识符的作用域局部化的符号表全局化的符号表符号表的接口函数知识关系图语义分析需要标识符的更多信息符号表标识符的属性标识符的内部表示类型的内部表示值的内部表示标识符的内部表示标识符的不同种类常量标识符类型标识符变量标识符函数标识符过程标识符域名标识符typedefenum{constKind,typeKind,varKind,procKind,funcKind,fieldKind}idKid;标识符的内部表示不同种类标识符的属性常量:(类型,值)类型:(类型)变量:(类型,层数,
7、偏移)函数:(返回类型,形参定义,代码地址,空间大小,…….)过程:(形参定义,代码地址,空间大小,…….)域名:(类型,偏移,所在结构类型)常量标识符的属性TypePtr指向常量类型内部表示的指针;Kind标识符的种类,所有常量的kind=constKind;Value常量的值;TypePtrKindValueconstKind类型标识符的属性TypePtr指向类型内部表示的指针;Kind标识符的种类,所有类型标识符的kind=typeKind;TypePtrKindtypeKind变量标识符的属性TypePtr指向变量类型的内部表示;Kind标识
8、符的种类,所有变量标识符的Kind=varKind;Access:(dir,indir);Level:层数O