【推选文档】程序的语义分析PPT

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

offi := offi-1 + sizeof(tpi-1) var 的类型分析 var. 修改后的结构语句的定义
标号语句的语义分析
结构语句的语义分析 查符号表是否有标识符id;
形式:if E then S1 else S2 fi
表达式的语义分析
任务:检查运算分量的类型相容性,求表 Goto语句有非法转入.
LabelDecPart → label { , }; |
ConstDecPart → const id = C ; ...; id = C ; |
TypeDecPart → type id = T ; ...; id = T ; |
VarDecPart → var VarList: T ; ...; VarList: T ; |
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
ParamDecList → ParamDec ; ......... ; ParamDec
ParamDec → VarList : Type
| var VarList : Type
| ProcHead
| FuncHead
标号-LabelPart
标号出现的位置: 标号声明:label 1, 2, …, n; 标号定位(语句前): i:Statement; 标号使用(Goto后):goto i;
RoutDecPart → RoutDec ; ...; RoutDec ; |
RoutDec → ProcHead ; Block | FuncHead ; Block
ProcHead → procedure id (ParamDecList)
FuncHead → function id (ParamDecList): Type
标号使用 goto : (填写LUSE表) 若LDEF表中没有 ,则将 填入LUSE表中,表示
的 定位可能在后。
进入结构语句时:记录本段LDEF和LUSE。 结束时:将LUSE表中LDEF中的项删除,删除 本段LDEF表, LUSE表保留。
进入过函时:记录本层LDEC、LDEF表; 退出时:将LUSE表中LDEF中的项删除,删除 本层LDEC表和LDEF表,LUSE表保留。
修改后的if语句的分析
形式:if E then S else S fi ; RoutDec ; |
进入过函时:记录本层LDEC、LDEF表;
1
2
RoutDecPart → RoutDec ; .
分析步骤: 标号定位部分 :Statement: (填写LDEF表)
; id = C ; |
形式:if E then S1 else S2 fi
① 创建本层LDEF,LUSE表 id1,…,idK:T的语义分析要点:
回填符号表中的tp指针;
DO Statement OD
② E的分析;E.Type ?boolptr var 的类型分析 var.
ParamDecList → ParamDec ; .
子程序首部的处理 HeadProcess
③ 分析S1 Procedure p(x:real ; var y : boolean ;
id = T的语义分析要点: 对T进行类型分析返回内部表示指针TPtr; 检查符号表是否有重复声明; 若无则构造符号表: ( id , TPtr, typeKind, false/true) 当整个类型声明部分结束时,进行超前指针 类型结点的回填工作
变量声明部分
形式:VarDecPart → var VarDecList VarDecList → VarDec {; VarDecList} VarDec idList : T
▪ E op E 标号定位部分 :Statement: (填写LDEF表)
赋值语句的语义分析
任务:检查赋值相容性 分析步骤: ▪ var 的类型分析 var.Type ▪ E 的类型分析 E.Type ▪ 判定和是否赋值相容
调用语句的语义分析
任务:形实结合的相容性。函数求出返回类 型。
原理:P(AE1, ...,AEn ) ▪ 用P查符号表,找出无声明错 ▪ routkind?, 找出非过/函标识符 ▪ Params保证个数相同,对应类型相容,类别
| var VarList : Type
| ProcHead | FuncHead
Block → DecPart;Body |forward
处理要点:
子程序首部的处理 HeadProcess
声明部分的处理
语句部分的处理
过函首部的处理
过函名id:填写符号表项: (id,void/?,routKind,L,?,actual,?,?,?)
id = C 的语义处理原理: 求C.type , C.val 查符号表是否有标识符id;若有则重复 声明错误 否则构造 (id,C.type,consKind,C.value) 填写到符号表中
类型声明的语义处理
形式:TypeDecPart → type TypeDecList TypeDecList → TypeDec {;TypeDecList} TypeDec → id = T
形参:进入新的局部化区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)
for i = 1 to 10 do
| var VarList : Type
达式类型。 填写到符号表中
| var VarList : Type 否则:若 的flag是1,则表示有重复定位错误,
分析: VarDecList → VarDec {; VarDecList}
过函声明:RoutDecPart; 查符号表是否有标识符id;
子程序首部的处理例子
Procedure p(x:real ; var y : boolean ; function f(i ,j : integer) : integer)
当前层数为L,InitOff=1.则:
jEntry iEntry
j intPtr varKind dir L+2 i intPtr varKind dir L+2
offi := offi-1 + 1
过函形参:(r,void/?,routKind,L+1,?,formal,offr)
进入新的局部化区leve:= L+2,形参同上处理,
但off值为空。结束时结束局部化区;回填值。
首部结束:回填类型及形参表地址。
forward值:如果过函体为forward则为1否则为0
fEntry f intPtr routKind L+1 paraF formal 3
yEntry y boolPtr varKind indir L+1 2 xEntry x realPtr varKind dir L+1 1
pEntry p void routKind L paraP actual code size false
标号声明部分label 1, 2,…, n:(填写LDEC表) 建立本层LDEC;令Flag:=0;检查是否有重复声明;
标号定位部分 :Statement: (填写LDEF表) 若LDEC中没有 ,则表示该标号未声明; 否则:若 的flag是1,则表示有重复定位错误, 否则令flag:=1,并将 填入LDEF表中。
相同 。
结构语句的语义分析
问题:结构语句结束符对应多个结构语句结束。 解决办法:对结构化语句重新定义,使得每个结
构化语句都自带结束符 。
for i = 1 to 10 do for j = 1 to 100 do begin A [ i , j ] = 0 ; end ;
修改后的结构语句的定义
修改后的结构语句的定义
▪ C FuncHead → function id (ParamDecList): Type
变量声明:VarDecPart; 变量声明:VarDecPart;
声用明P查部 ▪符分号的表处,理找出V无声:明错id、Var[E]、Var.id、Var
问题:结构语句结束符对应多个结构语句结束。
进入主程序时:记录本层LDEC 、LDEF表; 结束时:检查LUSE是否为空,若非空表示有 非法转入或使用了无定位的标号。
常量声明的语义处理
形式:ConsDecPart → const ConsDecList ConsDecList → ConsDec {;ConsDecList} ConsDec → id = C
过/函声明的处理
形式:RoutDec → ProcHead;Block|FuncHead;Block
ProHead → procedure id (ParamDecList)
FuncHead→ function id (ParamDecList):Type
ParamDec → idList : Type
程序的语义分析
主要内容:
声明的语义分析; 执行体的语义分析:
表达式的语义分析; 语句的语义分析;
声明的语义分析
语义分析工作: 建立符号表; 检查标识符的重复声明;
声明部分: 标号声明:LabelDecPart; 常量声明:ConsDecPart; 类型声明:TypeDecPart; 变量声明:VarDecPart; 过函声明:RoutDecPart;
标号部分的语义错误: 标号重复声明; 标号重复定位; 标号有定位而无声明; 标号有使用而无定位; Goto语句有非法转入.
标号部分语义分析原理
设置三种表:LDEC,LDEF,LUSE LDEC表:(Flag, Label)以子程序为局部单位; LDEF、LUSE表:(Label) 以结构体为局部单位
设置三种表:LDEC,LDEF,LUSE
④ 有 else 则分析S2
⑤ 删掉本层LDEF。
感谢观看感谢观看源自id1,…,idK:T的语义分析要点: 检查符号表是否有重复声明; 构造符号表项: 1 jK, (idj,tp,varKind,Accept,Level,offj),其中tp 和offj的值等待回填; 对T进行类型分析返回指针TPar; 回填符号表中的tp指针; off的确定:off:=off+ TPar.size;
程序体部分的语义分析
offi := offi-1 + 1
表达式的语义分析
; id = C ; | 变量声明:VarDecPart;
| var VarList : Type
赋值语句的语义分析
声明部分的处理
调用语句的语义分析 第一个形参的offset
设置三种表:LDEC,LDEF,LUSE
RoutDecPart → RoutDec ; .
相关文档
最新文档