http://www.alphway.org

LL(1)分析法

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,该用哪个产生式。

首先,处理出非终结符号的$FIRST集和FOLLOW集合$

然后根据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)分析表是有二义性的。

 

posted @ 2015-12-23 21:24  litten007  阅读(5564)  评论(0编辑  收藏  举报