引子

语法分析的作用是识别由词法分析给出的单词符号串是否是给定文法的正确句子。


语法分析常用方法可分为自顶向下分析和自底向上分析两大类。语法分析可以通过确定分析或者不确定分析来实现,但在实际的编译器构造中,几乎都是采用确定分析方法。


本篇主要介绍自顶向下的确定性分析。

自定向下语法分析方法

FIRST集的引入

  • 在自顶向下分析过程中,如果两个产生式有相同的左部,但它们的右部有不同的非终结符。选用哪个产生式向下推导?通过考察右部开头的那个非终结符,经过多次推导后获得的开头的终结符。这就是FIRST集的通俗解释。
  • FIRST集的形式化定义:暂时空置。

FOLLOW集的引入

  • 在自顶向下分析过程(向左推导)中,当面临输入符号为a时,最左非终结符A的FIRST集中不包含a,这意味着A必须置空,但如何保证后续推导串可以推导出a呢?可以通过考察A的后跟符号集合。这就是FOLLOW集的通俗解释。
  • FOLLOW集的形式化定义:暂时空置。

SELECT集的推导

  • SELECT集的形式化定义:暂时空置。
  • 通过对SELECT集的形式化定义的分析,可知SELECT集将FIRST集和FOLLOW集综合了起来。其用意不难猜测:为了解决上述两个问题。只要确保左部相同的产生式有不同的FIRST集和FOLLOW集,即SELECT集,则可以保证使用确定的自顶向下分析技术。

LL(1)文法的定义

第一个L表明自顶向下分析是从左向右扫描输入串,第二个L表明分析过程中采用最左推导,1表明只需向右看1个符号即可决定如何推导。

一个上下文无关文法是LL(1)文法的充分必要条件是:暂时空置。

由该定义可知LL(1)文法是能够使用确定的自顶向下分析技术的。

LL(1)文法的判别

只要文法G满足上节提到的充分必要条件,则可以证明该文法是LL(1)的。

非LL(1)文法到LL(1)文法的等价变换-提取左公因子

非LL(1)文法到LL(1)文法的等价变换-消除左递归

不确定的自顶向下分析

当文法不满足LL(1)时,则不能用确定的自顶向下分析,这种情况下使用不确定的自顶向下分析,即带回溯的自顶向下分析。引起回溯的原因:在文法中当关于某个非终结符的产生式有多个候选时,而面临当前输入符无法确定选用唯一产生式,从而引起回溯。