程序的语义分析 主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析
程序的语义分析 主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析;
声明的语义分析 语义分析工作: 建立符号表; 检查标识符的重复声明 C声明部分 标号声明:Labe| DecPart; 常量声明: ConsDecPart 类型声明: TypeDecPart; 变量声明: Var DecPart; 过函声明: RoutDec Part
声明的语义分析 语义分析工作: 建立符号表; 检查标识符的重复声明; 声明部分: 标号声明:LabelDecPart; 常量声明:ConsDecPart; 类型声明:TypeDecPart; 变量声明:VarDecPart; 过函声明:RoutDecPart;
Label dec art→labe{,};|λ ConstDec Part→ 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 I var VarList: Type I ProcHead FuncHead
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
标号-Labe|Part 标号出现的位置: 标号声明:labe 标号定位(语句前):: Statement 标号使用(Goto后):goto; 标号部分的语义错误: 标号重复声明 标号重复定位; 标号有定位而无声明 标号有使用而无定位 Goto语句有非法转入
标号-LabelPart 标号出现的位置: 标号声明:label 1, 2, …, n; 标号定位(语句前): i:Statement; 标号使用(Goto后):goto i; 标号部分的语义错误: 标号重复声明; 标号重复定位; 标号有定位而无声明; 标号有使用而无定位; Goto语句有非法转入
标号部分语义分析原理 设置三种表:LDEG,LDEF,LUSE LDEC表:(F|ag,Labe)以子程序为局部单位 LDEF、LUSE表:(Labe)以结构体为局部单位 ÷标号声明部分labe!1,2,…,n:(填写LDEC表) 建立本层LDEC;令Fag:=0;检查是否有重复声明 标号定位部分: Statement:(填写LDEF表) 若LDEG中没有,则表示该标号未声明 否则:若的fag是1,则表示有重复定位错误, 否则令flag:=1,并将填入LDE表中 标号使用goto:(填写LUSE表) 若LDEF表中没有,则将填入LUSE表中,表示 的 定位可能在后
标号部分语义分析原理 设置三种表: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表中,表示 的 定位可能在后
进入结构语句时:记录本段LDEF和LUSE。 结束时:将LUSE表中LDEF中的项删除,删除 本段LDE表,LUSE表保留 进入过函时:记录本层LDEC、LDEF表; 退出时:将LUSE表中LDEF中的项删除,删除 本层LDEC表和LDEF表,LUSE表保留。 进入主程序时:记录本层LDEC、LDE表; 结束时:检查凵USE是否为空,若非空表示有 非法转入或使用了无定位的标号
进入结构语句时:记录本段LDEF和LUSE。 结束时:将LUSE表中LDEF中的项删除,删除 本段LDEF表, LUSE表保留。 进入过函时:记录本层LDEC、LDEF表; 退出时:将LUSE表中LDEF中的项删除,删除 本层LDEC表和LDEF表,LUSE表保留。 进入主程序时:记录本层LDEC 、LDEF表; 结束时:检查LUSE是否为空,若非空表示有 非法转入或使用了无定位的标号
常量声明的语义处理 形式: Cons DecPart→ const Cons DecList ConsDecList Cons Dec Cons DecList] ConsDec id = c id=C的语义处理原理: ◆求G.type,C.val ◆查符号表是否有标识符id;若有则重复 声明错误 否则构造 (id, C. type consK ind, C value) 填写到符号表中
常量声明的语义处理 形式: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 Type DecList - Type Dec [; Type DecList] TypeDec→id=T ◆id=T的语义分析要点: ◆对T进行类型分析返回内部表示指针TPtr; 检查符号表是否有重复声明 若无则构造符号表: id, TPtr, typeK ind, fal se/true 当整个类型声明部分结束时,进行超前指针 类型结点的回填工作
类型声明的语义处理 形式:TypeDecPart → type TypeDecList TypeDecList → TypeDec {;TypeDecList} TypeDec → id = T id = T的语义分析要点: 对T进行类型分析返回内部表示指针TPtr; 检查符号表是否有重复声明; 若无则构造符号表: ( id , TPtr, typeKind, false/true) 当整个类型声明部分结束时,进行超前指针 类型结点的回填工作
变量声明部分 ◆形式: Var DecPart→ var var Declist Var DecList- Var Dec: Var DecListh VarDec→) idlist:T ◆id1,idk:T的语义分析要点: ◆检查符号表是否有重复声明 ◆构造符号表项:1≤j≤K, (id;,tp, varkind, Accept, Level,off,其中tp 和off的值等待回填; 对T进行类型分析返回指针TPar ◆回填符号表中的tp指针; ◆off的确定:off:=of+TPar个.size;
变量声明部分 形式:VarDecPart → var VarDecList VarDecList → VarDec {; VarDecList} VarDec → idList : T id1,…,idK:T的语义分析要点: 检查符号表是否有重复声明; 构造符号表项: 1 jK, (idj,tp,varKind,Accept,Level,offj),其中tp 和offj的值等待回填; 对T进行类型分析返回指针TPar; 回填符号表中的tp指针; off的确定:off:=off+ TPar.size;
过/函声明的处理 形式: RoutDec→ Prochead; Block| FuncHead; Block ProHead procedure id(Param DecList FuncHead- function id(ParamDecL ist): Type ParamDec idList Type var varlist Type ProcHead FuncHead Block -DecPart, Body forward ◆处理要点: 子程序首部的处理 HeadProcess 声明部分的处理 语句部分的处理
过/函声明的处理 形式: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 声明部分的处理 语句部分的处理