- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
语义分析中间代码与符号表.ppt
语义分析、中间代码与符号表 学习目标: 掌握: 常见语法成分的中间代码形式; 符号表的组织管理 理解: 语义分析的内容 语义分析基础 语义分析的内容 主要是类型相容检查,有以下几种: 各种条件表达式的类型是不是boolean型? 运算符的分量类型是否相容? 赋值语句的左右部的类型是否相容? 形参和实参的类型是否相容? 下标表达式的类型是否为所允许的类型? 函数说明中的函数类型和返回值的类型是否一致? 其它语义检查: V[E]中的V是不是变量,而且是数组类型? V.i中的V是不是变量,而且是记录类型?i是不是该记录的域名? x+f(…)中的f是不是函数名?形参个数和实参个数是否一致? 每个使用性标识符是否都有声明?有无标识符的重复声明? 在语义分析同时产生中间代码,在这种模式下,语义分析的主要功能如下: 语义审查 在扫描声明部分时构造标识符的符号表 在扫描语句部分时产生中间代码 8.3 中间代码的形式 定义: 中间代码是一种复杂性介于源程序语言和机器语言之间的一种表示形式。 使用中间代码的好处: 中间代码与具体机器无关 对中间代码进行与机器无关的优化 形式: 逆波兰记号、三元式、四元式和树形表示 8.3.1 逆波兰记号 逆波兰表示法 将运算对象写在前面,把运算符写在后面,因而也称后缀式。 例如: 后缀式的计算机处理 后缀式的最大优点是易于计算机处理 处理过程: 从左到右扫描后缀式,每碰到运算对象就推进栈;碰到运算符就从栈顶弹出相应目数的运算对象施加运算,并把结果推进栈。最后的结果留在栈顶。? 8.3.2 三元式和树形表示 三元式 (算符op,第一个运算对象ARG1,第二个运算对象ARG2) 树形表示 二目运算对应二叉子树,多目运算对应多叉子树,但通常通过引入新结点表示成二叉子树。 例如:a:=b*c+b*d 表示成 8.3.3 四元式 四元式表示 四元式是一种比较普遍采用的中间代码形式 (算符op,ARG1,ARG2,运算结果RESULT) 四元式的优点: 四元式比三元式更便于优化。 优化要求改变运算顺序或删除某些运算,引起编号的变化。 三元式通过编号引用中间结果,编号的变化引起麻烦;四元式通过临时变量引用中间结果,编号变化无影响。 四元式对生成目标代码有利。 四元式表示很类似于三地址指令,很容易转换成机器代码。 符号表 符号表及其作用 符号表(Symbol Table) 符号表是存放标识符信息的一种表,其中的信息表示的是标识符的属性(语义)。 符号表的作用 符号表是连接声明与引用的桥梁。一个名字在声明时,相关信息被填写进符号表,而在引用时,根据符号表中的信息生成相应的可执行语句。它的作用主要有: 辅助语义的正确性检查 辅助代码生成 符号表的设计 如何有效记录各类符号的属性,以便在编译的各个阶段对符号表进行快速、有效的查找、插入、修改、删除等操作,是符号表设计的基本目标。 符号表的组成 表项分两部分,其中前者是标识符的名字(或在名表中的地址),而后者是属性部分(不同种类的标识符属性不同)。 符号表的组织方式和查找方法 符号表的组织方式可以是数组也可以是链表等等,查找算法可以是顺序查表法、平分查表法、散列查表法等 合理的组织和查找,将使得符号表的操作更高效 3. 符号的主要属性 名字 类型 存储类别 (静态、regist,公共、内部。。) 作用域及可视性 存储分配信息 两类存储区 静态:生命周期是整个程序的运行过程 动态:适应局部变量的生存和消亡,提高程序运行的空间效率 具体位置 4. 符号表的总体组织 第一种:按属性完全相同的组织多张表,空间效率高,但管理复杂 第二种:所有符号一张表,管理集中单一,但空间臃肿 第三种:折衷方式是根据符号属性相似程度分类组织成若干张表,每张表中记录的符号都有比较多的相同属性。 5. 分程序结构的符号表 对于具有分程序型结构的语言程序,不同层次分程序中定义的标识符号具有不同的作用域和不同的可视性规则。 各分程序独立组织(分表结构):每当编译程序扫描到一个分程序结构开始时,为该分程序建立一张符号表,在该分程序中定义的标识符,都被登录在该符号表中。而当编译程序扫描到一个分程序的结束时,编译程序释放为该分程序所建立的符号表。 统一组织(单表结构):所有分程序中定义的标识符都集中在单张符号表中。为了实现分程序构造中标识符的作用域和可视性规则的要求,在符号表中可设立一个属性域用来登录符号所在分程序的层次。进入分程序时,层次要增加一层.在退出一个分程序时,层次降低一层,且需要把符号表中,所有在退出的分程序中登录的符号项清除。 * * 目标程序 源程序 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成 表格
文档评论(0)