- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 语义分析 6.1 语义分析概述 6.2 符号表 6.3 类型的语义分析 6.4 声明的语义分析 6.5 程序体的语义分析 6.6 属性文法和动作文法 6.2 符号表 标识符的作用域 局部化符号表 全局化符号表 符号表的接口函数 标识符的作用域 作用域(scope) 程序中的每个标识符都有自己的作用域; 标识符的作用域是标识符可见(visible)或有效的(effective)一个程序片段,称为程序的局部化单位; 通常一个程序局部化单位是一个子程序(函数)或者分程序; 一个标识符的作用域从声明该标识符的位置开始到其所在的局部化单位的结束(其中要去掉其内部声明的同名标识符的作用域); 特别地, 域名的作用域是包含该域名的结构或者联合体; 标识符的作用域(例1) var x,y,z : integer; procedure P( ); var x,y:integer; procedure Q( ); var x,z:real; begin ....... end begin ...... end Pascal语言过函嵌套的例子 标识符的作用域(例2) 带有分程序嵌套的C程序的例子 int a,b; void main() { int a = 1; int b = 1; { int b = 2; { int a = 3; printf(“a=%d,b=%d\n”,a,b); } { int a = 3; printf(“a=%d,b=%d\n”,a,b); } } printf(“a=%d,b=%d\n”,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) test: (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) 语义分析时对符号表的管理 标识符声明 查找符号表检查标识符是否已经被声明过; 如果是,则重复声明错; 如果不是,则建立标识符的内部表示,将其放入符号表; 标识符使用 查找符号表检查标识符是否有声明; 如果是,则取出标识符的属性进行语义分析; 如果不是,则未声明错; 退出局部化单位,“删除” 该局部化单位里声明的所有标识符; 符号表的组织 第一,易于查找 顺序查找 折半查找 散列表(hash table) 第二,反映标识符的作用域,保证每次标识符的有效属性都能被找到; 局部化: 每个局部化单位的符号表作为一个独立的表处理, 即把每个局部化单位的符号表作为建表和查表单位; 全局化:把整个程序的符号表统一处理; 局部化符号表 Scope栈保存当前所有局部化单位符号表的首地址; 局部化实现原理: 进入局部化单位,建立一个新的空符号表,并将地址压入Scope栈; 遇到定义性标识符(声明), 查当前符号表判定是否有重复定义,如果没有则将其属性登记到当前符号表中; 遇到使用性标识符,查符号表(从当前符号表查,如果没有,再依次查scope栈中下一个符号表,如果都没有,没有声明错;否则,找到对应的属性); 结束一个局部化单位时,删除当前符号表, 弹出scope栈顶元素; 每个局部化单位的符号表可以是 线性表; 二叉树; 散列表 局部化符号表 int i , j ; void test ( int j ) { r
您可能关注的文档
最近下载
- 新教材统编版高中思想政治选择性必修1《当代国际政治与经济》教学计划(2019部编版含教学进度表).doc
- 2025年中国个人护理用品连锁行业发展监测及投资战略咨询报告.docx
- 必威体育精装版部编版三年级语文下册学历案(全册).docx
- 桃树栽培管理技术.pptx VIP
- 科学(粤教版)三年级下册教案.pdf VIP
- 石油化工工程建设设计概算编制办法.docx
- 出货检验作业指导书.pdf
- 中职高二数学开学第一课——“数”你最美-【开学第一课】2024年中职秋季开学指南之爱上数学课.pptx
- 山东省德州市宁津县2024-2025学年二年级上学期1月期末语文试题.pdf VIP
- 体育名师工作室学员总结PPT.pptx
文档评论(0)