• 1.摘要
  • 2.概览
  • 3.实际的例子
  • 3.1.设置
  • 3.2.分析流程
  • 4.备注
  • 5.建构LL(1)分析表格
  • 6.建构LL(k)分析表格

LL分析器

LL分析器是一种处理某些上下文无关文法的自顶向下分析器。因为它从Left)到右处理输入,再对句型执行最左推导出语法树(Left derivation,相对于LR分析器)。能以此方法分析的文法称为LL 文法

本文中将讨论表格驱动的分析器,而非通常由手工打造(非绝对,参看如ANTLR等的 LL(*) 递归下降分析器生成器)的递归下降分析器。

一个 LL 分析器若被称为 LL(k) 分析器,表示它使用 k 个词法单元作向前探查。对于某个文法,若存在一个分析器可以在不用回溯法进行回溯的情况下处理该文法,则称该文法为 LL(k) 文法。这些文法中,较严格的 LL(1) 文法相当受欢迎,因为它的分析器只需多看一个词法单元就可以产生分析结果。那些需要很大的 k 才能产生分析结果的编程语言,在分析时的要求也比较高。

概览

对于给定的上下文无关文法,分析器尝试寻找该文法的最左推导。例如,给定一个文法image

  1. 1.

    image

    image

    image

image的最左推导如下:

image

通常, 选择一条规则来展开给定的(最左的)非终结符时,有多个选择的可能。前一个关于最左推导的例子中, 在第2步:

image

我们有两条规则可以选择:

  1. 1.

    image

    image

为了提高分析的效率,分析器必须能够尽可能确切地、无回溯地进行规则的选择。对于一些文法,它可以通过偷看无回推(即读取之后不将它退回输入流)的输入符号来做到这点。在我们的例子中,如果分析器知道下一个无回推符号是 image ,那么唯一正确可用的就是规则 2。

通常,image 分析器可以向前探查 image 个符号。然而,给定一个文法,若存在一个能识别该文法 image 分析器,则其 image 值的确定问题是不可判定的。也就是说,无法判定需要向前探查多少个符号才能识别它。对于每一个 image 的取值,总存在无法被 image 分析器识别的语言,而 image 分析器却可以识别它。

通过上述梗概,下面我们给出 image 的形式化定义:

image 是一个上下文无关文法,且 image。对于任意两个最左推导,当且仅当满足下述条件时,我们称 imageimage 文法:

  1. 1.

    image

    image

以下条件成立:串 image 中长度为 image 的前缀等价于串 image 中长度为 image 的前缀,表明 image.

在该定义中, image 文法的开始符号, image 是任意非终结符。之前获取的输入 image,以及还没回推的 imageimage 均为终结符串。希腊字母 image, imageimage 代表任意终结符和非终结符组成的串(也可能是空串)。前缀长度与用于保存向前探查结果的缓冲区尺寸一致,并且该定义表明了,缓冲区足以区分任意两个不同单词的推导。

本分析器可以处理特定形式文法的符号串。

本分析器由以下部件组成:

一个输入缓冲区,存放输入符号串(由语法创建的)。