编译原理 弟四章自顶向下语法分析法.docVIP

  • 1
  • 0
  • 约1.76万字
  • 约 7页
  • 2019-04-20 发布于江苏
  • 举报

编译原理 弟四章自顶向下语法分析法.doc

第四章 自顶向下语法分析方法 语法分析是编译过程的核心部分。语法分析的任务是:按照文法,从源程序符号串中识别出各类语法成份,同时进行语法检查,为语义分析和代码生成作准备。执行语法分析任务的程序称为分析程序。也称为语法分析器,它是编译程序的主要子程序之一。 在第二章中我们已经介绍过。通过语法分析可建立起相应的语法树。按语法树的建立方法,我们将语法分析方法分成两大类,即自顶向下分析和自底向上分析。下面,我们先介绍自顶向下分析。 本章重点:自顶向下分析、LL(1)分析,然后再介绍自底向上分析。 第一节 自顶向下分析方法 一、带回溯的自顶向下分析算法 这是自顶向下分析的一般方法,即对任一输入符号串,试图用一切可能的方法,从识别符号出发,根据文法自上而下地为输入串建立一棵语法树。 下面用一个简单例子来说明这种过程: 假定有文法G[S]: S→cAd          A→ab|a 以及输入串w=cad 为了自上而下地构造w的语法树,我们首先按文法的识别符号产生根结点S,并让指示器IP指 adcASb a d c A S b a d c A S d c A S ( a) (b) (c) 图3-1-1 图3-1-1a图。我们希望用S的子结从左至右匹配整个输入串w。首先,此树的最左子结是终结符c为标志的子结,它和输入串的第一个符号相匹配。于是,我们就把IP调整为指向下一输入符号a,并让第二个子结A去进行匹配,非终结符A有二个选择,我们试着用它的第一个选择去匹配输入串,于是把语法树发展为图3-1-1b图。子树A的最左子结和IP所指的符号相符,然后我们再把IP调为指向下一符号d并让A的第二个子结进入工作。但A的第二个子结为终结符号b,与IP当前指的符号d不一致。因此,A宣告失败。这意味着A的第一个选择此刻不适用于构造w的语法树。这时,我们应该回头(回溯)看A是否还有别的选择。 为了实现回溯,我们一方面应把A的第一个选择所生长的子树注销掉;另一方面,应把IP恢复为进入A时的原值,也就是让它重新指向第二输入符号a。现在我们试探用A的第二个选择,即考虑生成图3-1-1c的语法树。 由于子树A只有一个子结a,而且,它和IP所指的符号相一致,于是,A完成了匹配任务。在A获得匹配后,指示器指向下一个未被触及的符号d。 在S的第二子结A完成匹配后,接着就轮到第三个子结d进行工作。由于这个子结和最后一个输入符号相符,于是,我们完成了构造语法树的任务,证明了w是文法G[ s]的一个句子。 上述自顶向下地为输入符号w建立语法树的过程,实际上也是设法建立一个最左推导序列,以便通过一步步推导将输入串推导出来。很明显,对于输入串w可以通过如下的推导过程将其推导出来:Sc A da b①W S c A d a b ①W:cad ↑ 2p指示口 所以用最左推导,是因为我们对输入串是自左向右扫描的,只有使用最左推导,才能保证按扫描顺序去匹配输入串。在上述推出符号串w的过程中,由于出现在符号串中的非终结符号只有一个,因此,未明显地表现出最左推导的性质。 根据以上分析,不难编出程序来实现这种分析的算法。但是,上述这种自顶向下的分析算法存在着一定的困难和缺点。困难表现在不能为左递归文法构造自顶向下的语法分析器(上述所举例子的文法G[s]是不具有在递归性的)。缺点主要表现在存在着回溯问题。当然,应用带回溯的自顶向下的分析算法还必须将文法规则存放于内存。下面将具体介绍这种分析算法所存在的问题及其解决办法。 二、存在问题及解决办法 (一)左递归问题 自顶向下分析法只有规则排列得合适时,才能正确工作。该法的一个基本缺点是不能处理具有左递归的文法。如下所示。 A→AB|BbB→Ac|dA A→AB|Bb B→Ac|d A a?? ?B A C B b A C A A A B A Cc B b A Cc S→S S→Sa|b S S a S a S a S a A→aAB|Bb B→Ac|d 无法确定语法树的终止, 清除直接左递归的较好方法是改 改为右递归 如:S→Sa|b 改为 S→bS′ S′→aS′|Σε 一般情况下,直接左递归的形式可为:消除 A→Aα1|Aα2| … Aαm|β1|β2…βn 清除左递归后改写为: A→β1A′1|β2A1′ … |βnA1′ A′1→α1A′|α2A1′ … |αmmA′1|Σε 对于间接左递归的消除,需先将间接左递归变为直接左递归,然后再接上述方法消除。 条件是文法中无A→A 的有害规则和 或A→Σε的空产生式 算法:

文档评论(0)

1亿VIP精品文档

相关文档