编译原理——语法分析

Posted by BY KiloMeter on January 30, 2019

自顶向下的分析

从分析树的顶部(根节点)向底部(叶节点)方向构造分析树

可以看成是从文法开始符号S推导出词串w的过程

在每一步推导中,都需要做两个选择

  • 替换当前句型中的哪个非终结符
  • 用该非终结符的哪个候选式进行替换

最左推导

在最左推导中,总是选择每个句型的最左非终结符进行替换

最左推导的逆过程称为最右归约

如果S => $ ^*_{lm} \alpha$,则称$ \alpha$是当前文法的最左句型

最右推导

在最右推导中,总是选择每个句型的最右非终结符进行替换

最右推导的逆过程称为最左归约

在自底向上的分析中,总是采用最左归约的方式,因此把最左归约称为规范归约,而最右推导相应地称为规范推导

最左推导和最右推导的唯一性

可以看到,上图的四个推导过程都是这棵语法树的推导过程,但是对于最左推导和最右推导来说,每次替换时由于最左(或最右)的非终结符都是唯一确定的,因此替换后的结果也是唯一的,

由于分析器都是自左向右进行扫描,所以自顶向下的语法分析采用最左推导。

分析器最左推导的实现

递归下降分析

  • 由一组过程组成,每个过程对应一个非终结符
  • 从文法开始符号S对应的过程开始,其中递归调用文法中其它非终结符对应的过程。如果S对应的过程体恰好扫描了整个输入串,则成功完成语法分析

伪代码:

不过在这个过程中可能会出现当前输入的符号a有多个与之匹配,这种情况下需要进行逐个尝试,如果匹配失败的话需要回溯。

预测分析

预测分析是递归下降分析技术的一个特例,通过在输入中向前看固定个数(通常是一个) 符号来选 择正确的A-产生式。

可以对某些文法构造出向前看k个输入符号的预测分析器,该类文法有时也称为LL(k) 文法类。

预测分析不需要回溯,是一种确定的自顶向下分析方法。