自顶向下分析存在的问题
并不是所有的文法都适用于自顶向下的分析。
例子:
消除直接左递归
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,在有公共前缀的情况下,我们可以先把公共前缀给提取出来
提取左公因子算法如下