欢迎来到天天文库
浏览记录
ID:58716213
大小:150.00 KB
页数:59页
时间:2020-10-04
《第05章 语义分析(下)ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第05章语义分析主要内容:语义分析基础符号表类型分析声明和执行体的语义分析5.4声明的语义分析语义分析工作:建立符号表;检查标识符的重复声明;声明部分:标号声明:LabelDecPart;常量声明:ConsDecPart;类型声明:TypeDecPart;变量声明:VarDecPart;过函声明:RoutDecPart;5.4.1声明的语法结构1)标号声明:→labelL{,L};2)常量声明:→constid=C;{id=C;}3)类型声明:→typeid=T;{id=T;}4)变量声明:2、rt>→var:T;{:T;}5)过函声明:→;{;}→;3、;→procedureid()→functionid():Type→{;}→:Type4、var:Type5、procedureid6、f7、unctionid→beginend
2、rt>→var:T;{:T;}5)过函声明:→;{;}→;
3、;→procedureid()→functionid():Type→{;}→:Type
4、var:Type
5、procedureid
6、f
7、unctionid
8、forward*5.4.2标号声明部分的语义分析标号出现的位置:标号声明:labelL1,L2,…,Ln;标号定位(语句前):Li:Statement;标号使用(Goto后):gotoLi;标号部分的语义错误:标号重复声明;标号重复定位;标号有定位而无声明;标号有使用而无定位;Goto语句有非法转入.标号部分语义分析原理设置三种表:LDEC,LDEF,LUSELDEC表:(Flag,Label)以子程序为局部单位;LDEF、LUSE表:(Label)以结构体为局部单位分析内容:[1]标号声明部分(labelL1
9、,L2,…,Ln):(填写LDEC表)建立本层LDEC,令Flag:=0;检查是否有重复声明。[2]标号定位部分(L:Statement):(填写LDEF表)1)检查LDEC中没有L,若无,则表示该标号未声明错;否则:检查flag,若是1,则表示有重复定位错误,否则,令flag:=1,并将L填入LDEF表中;2)检查LUSE中没有L,若有,则将其删除。[3]标号使用(gotoL):(填写LUSE表)检查LDEF表中没有L,若无,则将L填入LUSE表中,表示L的定位可能在后。[4]进入结构语句时:记录本段LDEF和LUSE。[5]结束时:将LUSE表中LDEF中的项删除,删除本段LDEF表,
10、LUSE表保留。[6]进入过函时:记录本层LDEC、LDEF表。[7]退出时:删除本层LDEC表和LDEF表,若是主程序的结束时,检查LUSE是否为空,若非空表示有非法转入或使用了无定位的标号。LabelDecPart的实现算法:VoidLabelDecPart();//labelL1,L2,…,Ln;{EnterCurrentLDECaddr;//记录本层LDEC地址L:next_token();EnterLabel(token.seman,Present);//登记LDEC表项if(Present)error();//重复声明错next_token();if(token.class==
11、“,”)GOTOL}5.4.3常量声明部分的语义分析形式:→const;→[;]→id=Cid=C的语义处理原理:求C.type,C.value查符号表是否有标识符id;若有则重复声明错误否则,构造(id.name,C.type,consKind,C.value)填写到符号表中。→const;VoidConsDecPart(){next_token();ConsDefList();}12、efList>→[;]VoidConsDefList(){ConsDef();next_token();if(token.class==ID)ConsDefList()}→id=CVoidConsDef(){cname=token.seman;//记录idnext_token();next_token();//读“=”和“C”cPtr=ConstType(to
12、efList>→[;]VoidConsDefList(){ConsDef();next_token();if(token.class==ID)ConsDefList()}→id=CVoidConsDef(){cname=token.seman;//记录idnext_token();next_token();//读“=”和“C”cPtr=ConstType(to
此文档下载收益归作者所有