程序的语义分析 主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析
程序的语义分析 主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析;
声明的语义分析 语义分析工作: 建立符号表; 检查标识符的重复声明 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表中,表示 的 定位可能在后