LL(1)
文法的含义
第一个
L——
从左到右扫描输入串
第二个
L——
分析过程用最左推导
(1)——
表明只需向前看
1
个输入符号便可以决定选哪
个产生式进行推导(类似地,
LL(k)
文法则需要向前
看
k
个输入符号才可以确定选用哪个产生式)
一个上下文无关文法为
LL(1)
文法的
充分必要条件
是
,对每个非终结符
A
的两个不同产生式
A→α与
A→β
,满足SELECT(A→α)∩SELECT(A→β)=Φ(关于SELECT集合我已经讲述了
FIRST集 FOLLOW集和SELECT集_用编程写诗的博客-CSDN博客
)
我们在判断一个文法是不是LL(1)文法时最重要的是求出SLECT集合注意在这里有个问题是必须保证每个非终结符A的
任何两个不同的产生式
他们的SELECT集合的交集是Φ
例子:一个非终结符的产生式SELECT集合有三个分别为A B C 需要A∩B=Φ A∩C=Φ B∩C=Φ
而不是A∩B∩C=Φ这个要注意!!!
例题:判断是不是LL(1)文法
G[S]:
S→AB|bC
A→b|ε
B→aD|ε
C→AD|b
D→aS|c
SELECT(S→AB)=(FIRST(AB)
-{ε})∪FOLLOW(S)={
b,a,#
}
SELECT(S→bC) =FIRST(
bC) ={
b
}
SELECT(A→ε) =(FIRST(ε)
-{ε})∪FOLLOW(A)={
a,c,#
}
SELECT(A→b) =FIRST(b) ={
b
}
SELECT(
B→aD) =FIRST(
aD) ={
a
}
SELECT(B→ε) =(FIRST(ε)
-{ε})∪FOLLOW(B)={
#
}
SELECT(C→AD) =FIRST(AD) ={
b,a,c
}
SELECT(C→b) =FIRST(b) ={
b
}
SELECT(D→aS) =FIRST(
aS) ={
a
}
SELECT(D→c) =FIRST(c) ={
c
}
利用定义我们发现这个不是一个LL(1)文法