ImageVerifierCode 换一换
格式:PPT , 页数:19 ,大小:608.50KB ,
资源ID:8611889      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-8611889.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第六章 语义分析(2).ppt)为本站会员(hskm5268)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

第六章 语义分析(2).ppt

1、第六章 语义分析,6.1 语义分析概述 6.2 符号表 6.3 类型的语义分析 6.4 声明的语义分析 6.5 程序体的语义分析 6.6 属性文法和动作文法,6.2 符号表,标识符的作用域 局部化符号表 全局化符号表 符号表的接口函数,标识符的作用域,作用域(scope) 程序中的每个标识符都有自己的作用域; 标识符的作用域是标识符可见(visible)或有效的(effective)一个程序片段,称为程序的局部化单位; 通常一个程序局部化单位是一个子程序(函数)或者分程序; 一个标识符的作用域从声明该标识符的位置开始到其所在的局部化单位的结束(其中要去掉其内部声明的同名标识符的作用域); 特别

2、地, 域名的作用域是包含该域名的结构或者联合体;,标识符的作用域(例1),var x,y,z : integer; procedure P( ); var x,y:integer;procedure Q( );var x,z:real;begin.end beginend,Pascal语言过函嵌套的例子,标识符的作用域(例2),带有分程序嵌套的C程序的例子,int a,b; void main() int a = 1;int b = 1; int b = 2; int a = 3;printf(“a=%d,b=%dn”,a,b); int a = 3;printf(“a=%d,b=%dn”,a

3、,b);printf(“a=%d,b=%dn”,a,b); ,标识符的作用域(3),int i , j ; void test(int j) real x ; int x ; . void main() char i ; int i ; ,“test”和 “main” 的作用域是什么?,符号表的处理,int i , j ; void test ( int j ) real x ; j int x ; . void main() char i ; int i ; ,j: (intPtr, varKind, 0, 1, dir),i: (intPtr, varKind, 0, 0, dir),te

4、st:(voidPtr, routKind, 0, ),j: (intPtr, varKind, 1, 0, dir),x: (realPtr, varKind, 1, 1, dir),x: (intPtr, varKind, 1, ?, dir),main:(voidPtr, routKind, 0, ),i: (charPtr, varKind, 1, 0, dir),i: (intPtr, varKind, 1, 1, dir),语义分析时对符号表的管理,标识符声明 查找符号表检查标识符是否已经被声明过; 如果是,则重复声明错; 如果不是,则建立标识符的内部表示,将其放入符号表; 标识符

5、使用 查找符号表检查标识符是否有声明; 如果是,则取出标识符的属性进行语义分析; 如果不是,则未声明错; 退出局部化单位,“删除” 该局部化单位里声明的所有标识符;,符号表的组织,第一,易于查找 顺序查找 折半查找 散列表(hash table) 第二,反映标识符的作用域,保证每次标识符的有效属性都能被找到; 局部化: 每个局部化单位的符号表作为一个独立的表处理, 即把每个局部化单位的符号表作为建表和查表单位; 全局化:把整个程序的符号表统一处理;,局部化符号表,Scope栈保存当前所有局部化单位符号表的首地址; 局部化实现原理: 进入局部化单位,建立一个新的空符号表,并将地址压入Scope栈

6、; 遇到定义性标识符(声明), 查当前符号表判定是否有重复定义,如果没有则将其属性登记到当前符号表中; 遇到使用性标识符,查符号表(从当前符号表查,如果没有,再依次查scope栈中下一个符号表,如果都没有,没有声明错;否则,找到对应的属性); 结束一个局部化单位时,删除当前符号表, 弹出scope栈顶元素; 每个局部化单位的符号表可以是 线性表; 二叉树; 散列表,局部化符号表,int i , j ; void test ( int j ) real x ; j int x ; . void main() char i ; int i ; ,Scope栈,0,全局化符号表,全局化实现原理 整个

7、程序用一个符号表, 该符号表的组织可以是 线性表; 二叉树; 散列表 每个局部化单位对应一个唯一的局部化编号num; 符号表的表项为(num, id, attributes); 初始化: CurrentNum = 0; 每当进入一个新的局部化单位时, CurrentNum+; 遇到定义性标识符(声明),检查所有对应CurrentNum的表项,判定是否有重复定义,如果没有则将其属性及其CurrentNum登记到符号表中; 遇到使用性标识符,查符号表,(查所有num=CurrentNum的表项,且按照CurrentNum, CurrentNum-1, CurrentNum-2, 0的顺序查找)如果

8、都没有,则为标识符未声明错;否则,最先查到的表项为标识符对应的属性; 结束一个局部化单位时,”删除”所有CurrentNum对应的表项, CurrentNum -;,全部化符号表,int i , j ; void test ( int j ) real x ; j int x ; . void main() char i ; int i ; ,( 0, id, attributes ),Symbol Table,全局化符号表(驻留法),int i , j ; void test ( int j ) real x ; j int x ; xx void main() char i ; int i

9、 ; ,x, bool x; x,(0,i,0,0,intptr,) (0,j,0,1,intptr,) (0,test,0,voidptr,) (1,j,1,0,intptr,) (1,x,1,1,realptr,) (2,x,1,3,intptr,) (#,.) (2,x,1,3,boolptr,) (#,.) (#,.),基于外拉链散列表实现分程序结构的符号表,基本思想:采用“删除式”全局符号表, 符号表采用散列表实现:以标识符名字为主键,将名字作用到事先设计好的散列函数上,计算得到标识符的符号表地址。当出现重名标识符时,采用外拉链的方式化解冲突。标识符的最新定义出现在链表的头部,总会被

10、最先查到;当分程序无效,分程序中定义的标识符也会从表中直接删除掉。,1. main() 2. 3. int a; 4. float b,d; 5. 6 int c; 7. float a; 8. 9. int d; 10. float c; 11. 12. float d; 13. 14. a=b+c+d; 15. 16. 17. 18. char d; 19. 20. 21. ,外拉链散列式符号表的构造过程如下:,符号表的接口,创建符号表 删除符号表 向符号表中添加表项 查找某个标识符 查找某个标识符的属性,作业,写出下列类型的内部表示.typedef struct char name10;

11、 int age; person;typedef person List10;typedef union int data; real length; char name4;,作业,(2) 写出当分析下列程序时,创建符号表的过程。 (局部符号表和全局符号表(删除法和驻留法均可),typedef struct char name30; int age; Student;Student Lee; int i ;int GetAge(Student S) return S.age;void SetAge( int i) Lee.age=i; void main() student Lee; SetAge(10); int i = 20; Lee.age = i;,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报