各种文法比较.docVIP

  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文档。上传文档
查看更多
各种文法比较

各类文法之间的比较 处理文法的语法分析器大体上可以分为三种类型:通用的、自顶向下的、和自底向上的。象Cocke-Younger-Kasami算法和Earley算法这样的通用语法分析方法可以对任意文法进行语法分析。然而,这些通用方法效率很低,不能用于编译器产品。 编译器中常用的方法可以分为自顶向下的和自底向上的。正如它们的名字所指出的,自顶向下的方法从语法分析树的顶部(根结点)开始向底部(叶子结点)构造树,而自底向上的方法从叶子结点开始,逐渐向顶部构造。这两种分析方法中,语法分析器的输入总是按照从左向右的方式被扫描,每次扫描一个符号。 最高效的自顶向下方法和自底向上方法只能处理某些文法子类,但其中的某些子类,特别是LL和LR文法,的表达能力已经足以描述现代程序设计语言的大部分语法构造了。手工实现的语法分析器通常使用LL文法;比如预测分析方法能够处理LL文法。处理较大的LR文法类的语法分析器常常是由自动化工具构造得到的。 自顶向下的文法 自顶向下语法分析可以被看作是为输入串构造语法分析树的问题,它从语法分析树的根结点开始,按照先根次序创建这棵语法分析树的各个结点。自顶向下语法分析也可以被等价地看作寻找输入串的最左推导的过程。 在一个自顶向下语法分析的每一步上,关键问题是确定对一个非终结符号,比如说A,应用哪个产生式。一旦某个A-产生式被选中,语法分析过程的其余部分负责将相应产生式体中的终结符号和输入相匹配。 对于有些文法,我们可以构造出向前看k个输入符号的预测语法分析器。这一类文法有时被称为LL(k)文法类。根据一个文法的FIRST和FOLLOW集合,我们将构造出“预测分析表”,它指明了如何在自顶向下语法分析过程中选择产生式。这些集合也可以被用于自底向上语法分析。 对于一类被称为LL(1)的文法,我们可以构造出预测语法分析器,也就是不需要回溯的递归下降语法分析器。LL(1)中的第一个“L”表示从左到右扫描输入,第二个“L”表示产生最左推导,而“1”则表示在每一步中只需要一个向前看符号来决定语法分析动作。 LL(1)文法类已经足以描述大部分程序设计语言构造,虽然在为源语言写出适当的文法时需要多加小心。比如,左递归的文法和二义性的文法都不可能是LL(1)的。 一个文法G是LL(1)的,当且仅当对于G的任意两个不同的产生式A?α | β,下面的条件一定成立: 1、不存在终结符号a使得α和β都能够推导出以a开头的串。 2、α和β中最多只有一个可以推导出空串。 3、如果βε,那么α不能推导出任何以FOLLOW(A)中的某个终结符号开头的串。类似地,如果αε,那么β不能推导出任何以FOLLOW(A)中的某个终结符号开头的串。 前两个条件等价于说FIRST(α)和FIRST(β)是不相交的集合。第三个条件等价于说如果ε在FIRST(β)中,那么FIRST(α)和FOLLOW(A)是不相交的集合,并且当ε在FIRST(α)中时类似结论成立。 之所以能够为LL(1)文法构造一个预测分析器,原因是只需要检查当前输入符号就可以决定为一个非终结符号选择哪个正确的产生式。因为有关控制流的各个语言构造带有不同的关键字,它们通常满足LL(1)的约束。比如,如果我们有如下产生式 stmt ? if (expr) stmt else stmt | while (expr) stmt | {stmt_list} 那么关键字if,while和符号{告诉我们:如果我们想要在输入中找到一个语句,那么只有选择哪个产生式才可能匹配成功。 接下来给出的算法将FIRST和FOLLOW集合中的信息放到一个预测分析表M[A,a]中去。这是一个二维数组,其中A是一个非终结符号而a是一个终结符号或特殊符号$,即输入的结束标记。该算法基于如下的思想:只有当下一个输入符号a在FIRST(α)中时才选择产生式A?α。只有当α=ε时,或更加一般化的αε时,情况才有些复杂。在这种情况下,如果当前输入符号在FOLLOW(A)中,或者已经到达输入中的$符号、且$在FOLLOW(A)中,我们仍应该选择A?α。 自底向上的文法 一个自底向上的语法分析过程对应于为一个输入串构造语法分析树的过程,它从叶子结点(底部)开始逐渐向上到达根结点(顶部)。将语法分析描述为语法分析树的构造过程会比较方便,虽然编译器前端实际上并不构造出显式的语法分析树,而是直接进行翻译。 LR语法分析器是表格驱动的,在这一点上它和非递归LL语法分析器很相象。如果我们可以使用本节和下一节中的某个方法为一个文法构造出语法分析表,这个文法就被称为LR文法。直观地讲,只要存在一个从左到右扫描的移入-归约语法分析器,它总是能够在某文法的最右句型的句柄出现在栈顶时识别出这个句柄,这个文法就是LR的。 因为诸多原因,LR语法分析技术很有吸

文档评论(0)

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

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

1亿VIP精品文档

相关文档