编译原理课件c06语义分析.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理课件c06语义分析

第6章 语义分析 知识点:符号表 类型体制 各语法成分的类型检查 语义分析 6.1 语义分析的任务和地位 6.2 符号表 6.3 符号表的建立 6.4 类型检查 6.5 一个简单类型检查程序的说明 6.6 类型检查有关的其他主题 小 结 6.1 语义分析的任务和地位 程序设计语言的结构由上下文无关文法来描述 程序结构正确与否与该结构的上下文有关,如: 变量的作用域问题 同一作用域内同名变量的重复声明问题 表达式、赋值语句中的操作数的类型一致性问题 思考: 设计上下文有关文法来描述语言中上下文有关的结构? 理论上可行,构造有困难,构造相应的分析程序更困难 解决办法: 设计专门的语义动作补充上下文无关文法的分析程序 利用语法制导翻译技术实现语义分析 上下文有关信息的记录与使用 符号表 记录编译过程中识别出的上下文有关的信息,如: 变量的类型 相对地址 信息的引用 根据词法分析程序识别出的标识符的属性值(标识符在符号表中的入口),查找符号表中对应该标识符的记录,从而可以取得该标识符有关的信息。 如果编译的程序块处于该变量的作用域内,则这个变量将一直保留在符号表中 语义检查 动态检查:目标程序运行时进行的检查 静态检查:读入源程序、但不执行源程序的情况下进行的检查 类型检查 对访问数据的操作和被访问数据的类型进行检查,检查操作的合法性和数据类型的相容性。 控制流检查 检查控制语句是否使控制转移到一个合法的位置。 唯一性检查 一个标识符在同一程序块中必须而且只能被说明一次 CASE语句中用于匹配选择表达式的常量必须各不相同 枚举类型定义中的各元素不允许重复 关联名字的检查 类型检查 由类型检查程序完成 检验结构的类型是否和它的上下文所期望的一致,如: 表达式中各运算对象的类型 算术运算符 mod 的运算对象的类型 用户定义函数的各参数类型、返回值类型 语义分析程序的作用和地位 语义分析程序的作用 符号表的建立和管理 类型检查 语义分析程序的地位 6.2 符号表 符号表在翻译过程中起两方面的重要作用: 检查语义(即上下文有关)的正确性 辅助正确地生成代码 通过在符号表中插入和检索变量的属性来实现的 符号表是一张动态表 在编译期间符号表的入口不断地增加 在某些情况下又在不断地删除 编译程序需要频繁地与符号表进行交互,符号表的效率直接影响编译程序的效率。 符号表 一、符号表的建立和访问时机 二、符号表内容 三、符号表操作 四、符号表组织 一、符号表的建立和访问时机 1. 多遍编译程序 2. 合并遍的编译程序 两方面的优点: 对语法分析程序来讲降低了文法的复杂性 允许用更系统的方法对上下文有关的错误进行检测和校正。 二、符号表内容 符号表中记录的是和标识符相关的属性 出现在符号表中的属性种类,在一定程度上取决于程序设计语言的性质。 符号表的典型形式: 变量名 变量名必须常驻内存 问题: 标识符长度是可变的 解决办法: 标识符长度有限制:设置一个长度固定的域,它的长度为该语言允许的标识符最大长度。 标识符长度没有限制:设置一个长度固定的域,域内存放一个串描述符,包含位置指针和长度两个子域,指针域指示该标识符在总的串区内的开始位置,长度域记录该标识符中的字符数。 使用串描述符表示变量 目标地址 指示运行时变量值存放的相对位置 对于静态存储分配的语言(如Fortran),目标地址按连续的顺序分配,从0开始到m(m是分配给一个程序的数据区的最大值)。 对于块结构的语言(如Pascal),通常采用二元地址BL,NO BL:块的嵌套深度,用于确定分配给声明变量的块的数据区的基址。 NO:变量的目标地址偏移量,指示该变量的存储单元在数据区中相对于基址的位置。 数据类型 当所编译的语言有数据类型(隐式或显式的)时,必须把类型属性存放到符号表中。 对于无类型的语言,可删除该域。 变量的类型属性用于: 类型检查 生成代码 空间分配 变量的类型以一种编码形式存放在符号表中。 数组的维数/参数的个数 数组引用时,其维数应当与数组声明时定义的维数一致。 类型检查阶段必须对这种一致性(维数、每维的长度)进行检查 维数用于数组元素地址的计算。 过程调用时,实参必须与形参一致。 实参的个数与形参的个数一致 实参的类型与相应形参的类型一致 在符号表组织中: 把参数的个数看作它的维数是很方便的,因此,可将这两个属性合并成一个。 这种方法也是协调的,因为对这两种属性所做的类型检查是类似的。 交叉引用表 编译程序可以提供的一个十分重要的程序设计辅助工具:交叉引用表 编译程序一般设一个选项,用户可以选择是否生成交叉引用表 链域 为了便于产生按字母顺序排列的交叉引用表

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档