第06章 语义分析和符号表_第1页
第06章 语义分析和符号表_第2页
第06章 语义分析和符号表_第3页
第06章 语义分析和符号表_第4页
第06章 语义分析和符号表_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

语义分析和符号表主要内容:语义分析概述(必要性、功能、描述方法)符号表类型表达式声明和程序体的语义分析语义分析的必要性语法和语义的区别;

语法:关于什么样的字符串才是该语言在组成结构上合法的程序的法则。

语义:关于结构上合法的程序的意义的法则。语义分析的分类语义种类

静态语义:在编译阶段(从程序文本上)可以检查的语义。动态语义:通过程序的执行才能检查的语义。语义错误

各种条件表达式的类型是不是boolean型?

运算符的分量的类型是否相容?

赋值语句的左右部的类型是否相容?

形参和实参的类型是否相容?

下标表达式的类型是否为所允许的类型?

变体记录中表示情形的常量是否为合法类型?

函数说明中的函数类型和返回值的类型是否一致?

V[E]中的V是不是变量,而且是数组类型?

V.id中的V是不是变量,而且是记录类型?id是不是该记录类型中的域名?

V↑中的V是不是指针或文件变量?

y+f(....)中的f是不是函数名?形参个数和实参个数是否一致?

p(....)语句中的p是不是过程名?形参个数和实参个数是否一致?

每个使用性标识符是否都有声明?在同层内有无标识符被声明多次?

标号是否有声明?有无重复声明和重复定位错误?有无非法转入错误?

子界类型中的下界和上界类型是否相容?下界是否小于等于上界?

语义分析的内容:类型分析;标识符相关信息;语义分析的功能:检查语义错误构造标识符属性表(符号表)语义分析的实现:

与语法分析相结合语义分析的功能图示语义分析语法分析树TokenList语义定义自然语言描述规定符号表判定标识符的内部表示类型的内部表示值的内部表示三种内部表示Code标识符的内部表示

标识符种类:

常量名、类型名、变量名、函数名、过程名、域名。

TYPEidkind=(consKind,typeKind,varKind,

fieldKind,procKind,funcKind)

内部表示(AttributeIR):

常量:

类型:变量:域名*:过函:ValueKindTypePtrForwardKindTypePtrOffLevelAccessKindTypePtrHostTypeOffKindTypePtrSizeForwardClassParmLevelKindTypePtrOff

例有声明如下:

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,boolTy,charTy,realTy,enumTy,

subTy,arrayTy,recordTy,setTy,fileTy,pointerTy)

内部表示:(TypeIR)

标准类型:

sub:

enum:array:

UpLowHostTypeKindSizeLengElemsKindSizeElemTypeIndexTypeKindSizeKindSizerecord:

FixBody:

VariBody:set:file:pointer:VariBodyFixBodyKindSizeNextOffFixUnitTypeidVariUnitsCaseUnitNextVariBodyFixBodyOffCaseTypeidBaseTypeKindSizeCompTypeKindSizeTypeNameKindSize例有如下的类型定义:

at=ARRAY[1..10]OFARRAY[1..100]OFinteger;

rt=RECORDx:real;a:at;CASEu:booleanOF

false:(k:integer);

true:(y:real;b:boolean)END

构造类型的内部表示。值的内部表示

非结构类型值的内部表示:实型:指针:

有序类型:整数形式

有序类型的常量表示:

整型常量:ord(N)=N

布尔常量:ord(false)=0,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:

新表-符号表(种类、类型等信息):

有关符号表的操作:添加、作用域删除、查询

处理符号表的模块:定义符号表数据结构定义符号表上的操作符号表符号表的作用:为语义检查和代码生成提供标识符的语义信息。标识符的处理思想:

遇到定义性标识符时,在符号表中填写被定义标识符的符号项;

当遇到使用性标识符时,用该标识符查符号表求得其属性。标识符的特点标识符的作用域:标识符有效的最大程序段嵌套作用域规则:当存在标识符的嵌套声明时,最近定义的属性为标识符的当前属性局部化单位:允许有声明的程序段P:Varx,y,zVarx,m,nx:=1;m:=x+1;y:=x+1;x:=0;Q:局部化区入口Procp(…Funcf(…形式过/函p(…f(…Recordbegin…符号表的种类:全局符号表、局部符号表原则:

进入一个局部化区时,记录本层符号表的 位置

遇到定义性标识符时,构造其语义信息, 查本层符号表,若存在,则有重复声明错 误,否则将语义信息填入表中

遇到一个使用性标识符时,查表(从里层 到外层),查不到则有未定义标识符错 误,否则构造新的TOKEN 退出一个局部化区时,作废本层符号表标识符处理的原则符号表的实现用局部符号表实现procp:x,y,z procp1:x,y1,z1 procp2:y

y,z x,y1,z1,y procp3:z,a

x,y,a

x,z符号表的实现用全局符号表实现 procp0:x,y procp1:x,z y procp2:x1,y1 y

x,z

语义分析例子

programp() typeat=array[1..100]ofarray[1..10]ofinteter

var

x:real;a:at;i:integer; procp1(vara1:at;a2:at)

var

x:integer;a:real; procp2(n:integer)

varm:1..50;x:real;

m,n,x(使用性出现) end a1,a2,x,a,i(使用性出现)

end

x,a,i(使用性出现)

end标号的语义分析

标号出现的位置:

标号声明:label

1,

2,…,

n;

标号定位(语句前):

i:Statement;

标号使用(Goto后):goto

i;

标号部分的语义错误:标号重复声明;标号重复定位;标号有定位而无声明;标号有使用而无定位;

Goto语句有非法转入.标号部分语义分析原理

设置五种表:LDEC,LDEF,LUSE,SL,PL

LDEC表:(Flag,Label,<Label>);

LDEF、LUSE表:(Label);

SL表:(kind,LDEFaddr,LUSEaddr);

PL表:(LDECaddr,LDEFaddr);标号的语义分析原理

1)进入一个过/函时,将本层LDEC和LDEF的地址填入PL表;

2)遇到一个标号声明“label

1,

2,…,

n”时,建立本层LDEC表(检查重复声明错误),其中的Flag标志均设置为0;

3)遇到定位性标号“

:Statement”时:检查在LDEC表中有无ℓ,若无则表示无标号声明错误;若有,则检查其Flag位,若是1,则有重复定位错误;若Flag=0,令其Flag位为1,并将ℓ填入LDEF表中。查看LUSE表,若其中有ℓ则将其删除掉。

4)进入一个结构语句时,将本语句的LDEF和LUSE表位置填入SL表;

5)

温馨提示

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

评论

0/150

提交评论