编译原理capter5.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文档。上传文档
查看更多
第五章 语义分析 Semantic Analysis 计算机科学与技术学院 刘 慧 Semantic:与语言表达的含义相关的。 编译器语义分析阶段的任务:将变量的定义与它们的各个使用联系起来,检查每一个表达式是否有正确的类型,并将抽象语法转换成更简单的、适合于生成机器代码的表示。 5.1 Symbol Tables(符号表) 符号表也称为环境(environment),其作用是将标识符映射到它们的类型和存储位置。 在处理类型、变量和函数的声明时,这些标识符便与其在符号表中的“含义”相绑定。每当发现标识符的使用(非声明性出现)时,便在符号表中查看它们的含义。 程序中的每一个局部变量都有一个作用域(scope),该变量在此作用域中是可见的。 当语义分析到达每一个作用域的结束时,所有局部于此作用域的标识符都将被抛弃。 5.1 Symbol Tables Semantic checks refer to properties of identifiers in the program -- their scope or type Need an environment to store the information about identifiers = symbol table Each entry in the symbol table contains the name of an identifier additional information: its kind, its type, if it is constant, … 5.1 Symbol Tables 程序中的每一个局部变量都有一个作用域(scope),该变量在此作用域中是可见的。 当语义分析到达每一个作用域的结束时,所有局部与此作用域的标识符都将被抛弃。 5.1 Symbol Tables 环境是由一些绑定(binding)构成的集合,所谓绑定指的是标识符与其含义之间的一种映射关系。 用“→”表示绑定。 5.1 Symbol Tables 函数式风格(functional style):当创建σ2和σ3时,保持σ1原来的状态不变,这样,当再次需要σ1时, σ1就已经就绪了。 命令式风格(imperative style):修改σ1直到它成为σ2 。这种破坏性的更新会“毁掉” σ1 ,即在σ2存在期间,不能查看σ1中的符号;但是,当完成了σ2中的处理时,可以撤销对σ1的更新从而使σ1返回原来的状态。 一个单一的全局环境(它在不同时间变成σ0 、σ1 、σ2 、σ3 、σ1 、σ0 ); 撤销栈:每当添加一个符号到环境时,也将该符号加入到撤销栈中。 5.1.1 Multiple Symbol Tables 在有些语言中,可以同时存在若干个活跃的环境:程序中的每一个模块、类或者记录都有自己的符号表σ 。 举例:Figure5.1 5.1.2 Efficient Imperative Symbol Tables Efficient implementation=Hash table(散列表) 当σ′= σ + { a→τ},是通过以a 作为键值将τ插入散列表来实现的。 5.1.2 Efficient Imperative Symbol Tables 带有外部散列链的散列表(hash table with external chaining)能够很容易实现对作用域的删除操作。 5.1.2 Efficient Imperative Symbol Tables 当σ已经包含a→τ1时,操作σ′=σ+ { a→τ2 }: 函数insert将a→τ1保留在散列链中,并将a→τ2插入到散列链的前部; 在a的作用域结束处执行pop(a)之后,便恢复了σ。 只有当绑定的插入和弹出都按栈的方式操作,pop才能正确工作。 5.1.2 Efficient Imperative Symbol Tables 5.1.3 Efficient Functional Symbol Tables 当计算σ′=σ+ { a→τ}时,希望在σ′活跃的情况下仍然能看到σ中的标识符。 因此,不是将一个绑定加入到已存在的表中来“改变”这个表,而是通过计算现有的这个表与一个新的绑定的“和”来创建一个新表。 散列表的方式不可行: 破坏性更新散列表; 非破坏性更新散列表,效率不高。 5.1.3 Efficient Functional Symbol Tables 二叉搜索树(binary search tree):是一棵可能为空的二叉树,一棵非空的二叉搜索树满足: 每个元素有一个唯一的关键值; 根节点左子树的关键值(如果有的话)小于根节点的关键值; 根节点右子树的关键值(如果有

文档评论(0)

dd545454 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档