Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "程序的语义分析 主要内容: 声明的语义分析; 执行体的语义分析: 表达式的语义分析; 语句的语义分析;"— 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  id 1, …,id K :T 的语义分析要点:  检查符号表是否有重复声明;  构造符号表项 : 1  j  K, (id j,tp,varKind,Accept,Level,off j ), 其中 tp 和 off j 的值等待回填;  对 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  由系统确定设为 off 0 ;构造第 i 个形参的符号表项: 值参: (x i,tp i,varKind,dir,L+1,off i ) off i := off i-1 + sizeof(tp i-1 ) 变参: (x i,tp i,varKind,indir,L+1,off i ) off i := off i-1 + 1 过函形参: (r,void/?,routKind,L+1,?,formal,off r ) 进入新的局部化区 leve:= L+2 ,形参同上处理, 但 off 值为空。结束时结束局部化区;回填值。 首部结束:回填类型及形参表地址。  forward 值:如果过函体为 forward 则为 1 否则为 0

12 子程序首部的处理例子 Procedure p(x:real ; var y : boolean ; function f(i,j : integer) : integer) 当前层数为 L,InitOff=1. 则: falsesizecod e actualpara P LroutKindvoidp pEntry L+2dirvarKindintPtri L+2dirvarKindintPtrj iEntry jEntry 2L+1indirvarKindboolPtry yEntry 1L+1dirvarKindrealPtrx xEntry 3formalparaFL+ 1 routKindintPtrf fEntry

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(AE 1,...,AE n )  用 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 S 1 else S 2 fi 分析步骤: ① 创建本层 LDEF,LUSE 表 ② E 的分析; E.Type ? boolptr ③ 分析 S 1 ④ 有 else 则分析 S 2 ⑤ 删掉本层 LDEF 。


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

Similar presentations


Ads by Google