程序的语义分析.ppt_第1页
程序的语义分析.ppt_第2页
程序的语义分析.ppt_第3页
程序的语义分析.ppt_第4页
程序的语义分析.ppt_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、程序的语义分析,主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析;,声明的语义分析,语义分析工作: 建立符号表; 检查标识符的重复声明; 声明部分: 标号声明:LabelDecPart; 常量声明:ConsDecPart; 类型声明:TypeDecPart; 变量声明:VarDecPart; 过函声明:RoutDecPart;,LabelDecPart label , ; | ConstDecPart const id = C ; .; id = C ; | TypeDecPart type id = T ; .; id = T ; | VarDecPart

2、 var VarList: T ; .; VarList: T ; | RoutDecPart RoutDec ; .; RoutDec ; | RoutDec ProcHead ; Block | FuncHead ; Block ProcHead procedure id (ParamDecList) FuncHead function id (ParamDecList): Type ParamDecList ParamDec ; . ; ParamDec ParamDec VarList : Type | var VarList : Type | ProcHead | FuncHead,

3、标号LabelPart,标号出现的位置: 标号声明:label 1, 2, , n; 标号定位(语句前):i:Statement; 标号使用(Goto后):goto i; 标号部分的语义错误: 标号重复声明; 标号重复定位; 标号有定位而无声明; 标号有使用而无定位; Goto语句有非法转入.,标号部分语义分析原理,设置三种表:LDEC,LDEF,LUSE LDEC表:(Flag, Label)以子程序为局部单位; LDEF、LUSE表:(Label) 以结构体为局部单位 标号声明部分label 1, 2,n:(填写LDEC表) 建立本层LDEC;令Flag:=0;检查是否有重复声明; 标号定

4、位部分:Statement: (填写LDEF表) 若LDEC中没有,则表示该标号未声明; 否则:若的flag是1,则表示有重复定位错误, 否则令flag:=1,并将填入LDEF表中。 标号使用 goto : (填写LUSE表) 若LDEF表中没有,则将填入LUSE表中,表示的 定位可能在后。,进入结构语句时:记录本段LDEF和LUSE。 结束时:将LUSE表中LDEF中的项删除,删除 本段LDEF表, LUSE表保留。 进入过函时:记录本层LDEC、LDEF表; 退出时:将LUSE表中LDEF中的项删除,删除 本层LDEC表和LDEF表,LUSE表保留。 进入主程序时:记录本层LDEC 、LD

5、EF表; 结束时:检查LUSE是否为空,若非空表示有 非法转入或使用了无定位的标号。,常量声明的语义处理,形式:ConsDecPart const ConsDecList ConsDecList ConsDec ;ConsDecList ConsDec id = C id = C 的语义处理原理: 求C.type , C.val 查符号表是否有标识符id;若有则重复 声明错误 否则构造 (id,C.type,consKind,C.value) 填写到符号表中,类型声明的语义处理, 形式:TypeDecPart type TypeDecList TypeDecList TypeDec ;Type

6、DecList TypeDec id = T id = T的语义分析要点: 对T进行类型分析返回内部表示指针TPtr; 检查符号表是否有重复声明; 若无则构造符号表: ( id , TPtr, typeKind, false/true) 当整个类型声明部分结束时,进行超前指针 类型结点的回填工作,变量声明部分, 形式:VarDecPart var VarDecList VarDecList VarDec ; VarDecList VarDec idList : T id1,idK:T的语义分析要点: 检查符号表是否有重复声明; 构造符号表项: 1 jK, (idj,tp,varKind,Acc

7、ept,Level,offj),其中tp 和offj的值等待回填; 对T进行类型分析返回指针TPar; 回填符号表中的tp指针; off的确定:off:=off+ TPar.size;,过/函声明的处理, 形式:RoutDec ProcHead;Block|FuncHead;Block ProHead procedure id (ParamDecList) FuncHead function id (ParamDecList):Type ParamDec idList : Type | var VarList : Type | ProcHead | FuncHead Block DecPart

8、;Body |forward 处理要点: 子程序首部的处理 HeadProcess 声明部分的处理 语句部分的处理,过函首部的处理, 过函名id:填写符号表项:(id,void/?,routKind,L,?,actual,?,?,?) 形参:进入新的局部化区level:= L+1;第一个形参的offset 由系统确定设为off0;构造第i个形参的符号表项: 值参:(xi,tpi,varKind,dir,L+1,offi) offi := offi-1 + sizeof(tpi-1) 变参:(xi,tpi,varKind,indir,L+1,offi) offi := offi-1 + 1 过函

9、形参:(r,void/?,routKind,L+1,?,formal,offr) 进入新的局部化区leve:= L+2,形参同上处理, 但off值为空。结束时结束局部化区;回填值。 首部结束:回填类型及形参表地址。 forward值:如果过函体为forward则为1否则为0,子程序首部的处理例子,Procedure p(x:real ; var y : boolean ; function f(i ,j : integer) : integer) 当前层数为L,InitOff=1.则:,程序体部分的语义分析,表达式的语义分析 赋值语句的语义分析 调用语句的语义分析 标号语句的语义分析 结构语句

10、的语义分析,表达式的语义分析,任务:检查运算分量的类型相容性,求表 达式类型。 分析: C V: id、VarE、Var.id、Var E op E,赋值语句的语义分析,任务:检查赋值相容性 分析步骤: var 的类型分析 var.Type E 的类型分析 E.Type 判定var.Type和E.Type是否赋值相容,调用语句的语义分析,任务:形实结合的相容性。函数求出返回类型。 原理:P(AE1, .,AEn ) 用P查符号表,找出无声明错 routkind?, 找出非过/函标识符 Params保证个数相同,对应类型相容,类别相同 。,结构语句的语义分析,问题:结构语句结束符对应多个结构语句结束。 解决办法:对结构化语句重新定义,使得每个结构化语句都自带结束符 。,for i = 1 to 10 do for j = 1 to 100 do begin A i , j = 0 ; end ;,修改后的结构语句的定义,StatementIF Expr THEN Statement FI StatementIF Expr THEN Statement ELSE Statement FI StatementWHILE Expr DO Statement OD St

温馨提示

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

评论

0/150

提交评论