编译原理-符号表管理
1.符号表的作用
2.符号表中存放的信息
3.符号表的组织结构
4.符号表与作用域
5.总结
一、符号表的作用
1.编译的各个阶段都有可能会用到符号表中登记的信息
1.1协助进行语义检查(检查一个名字的引用和之前的声明是否相符)和中间代码的生成
1.2在目标代码生成阶段,当需要为名字分配地址时,符号表中的信息将是地址分配的主要依据
1.3编译器用符号表来记录、收集和查找出现在源程序中的各种名字及其语义信息
2.符号表是以名字为关键字来记录其信息的数据结构,其上支持的两个最基本的操作应该是“添加表项” 和 “删除表项” 这个两个操作速度必须是高效的
二、符号表中存放的信息
1.记录源程序中出现的各种名字及其属性信息是符号表的首要任务。
2.显然同一个名字在一段程序中应该表示同一个对象,即同一个符号表中不能出现相同的名字,因此名字可以作为符号表的关键字。于是每一个符号表表项需要存放的基本信息就是符号的名字及其属性。表格中每一行表示一个表项
名字 | 属性 |
name | 变量名 name 的属性 |
a | 变量名 a 的属性 |
bb | 变量名 bb 的属性 |
3.符号表中的名字
3.1 名字的长度固定
名字项的长度大小取决于标识符允许的最大长度
不适于标识符长度变化范围较大的语言
浪费空间(就算很短的标识符也要分配同样固定长度的空间)
3.2 名字字段长度可变
好处--不用限制标识符的长度
不好处--符号表上的操作复杂而低效
3.3 引入一个单独的字符串表,将符号表中的全部标识集中放在这个字符串表中,而在符号表表项的名字部分只要给出相应标识符的首字符在字符串表中的位置即可。
名字 | 属性 | |
name的表项 | 4 | .。 |
a的表项 | 1 | 。。。 |
ab的表项 | 2 | 。。。 |
age的表项 | 3 | .。。。 |
n | a | m | e | a | a | b | a | g | e | 。 | 。 | 。 | 。 | 。 |
标识符的长度放在符号表中(ab的起始位置就等于name长度加上a长度的下一个位置)
名字 | 属性 | |
name的表项 | 0 | .。 |
a的表项 | 5 | 。。。 |
ab的表项 | 7 | 。。。 |
age的表项 | 10 | .。。。 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
4 | n | a | m | e | 1 | a | 2 | a | b | 3 | a | g | e | 。 |
标识符长度放在字符串表中(表项的名字字段存放的是该名字的长度在字符串表中的位置,例如age就是从表项中的名字字段获取位置 10 然后在字符串表中从 第十个位置开始取三位)
名字 | 属性 | |
name的表项 | 0 | .。 |
a的表项 | 5 | 。。。 |
ab的表项 | 7 | 。。。 |
age的表项 | 10 | .。。。 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
n | a | m | e | \0 | a | \0 | a | b | \0 | a | g | e | \0 | 。 |
用 \0 表示标识符的结束
4.符号表中的属性
4.1 符号所表达的含义不同,符号表中需要存放的属性也不同
数组名字需要存放的属性信息应该包括数组的维度和各维度的长度
函数(或过程)的名字因该存放其参数个数、个参数的类型、返回值的类型等
5.建立多个符号表来管理源程序中出现的各种符号,例如 常数表,变量表,函数表,数组表等
可能出现不同种类符号出现重名的问题
6.建立一张公用的大表,来管理各种符号,此时需要在符号表中增设一个标志来表明符号的种属
不同种类的符号所需要存放的属性信息在数量上的差异会造成符号表的空间浪费
名字 | 符号种类 | 类型 | 地址 | 扩展属性执行 | ||||||
name | 变量 | string | 0 | NULL | ||||||
i | 变量 | int | 4 | NULL | ||||||
myArray | 数组 | int | 8 |
|
多种符号公用符号表的一种实现结构
7.符号的地址属性
7.1 如果采用静态存储分配策略,则符号x绑定的地址等于静态分配的基址base加上符号x的偏移量offset
7.2如果采用的是栈式存储分配或者堆式存储分配等动态分配策略,则符号是在程序执行过程中和地址动态绑定的
7.2.1如栈式存储分配时,i 的地址是以栈指针sp为基址加上 i 相对于活动记录起始地址的偏移量 i
7.3符号表中各符号的地址属性就是该符号相对于第一个符号的偏移地址
三、符号表的组织结构
1. 符号表的线性表实现
2.符号表的散列表实现
三、符号表的作用域
2.程序块结构符号表的其他实现
编译原理-符号表管理相关推荐
- 编译原理 符号表管理技术
第六章 符号表管理技术 文章目录 第六章 符号表管理技术 6.1 概述 6.2 符号表的组织与内容 6.2.1 符号表的结果与内容 6.2.2 符号表的组织方式 6.3 非分程序结构语言的符号表组织 ...
- 编译原理=符号表的认识
* 编译原理 ** 符号表 ==符号表的每一项(入口)包含两大栏: []名字栏: 也称主栏,关键字栏. []信息栏: 记录相应的不同属性,分为若干子栏. ==对符号 ...
- 自己动手构造编译系统:编译、汇编与链接2.1.3 符号表管理
2.1.3 符号表管理 符号表是记录符号信息的数据结构,它使用按名存取的方式记录与符号相关的所有编译信息.编译器工作时,少不了符号信息的记录和更新.在本书定义的高级语言中,符号存在两种形式:变量和函 ...
- Android-腾讯bugly符号表管理,上传so符号表、mapping符号表
Android-腾讯bugly符号表管理,上传so符号表.mapping符号表 mac端运行记录 准备参数 在腾讯bugly官网下载符号表管理工具 使用符号表管理工具上传 注意事项: 更多其他页面-自 ...
- Android Native 代码 Release 编译 - 隐藏符号表
使用 ndk-build NDK_DEBUG=0 可以编译 release 版本,但是符号表(Symbole table)仍然存在,如何隐藏呢? 在 Android.mk 文件中添加下面的配置: LO ...
- 编译原理-FIRST表-FOLLOW表-LL1表(含python代码)
问题描述 给出产生式文法,根据文法描述得出其 FIRST 集.FOLLOW 集,若符合 LL(1) 文法,则求出其 LL(1)表格. 算法设计 FIRST 集设计 概念: FIRST 集由终结符和
- 【编译原理】符号表的实现C语言
最近在学习编译原理这门课.实验课老师让我们完成简易的符号表.内容是读出源程序中的标识符,并在符号表中进行查找,若存在则输出该标识符及其编号和位置.否则将其填入符号表,并分配编号,确定位置,输出标识符表 ...
- 编译原理学习笔记一(待续)
这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的 ...
- 《编译原理》课程标准
XX大学软件学院 <编译原理>课程标准 制定人:张晨光 课程代码: 773033 课程名称(中文 / 英文):编译原理 / Compiler Principle 学时( 实验学时 )/ 学 ...
最新文章
- linux stop函数,perfmonctl()函数 Unix/Linux
- 数据库同样数据,本地和服务器查询效率相差百倍
- 2016-04-29 二分查找的面试题
- WPF 记一个Popup踩坑记录
- 编辑框已经获取了焦点,输入法不自动弹起
- python多进程卡死_Python 多进程中使用logging导致死锁
- java字符转为数字_java判断字符串是否可以转为数字
- channelinboundhandler中都包含了哪一类的方法_标准气体的分类类别与相关气体配置方式方法...
- MATLAB实现偏最小,偏最小二乘法 matlab程序
- 欧比特“珠海一号”遥感微纳卫星星座02组卫星发射成功!
- 《禅与摩托车维修艺术》读后感
- ReactNative 深层连结
- JAVASE常见面试题总结
- LED数码管段码生成
- 关于jupyer中,文件夹所在位置如何查询
- oracle 02315,02315 血眼
- @http工作原理及使用
- 【名说】DB2查询sql缓慢的调优方法
- 鸿蒙如何连接电视,鸿蒙系统的电视怎么安装第三方软件,荣耀智慧屏X1装软件教程...
- 今天的样子,绝非偶然