标签:
LL(1)分析法又叫预测分析法,是一种不带回溯的非递归自顶向下的分析法。
LL(1)是不带回溯的非递归的分析法是因为,它每次都只有一个可用的产生式,所以是不带回溯和非递归的,当无法处理输入符号时,即出错。
第一个L表示是从左到右扫描输入串,第二个L表示推导过程中使用最左推导,(1)表明只需要向右看一个符号,就可以决定如何推导的(即知道用哪个产生式进行推导)。
LL(1)分析法的原理是这样的,它的基本思想是根据输入串的当前输入符号来唯一确定选用哪个产生式来进行推导。
比如当前的文法符号是S,面临输入串的首个符号是a, 存在若干个产生式,$S->X_1|X_2|...|X_k$,如果$a \in FIRST(X_i)$,那么肯定就是用$S->X_i$这个产生式来进行推导。
又或者当前的文法符号是S,面临的输入串的首个符号是a,存在产生式$S->X$,若 $\epsilon \in FIRST(X)$, 且$a \in FOLLOW(S)$,那么肯定是用产生式$S=>\epsilon$进行推导。即当然文法符号是没用的。
所以LL(1)文法要满足下面的条件,若存在$S->X_1|X_2$
(1)$FIRST(X_1) \bigcap FIRST(X_2) = \phi $ 。即如果对于文法符号S,有两个产生式的$FIRST$交集不为空,那么就是二义的,就不是LL(1)文法
(2)若$\epsilon \in FIRST(X_2), 则有FIRST(X_1) \bigcap FOLLOW(X_2) = \phi$,同样的,这样也是二义的。
根据上面的思想,我们可以预处理出一张LL(1)分析表,对于任意的文法符号S,面临输入符号a,该用哪个产生式。
形如A->Ab|c的文法,就是左递归文法,可以看出$FIRST(A)=FIRST(c)$,所以左递归文法不是LL(1)文法。
即对左递归构造的LL(1)分析表是有二义性的。
标签:
原文地址:http://www.cnblogs.com/beMaster/p/5071264.html