由上述例子不难看出含有左递归的文法绝对不是LL(1)文法,对此结论读者可以自己证明,所以也就不可能用确定的自顶向下分析法,然而,为了使某些含有左递归的文法经过等价变换消除左递归后可能变为LL(1)文法,可采取下列变换公式: a) 消除直接左递归,把直接左递归改写为右递归,如对文法G5: S→Sa S→b 可改写为: S→bS′ S′→aS′|ε 改写后的文法和原文法产生的语言句子集都为:{ban|n≥0}。 读者自己验证改写后的文法为LL(1)文法。 一般情况下,假定关于A的全部产生式是: A→Aα1|Aα2|…|Aαm|β1|β2|…|βn 其中,αi(1≤i≤m)不等于ε,βj(1≤j≤n)不以A开头,消除直接左递归后改写为: A→β1 A′|β2 A′|…|βn A′ A′→α1 A′|α2 A′|…|αm A′|ε b) 消除间接左递归。 对于间接左递归的消除需先将间接左递归变为直接左递归,然后再按a)消除直接左递归。 |