1.语义分析-语义表示基础_第1页
1.语义分析-语义表示基础_第2页
1.语义分析-语义表示基础_第3页
1.语义分析-语义表示基础_第4页
1.语义分析-语义表示基础_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章:语义分析

语义检查的内容 语法指导技术

标识符的语义表示

类型的语义表示1.1语法和语义的区别语言包括4个内容:词法、语法、语义、语用语法:关于什么样的字符串才是该语言在组成结构上合法的程序的法则。语义:关于结构上合法的程序的意义法则。一个语法正确的程序不能保证它是有意义的.程序中容易出现各种语义错误:标识符未声明操作数的类型与操作符的类型不匹配……1.2语义分析的必要性intx=10;Main(){printf(“%d”,x+x);x();

f=x;}floatf(){intx=20,y;floatx;printf(“%d”,x);}符合变量声明的语法、语义符合函数声明的语法、语义符合函数调用的语法、不符合语义符合赋值语句的语法、不符合语义符合变量声明的语法、语义符合变量声明的语法、不符合语义1.3程序设计语言语义的分类静态语义在编译阶段(compile-time)可以检查的语义例如:标识符未声明动态语义目标程序运行时(run-time)才能检查的语义例如:除零、溢出错误。根据声明部分建立符号表

符号表(symboltable):是一种供编译器用于保存有关源程序的各种信息的数据结构。符号表的每个条目中包含与一个标识符相关的信息,这些信息全面地反映该名字的属性及它们在编译过程中的特征。 符号表的作用:存储标识符的属性;便于检查语义错误;代码生成阶段作为地址分配的依据。1.4语义分析的主要任务在整个程序范围内检查常见语义错误声明和使用相关的错误类型相关的语义错误

1.4语义分析的主要任务声明和使用相关的语义错误常见的语义错误:每个使用性标识符是否都有声明?在同层内有无标识符被声明多次?

标号是否有声明?有无重复声明和重复定位错误?有无非法转入错误?如何检查?每当遇到新声明的标识符,查符号表:如果当前有效的所有标识符中有相同名字的,则是重复声明错误;否则生成它的属性信息,保存到符号表中;每当遇到标识符的使用,查符号表如果没有找到,说明该标识符没有声明;如果找到,则可获取该标识符的属性,进行进一步分析;1.5语义错误检查类型相关的语义错误各种条件表达式的类型是不是boolean型?运算符的分量的类型是否相容?赋值语句的左右部的类型是否相容?形参和实参的类型是否相容?下标表达式的类型是否为所允许的类型?1.5语义错误检查函数说明中的函数类型和返回值的类型是否一致?V[E]中的V是不是变量,而且是不是数组类型?V.id中的V是不是变量,而且是不是结构体类型?id是不是该记录类型中的成员?V↑(*V)中的V是不是指针或文件变量?y+f(....)中的f是不是函数名?形参个数和实参个数是否一致?p(....)语句中的p是不是过程名?形参个数和实参个数是否一致?子界类型中的下界和上界类型是否相容?下界是否小于等于上界?1.5语义错误检查方式一:不作为独立的一遍类型语义错误检查:可以安排在中间代码生成时进行一般的语义检查:与语法分析相结合1.6语义分析的实现方式二独立一遍的语义分析的功能图示语义分析语法分析树TokenList语义定义自然语言描述的规定符号表判定2.语法制导方法语法制导技术在处理和规则相关联的任务中有着重要的应用,语义分析过程可以采用语法制导技术来完成。语法制导就是在进行语法分析的同时要完成相应的语义动作,这些语义动作都是由一些程序组成的,要完成和用户的需求相关联的任务。编译器对一个串进行语法检查的同时,可以按照语法分析的程序的结构对程序进行我们所需要的操作,从而解决我们想要解决的问题。语法制导方法的种类:语法制导方法依赖于具体的语法分析方法,因此可以分为自顶向下语法制导方法和自底向上语法制导方法。自顶向下语法制导方法中通常采用LL(1)分析方法为基础,而自底向上语法制导方法中通常以LR(1)分析方法为基础。LL(1)语法制导方法是在LL(1)文法的基础上加入语义动作符来表示相应的语义子程序,语义动作符可以加在产生式右部的任何位置。在进行LL(1)语法分析的过程中每遇到语义动作符,则调用相应的语义子程序来完成相应的语义处理。LR(1)语法制导方法是在LR(1)文法的基础上加入语义动作符来表示相应的语义子程序,每条产生式最多配有一个语义规则,即语义动作符只能加在产生式的最右部。在进行LR(1)语法分析的过程中,每当按照某个产生式的右部进行规约时,就调用该产生式右边的相应的语义子程序来完成相应的语义处理。LL(1)语法制导方法的实例设有如下LL(1)文法:G:S→ABA→aA│bB→bB│c要求:应用语法制导翻译方法完成如下任务:对输入文法G的任意句子L,输出L中b串的长度。如串abbbbc是G的句子,则该处理器将输出4。abc#SA

