编译原理——文法转换

Posted by BY KiloMeter on January 30, 2019

自顶向下分析存在的问题

并不是所有的文法都适用于自顶向下的分析。

例子:

消除直接左递归

A $ \rightarrow A \alpha | \beta( \alpha!= \epsilon,\beta 不以A开头)$等价于

A $\Rightarrow A \alpha$

$\Rightarrow A \alpha \alpha$

$\Rightarrow A \alpha \alpha \alpha$

$\Rightarrow A \alpha … \alpha$

$\Rightarrow \beta \alpha … \alpha$

从上面的转换可以看到,A $\rightarrow A \alpha | \beta( \alpha!=\epsilon,\beta 不以A开头)$这个文法是产生以$ \beta$开头,以0-n个$ \alpha$结尾的串

因此上述文法可以改写为以下文法

A $\rightarrow \beta A^{‘} $

$ A^{‘} \rightarrow \alpha A^{‘} | \epsilon $

实际上,这种消除过程就是把左递归转换成了右递归

上面第二个例子进行文法转换可得

消除直接左递归的一般形式为

消除间接左递归

例子

$ S \rightarrow A \alpha | \beta $

$ A \rightarrow Ac | Sd | \epsilon$

$S \Rightarrow A \alpha$

$\Rightarrow Sd \alpha $

消除的方法:

将S的定义代入A-产生式,得

$ A \rightarrow Ac | A \alpha d | \beta d | \epsilon $

这样就把间接左递归转换成了直接左递归,然后用处理直接左递归的方式处理即可

消除左递归算法伪代码

现在回到问题1,在有公共前缀的情况下,我们可以先把公共前缀给提取出来

提取左公因子算法如下