龙书中,LL语法定义如下:
语法是 LL 当且仅当对于任何产生式A -> a|b
,以下两个条件适用。
FIRST(a)
并且FIRST(b)
是不相交的。这意味着它们不能同时导出EMPTY
如果
b
可以导出EMPTY
,则a
不能导出任何以 开头的字符串FOLLOW(A)
,即FIRST(a)
并且FOLLOW(A)
必须是不相交的。
而且我知道LL语法不能递归,但是形式上的原因是什么?我猜左递归语法会与规则 2 相矛盾,对吧?例如,我写了以下语法:
S->SA|empty
A->a
因为FIRST(SA) = {a, empty}
and FOLLOW(S) ={$, a}
, then FIRST(SA)
andFOLLOW(S)
不是不相交的,所以这个文法不是 LL。但我不知道是左递归makeFIRST(SA)
而FOLLOW(S)
不是不相交,还是有其他原因?换句话说,是否每个左递归文法都会有一个违反 LL 文法条件 2 的产生式?