LL(1)分析法又叫預測分析法,是一種不帶回溯的非遞歸自頂向下的分析法。
LL(1)是不帶回溯的非遞歸的分析法是因為,它每次都只有一個可用的產生式,所以是不帶回溯和非遞歸的,當無法處理輸入符號時,即出錯。
第一個L表示是從左到右掃描輸入串,第二個L表示推導過程中使用最左推導,(1)表明只需要向右看一個符號,就可以決定如何推導的(即知道用哪個產生式進行推導)。
什么是LL(1)分析法
LL(1)分析法的原理是這樣的,它的基本思想是根據輸入串的當前輸入符號來唯一確定選用哪個產生式來進行推導。
比如當前的文法符號是A,面臨輸入串的首個符號是a, 存在若干個產生式,$A \rightarrow X_1|X_2|...|X_k$,如果$a \in FIRST(X_i)$,那么肯定就是用$A \rightarrow X_i$這個產生式來進行推導。
又或者當前的文法符號是A,面臨的輸入串的首個符號是a,存在產生式$A \rightarrow X$,若 $\epsilon \in FIRST(X)$, 且$a \in FOLLOW(A)$,那么肯定是用產生式$A=>\epsilon$進行推導。即當然文法符號是沒用的。
所以LL(1)文法要滿足下面的條件,若存在$A \rightarrow X_1|X_2$
(1)$FIRST(X_1) \bigcap FIRST(X_2) = \phi $ 。即如果對於文法符號A,有兩個產生式的$FIRST$交集不為空,那么就是二義的,就不是LL(1)文法
(2)若$\epsilon \in FIRST(X_2), 則有FIRST(X_1) \bigcap FOLLOW(X_2) = \phi$,同樣的,這樣也是二義的。
對LL(1)文法構造LL(1)分析表
根據上面的思想,我們可以預處理出一張LL(1)分析表,對於任意的文法符號S,面臨輸入符號a,該用哪個產生式。
然后根據3條規則來構造LL(1)分析表(這里默認該文法是LL(1)文法)。
①對文法$G[S]$的每個產生式$A \rightarrow \alpha$執行②,③兩步
②對每個終結符$a \in FIRST(\alpha)$,把$A \rightarrow \alpha$加入到表格中的[A,a] 這個格子。即當文法符號A面臨輸入符號a時,應該使用產生式$A\rightarrow \alpha$
③若$\epsilon \in FIRST(\alpha)$,則對所有的終結符$b \in FOLLOW(A)$,將$A \rightarrow \epsilon$加入到[A,b]這個格子。即當文法符號A面臨輸入符號b時,文法符號A無法推導出終結符號b,但是它的FOLLOW集包含終結符號b,所以用$A=>\epsilon$將$A$替換掉。從而讓$A$的$FOLLOW$集來生成終結符號$b$
④將所有無定義的[A,a]標記為出錯。
為什么左遞歸文法不是LL(1)文法
形如A->Ab|c的文法,就是左遞歸文法,可以看出$FIRST(A)=FIRST(c)$,所以左遞歸文法不是LL(1)文法。
即對左遞歸構造的LL(1)分析表是有二義性的。