B

G的原始LL(1)分析表G:S→ABA→aA

│bB→bB│cS→ABS→ABA→aAA→bB→bBB→c

G的动作文法如下:G:S→#Init#ABA→aA│b#Add#B→b#Add#B│c#Out_Val#各动作符对应的语义子程序如下:Init

m=0Out_Valprintf(“%d”,m);Addm++;G的带动作符的LL(1)分析表abc#SS→#init#ABS→#init#ABAA→aAA→b#Add#BB→b#Add#BB→c#Out_Val#G[S]:S→#init#ABA→aA│b#Add#B→b#Add#B│c#Out_Val##Init#

#init#

AB#Derivation对给定的终极符串abbbc,分析过程:S#

abbbc#DerivationMatch语法制导的实现过程(1)例G[s]:[1]S→#init#AB

[2]A→aA [3]A→b#Add# [4]B→b#Add#B [5]B→c#Out_Val#

{a}{b}{c}{a}{b}

abbbc#

AB#

aAB#

b#Add#B#Derivation#Add#Match

abbbc#

abbbc#

AB#

bbbc#

bbbc#

bbc#

#Add#

B#

B#

bbc#Success对给定的终极符串abbbc,分析过程(续):语法制导的实现过程(2)例G[s]:[1]S→#init#AB [2]A→aA [3]A→b#Add#

[4]B→b#Add#B [5]B→c#Out_Val#

{a}{b}{c}{a}{b}Derivation

B#

bbc#

b#Add#

B#

bbc#Match#Add#

#Add#

B#

bc#

B#

bc#

b#Add#

B#

bc#DerivationMatch

#Add#B#

c##Add#

B#

c#Derivation

c#Out_Val#

#

c#Match

#Out_Val#

#

##Out_Val#

#

#LR(1)语法制导方法的实例设有如下文法:G:S→ABA→aA│bB→bB│c要求:应用LR(1)语法制导翻译方法完成如下任务:对输入文法G的任意句子L,输出L中b串的长度。如串abbbbc是G的句子,则该处理器将输出4。0SABAaAAb#bcbc1SABBbBBc###5BbBBbBBc###4S

AB

#3Abbc2AaAAaAAbbcbcbc8BbB#6Bc#AbcBbBabc设有如下文法:G:S→ABA→aA│bB→bB│c7AaAbcAabLR(1)状态机LR(1)分析表abc#SAB0S2S311S5S642S2S373R3R34Acc5S5S686R57R2R28R4实例动作文法如下:G:S→AB//#out_Val#A→aA│b//#Add#

B→bB//#Add#

│c状态栈符号栈输入串ActionGoTo0#abbbc#S20,2 #abbbc#S30,2,3#abbbc#

R37 0,2,7#aAbbc#R2

1

0,1

#Abbc#

S50,1,5#Abbc#S5 0,1,5,5#Abbc#S6 0,1,5,5,6#Abbc#R580,1,5,5,8#AbbB#R480,1,5,8#AbB#R440,1,4#AB#Acc

LR(1)分析过程G:S→AB[1]

//#Out_Val#A→aA[2]│b[3]//#Add#B→bB[4]//#Add#│c[5]m=0m=1m=2m=3分析表3语义分析处理后的结果Token序列语义分析NewToken序列符号表常量表类型表数组信息表记录信息表……特殊符3.1标识符在程序中的出现声明性出现如:intx,inta[10];Pascal语言中出现在程序头、函数头部分使用性出现如:x=x+1;a[0]=a[1]+a[2];Pascal语言中出现在程序体函数体部分3.2标识符的种类常量标识符类型标识符变量标识符实在变量形参变量值引用型地址引用型过函标识符实在过函形式过函域名标识符3.3标识符的属性标识符的语义信息要把其主要内容区分开,标识符的主要信息主要包括以下几个:名字种类信息类型信息对不同类型的独特的信息3.4标识符的语义表示

常量标识符其中各个域的含义如下:Name是常量的名字;Kind=constKind,表明该标识符是常量标识符;Type=TypePtr,其中TypePtr是指向具体常量的类型的内部表示的指针;Value=ValPtr,其中ValPtr是指向具体常量值的内部表示的指针。ValueTypeKindName常量标识符pai和count的内部表示为:↑<3.14>realPtrconstKindpai例:C语言的常量定义:

