1 / 19

程序的语义分析

程序的语义分析. 主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析;. 声明的语义分析. 语义分析工作: 建立符号表; 检查标识符的重复声明; 声明部分: 标号声明: LabelDecPart; 常量声明: ConsDecPart; 类型声明: TypeDecPart; 变量声明: VarDecPart; 过函声明: RoutDecPart;. LabelDecPart → label  { ,  }; | 

kolya
Download Presentation

程序的语义分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 程序的语义分析 主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析;

  2. 声明的语义分析 • 语义分析工作: 建立符号表; 检查标识符的重复声明; • 声明部分: 标号声明:LabelDecPart; 常量声明:ConsDecPart; 类型声明:TypeDecPart; 变量声明:VarDecPart; 过函声明:RoutDecPart;

  3. LabelDecPart → label{ ,  }; |  ConstDecPart → const id = C ; ...; id = C ; |  TypeDecPart → type id = T ; ...; id = T ; |  VarDecPart → 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

  4. 标号-LabelPart • 标号出现的位置: 标号声明:label 1, 2, …, n; 标号定位(语句前):i:Statement; 标号使用(Goto后):goto i; • 标号部分的语义错误: 标号重复声明; 标号重复定位; 标号有定位而无声明; 标号有使用而无定位; Goto语句有非法转入.

  5. 标号部分语义分析原理 • 设置三种表:LDEC,LDEF,LUSE LDEC表:(Flag, Label)以子程序为局部单位; LDEF、LUSE表:(Label) 以结构体为局部单位 • 标号声明部分label 1, 2,…,n:(填写LDEC表) 建立本层LDEC;令Flag:=0;检查是否有重复声明; • 标号定位部分:Statement: (填写LDEF表) 若LDEC中没有,则表示该标号未声明; 否则:若的flag是1,则表示有重复定位错误, 否则令flag:=1,并将填入LDEF表中。 • 标号使用 goto :(填写LUSE表) 若LDEF表中没有,则将填入LUSE表中,表示的 定位可能在后。

  6. 进入结构语句时:记录本段LDEF和LUSE。 结束时:将LUSE表中LDEF中的项删除,删除 本段LDEF表, LUSE表保留。 • 进入过函时:记录本层LDEC、LDEF表; 退出时:将LUSE表中LDEF中的项删除,删除 本层LDEC表和LDEF表,LUSE表保留。 • 进入主程序时:记录本层LDEC 、LDEF表; 结束时:检查LUSE是否为空,若非空表示有 非法转入或使用了无定位的标号。

  7. 常量声明的语义处理 • 形式:ConsDecPart → const ConsDecList   ConsDecList → ConsDec {;ConsDecList} ConsDec → id = C • id = C 的语义处理原理: 求C.type , C.val 查符号表是否有标识符id;若有则重复 声明错误 否则构造 (id,C.type,consKind,C.value) 填写到符号表中

  8. 类型声明的语义处理  形式:TypeDecPart → type TypeDecList TypeDecList → TypeDec {;TypeDecList} TypeDec → id = T  id = T的语义分析要点:  对T进行类型分析返回内部表示指针TPtr; 检查符号表是否有重复声明;  若无则构造符号表: ( id , TPtr, typeKind, false/true) 当整个类型声明部分结束时,进行超前指针 类型结点的回填工作

  9. 变量声明部分  形式:VarDecPart → var VarDecList VarDecList → VarDec {; VarDecList} VarDec  idList : T  id1,…,idK:T的语义分析要点:  检查符号表是否有重复声明; 构造符号表项: 1 jK, (idj,tp,varKind,Accept,Level,offj),其中tp 和offj的值等待回填;  对T进行类型分析返回指针TPar; 回填符号表中的tp指针; off的确定:off:=off+ TPar.size;

  10. 过/函声明的处理  形式:RoutDec → ProcHead;Block|FuncHead;Block • ProHead → procedure id (ParamDecList) FuncHead→ function id (ParamDecList):Type ParamDec → idList : Type | var VarList : Type | ProcHead | FuncHead Block → DecPart;Body |forward  处理要点: 子程序首部的处理 HeadProcess 声明部分的处理 语句部分的处理

  11. 过函首部的处理  过函名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 过函形参:(r,void/?,routKind,L+1,?,formal,offr) 进入新的局部化区leve:= L+2,形参同上处理, 但off值为空。结束时结束局部化区;回填值。 首部结束:回填类型及形参表地址。  forward值:如果过函体为forward则为1否则为0

  12. jEntry j intPtr varKind dir L+2 i intPtr varKind dir L+2 iEntry fEntry f intPtr routKind L+1 paraF formal 3 yEntry y boolPtr varKind indir L+1 2 x realPtr varKind dir L+1 1 xEntry pEntry p void routKind L paraP actual code size false 子程序首部的处理例子 Procedure p(x:real ; var y : boolean ; function f(i ,j : integer) : integer) 当前层数为L,InitOff=1.则:

  13. 程序体部分的语义分析 • 表达式的语义分析 • 赋值语句的语义分析 • 调用语句的语义分析 • 标号语句的语义分析 • 结构语句的语义分析

  14. 表达式的语义分析 • 任务:检查运算分量的类型相容性,求表 • 达式类型。 • 分析: • C • V: id、Var[E]、Var.id、Var • E op E

  15. 赋值语句的语义分析 • 任务:检查赋值相容性 • 分析步骤: • var 的类型分析 var.Type • E 的类型分析 E.Type • 判定var.Type和E.Type是否赋值相容

  16. 调用语句的语义分析 • 任务:形实结合的相容性。函数求出返回类型。 • 原理:P(AE1, ...,AEn ) • 用P查符号表,找出无声明错 • routkind?, 找出非过/函标识符 • Params保证个数相同,对应类型相容,类别相同 。

  17. 结构语句的语义分析 • 问题:结构语句结束符对应多个结构语句结束。 • 解决办法:对结构化语句重新定义,使得每个结构化语句都自带结束符 。 for i = 1 to 10 do for j = 1 to 100 do begin A [ i , j ] = 0 ; end ;

  18. 修改后的结构语句的定义 • Statement→IF Expr THEN Statement FI • Statement→IF Expr THEN Statement ELSE • Statement FI • Statement→WHILE Expr DO Statement OD • Statement→FOR ............... DO Statement OD • Statement→BEGIN StatemenList END

  19. 修改后的if语句的分析 • 形式:if E then S1 else S2 fi • 分析步骤: • ① 创建本层LDEF,LUSE表 • ② E的分析;E.Type ?boolptr • ③ 分析S1 • ④ 有 else 则分析S2 • ⑤ 删掉本层LDEF。

More Related