欢迎来到天天文库
浏览记录
ID:62444209
大小:358.26 KB
页数:41页
时间:2021-05-06
《[精选]07第7章-符号表管理技术.pptx》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第7章符号表管理技术2021/8/31内容提要符号表的作用符号表的建立与访问符号表的内容与组织符号表上的操作非块程序结构语言的符号表结构块程序结构语言的符号表结构2021/8/32符号表是编译程序中的一个重要数据结构,用来保存各类标识符的属性信息;编译的各个阶段都可能用到与符号相关的各种信息,这些信息用一些表格进行记录、存储和管理,如常量表、数组信息表等等,这些表统称为符号表;编译的分析阶段收集和更新符号表信息,综合阶段从符号表获取信息。7.1符号表的作用2021/8/33符号表的作用∶(1)登记符号属性值在源程序的各个分析阶段,编译程序根据标识符的声明信息收集
2、其有关的属性值并存放在符号表中。每种语言规则定义了不同的符号属性;即使是同一个语言,不同的编译程序也可能会定义并且收集不同的属性信息。现代编程语言中一般包括常数声明、变量声明、类型声明和过程/函数声明等四类声明。对于每类声明,编译程序要收集、存储和应用的属性完全不同。2021/8/34例:C语言的变量声明shortinta;floatb=0.0;编译程序对每个变量要记录其类型,以便执行类型检查和存储分配;比如短整型变量a占2个字节,要记录它在存储器中的位置(相对位移或绝对地址);若像b有初始值,则还需要记录该初始值。2021/8/35(2)查找符号属性符号表存放
3、源程序中的各种类型的信息,比如数值、变量类型、参数传递的地址等,在分析和翻译源程序的过程中会被不断地查询。例:对声明语句:shortinta=9;shortintb=10;如果源程序有代码a+b时,需要查找、计算表达式中运算数的类型和值,以便计算出表达式。2021/8/36(3)检查符号的合法性A、检查类型是否一致例:对声明语句:shortinta;floatb=0.0;有代码a=b+b,C语言的编译将检查变量a和b的类型,把表达式b+b的结果转换成短整型,仅取整数部分进行赋值。强类型语言(如Pascal和Ada)的表达式运算数的类型必须一致2021/8/37B
4、、检查变量重复定义例:C语言程序中出现 …inti[3][5];//定义整型数组i … floati[4][2];//定义实型数组i,重定义冲突 …inti[3][5];//定义整型数组i,重定义冲突 …编译程序首先在符号表中记录了标识符i的属性是3×5个整型元素的数组,而后在分析第二、第三这两个定义说明时,编译程序可通过符号表检查出标识符i的重定义冲突错误。不论在后二句中i的其它属性与前一句是否完全相同,只要标识符名重定义,就将产生标识符重定义的语义错误。2021/8/38(4)作为目标代码生成阶段地址分配的依据由标识符定义的存储类型或它在
5、程序中的位置来确定。首先确定变量存储的区域。例如,在Java语言中,整数类型有byte(1个字节)、short(2个字节)、int(4个字节)以及long(8个字节),而float类型占4个字节,double类型占8个字节。其次根据标识符的出现顺序,决定标识符在某个存储区域中的具体位置,而有关区域的标志及其相对位置都作为该标识符的语义信息存放在其符号表中。2021/8/39创建时间:词法分析时和语义分析时1、词法分析时创建:当词法分析程序识别出一个标识符时,以该标识符名查找符号表;若表中无此标识符的登记项,将此标识符填入符号表;与标识符相关的其它信息,可视工作方
6、便分别语义分析及中间代码生成等阶段陆续填入。语义分析程序进行语义正确性分析,遇到声明语句填入有关标识符的属性。在符号表中记录的标识符属性信息会在代码生成阶段用于产生目标代码的指令序列。7.2符号表的建立与访问2021/8/3102、语义分析时创建:词法分析只输出标识符符号,而标识符名字作为标识符符号的属性输出,在语义分析阶段根据标识符的属性创建符号表记录,并同时填入其它的属性信息。小结:如果在词法分析阶段创建符号表,只能在符号表中将标识符的名字填入符号表,而其他属性则要在语义分析和代码生成阶段填入。如果在语义分析阶段创建符号表,那么与符号表打交道就仅局限于语义分
7、析和代码生成。2021/8/311符号表的访问效率是制定符号表管理方案时重点考虑的因素,一个高效的管理方案应该使符号表具有快速查找、快速删除、易于使用、易于维护等特点。符号表的内容和组织方式影响其访问效率符号表具体包含哪些内容,属性的种类,一定程度上取决于程序设计语言的性质。符号表的组织方式要根据内存和存取速度的限制做相应的调整。7.3符号表的组织和内容2021/8/312符号表的内容:符号表是由一些表项组成的二维表格每个表项可分为两部分:名字域:存放符号名字;属性域:记录与该名字相对应的各种属性2021/8/3132021/8/314名字目标地址类型维数声明行
8、引用行指针Compute
此文档下载收益归作者所有