#definepai3.14 #definecount100↑<100>intPtrconstKindcount3.4标识符的语义表示类型标识符Name是类型标识符的名字;Kind=typeKind,表示标识符是类型标识符;Type=TypePtr,指向类型标识符指代的类型的内部表示。TypeKindName例:C语言的类型定义:

typedefintt1; typedefintt2[10];intPtrtypeKindt1typeKindt2ElemTypeintPtrSizeKind

10ArrayTyLow

Up09类型标识符t1和t2的内部表示为:SizeKind1intTy3.4标识符的语义表示变量标识符的内部表示Kind=varKind,表明该标识符是变量标识符;Access=dir表示变量是直接变量,Access=indir表示变量是间接变量;Level表示该变量声明所在主程序/函数/过程的层数;Off表示该变量相对它所在主程序/函数/过程的内存块起始地址的偏移量;Value=ValPtr,如果变量定义时说明了初值,则为初值的内部表示的指针,否则为空。OffLevelAccessTypeKindValueNameoffLdirintPtrvarKind↑<10>xOff+1LdirrealPtrvarKindnullyOff+3LindirvarKindnullz变量标识符x、y和z的内部表示为(当前层为L,当前偏移量为off):例:

C语言的变量声明:

intx=10; floaty;

float*z;realPtrpointTy1NameForwardSizeCodeClassParamLevelKindTypeoff3.4标识符的语义表示过程/函数标识符的内部表示Type表示函数返回值类型的内部表示(过程情形是NULL)Kind=routKind;

Level表示过/函的层数;Off只对形式过/函有效,表示形式过/函在所属过/函内存块中的偏移;NameForwardSizeCodeClassParamLevelKindTypeoff3.4标识符的语义表示过程/函数标识符的内部表示Param表示过/函的参数表指针,参数表的结构同符号表的结构相同,参数信息可以填入符号表,也可以填入单独的参数表当中;Class=actual表示实在过/函,Class=formal表示形式过/函;Code只对实在过/函有效,表示过/函定义对应生成的目标代码的起始地址,当目标代码生成时回填得到,形式过/函的code为NULL;NameForwardSizeCodeClassParamLevelKindTypeoff3.4标识符的语义表示过程/函数标识符的内部表示Size只对实在过/函有效,表示过/函的过程活动记录所占内存区的大小,也要当目标代码生成以后回填得到;Forward属性只对实在过/函有效,Forward=true表示过/函是超前声明,Forward=false表示过/函不是超前声明。ffalseXXXactualLroutKindintPtroff0L+1dirintPtrvarKindxoff0+1L+1indirvarKindyincformalL+1routKindintPtroff0+2dirintPtrvarKindaTypePtrNameKindLeveloffParmClassCodeSizeForward例:Pascal语言的函标识符定义:

functionf(x:integer;vary:real;functioninc(a:integer):integer):integer;"头"begin......f的函数体部分

end;realPtrpointTy14.类型的语义表示类型语义信息的作用类型的语义检查分配空间的大小4.类型的语义表示类型可以分成下面几大类:标准的类型:整形、实型、bool、字符类型,这是标准的数据类型自定义的数据类型:子界类型,枚举类型结构数据类型:数组,记录指针类型类型存储占用空间大小size属性:

为方便起见,规定RealSize取2,IntSize、BoolSize、CharSize取1。4.类型的语义表示标准类型:大小、种类SizeKindIntSizeintTyBoolSizeboolTyCharSizecharTyRealSizerealTyintPtr

boolPtr

charPtr

realPtr

SizeKind1intTy1boolTy1charTy2realTy4.类型的语义表示子界类型typeletter='a'..'z';ElemTypeSizeKindLowUpcharPtr1subrangeTy'a''z'leeterPtr4.类型的语义表示枚举类型size表示枚举类型所占空间的大小;Kind=enumTy;ElemList是指向枚举常量表表头的指针.ElemListKindSize枚举常量表内部表示:Name表示枚举常量的名字;Value表示枚举常量所代表的整数值。ValueName例:c语言的枚举类型

enumcolor{red,yellow,blue}

enumTy10red1yellow2blue例:c语言的枚举类型

enumcolor{red=10,yellow=red+2,blue}

enumTy110red12yellow13blue4.类型的语义表示数组类型Size:Size=(Up-Low+1)*sizeof(ElemType)Kind=ArrayTy,表示是数组类型;Low表示数组下标的下界,在C语言中Low=0;Up表示数组下标的上界;ElemType

表示数组成分类型的内部表示指针。ElemTypeTypePtrArraySizeSizeKindArrayTyLow

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论