1、 构造下面文法的LL(1)分析表。
D→ TL
T→ int | real L→ id R
R→ , id R | ε
解答: LL(1)分析表见表4-3-1
分析 虽然这个文法很简单,我们还是从求开始符号集合和后继符号集合开始。 FIRST(D)=FIRST(T)={int, real} FOLLOW(D)=FOLLOW(L)={#}
FIRST(L)={id} FOLLOW(T)={id}
FIRST(R)={,, ε} FOLLOW(R)={#}
有了上面每个非终结符的FIRST集合,填分析表时要计算一个产生式右部α的FIRST(α)就不是件难事了。
填表时唯一要小心的时,ε是产生式R→ε右部的一个开始符号,而#在FOLLOW(R)中,所以R→ε填在输入符号#的栏目中。
表4-3-1 LL(1)分析表 非终结符 D T L R
2、 下面文法G[S]是否为LL(1)文法?说明理由。
S → A B | P Q x A → x y B → b c P → d P | ε Q → a Q | ε 解答: 该文法不是LL(1)文法,见下面分析中的说明。 分析 只有三个非终结符有两个选择。
1、P的两个右部d P 和ε 的开始符号肯定不相交。
2、Q的两个右部a Q 和 ε 的开始符号肯定不相交。
3、对S来说,由于x ∈ FIRST(A B),同时也有x ∈ FIRST(P Q x)(因为P和Q都可能为空)。所以该文法不是LL(1)文法。 3、 设有以下文法:
G[S]:S→aAbDe|d A→BSD|e
B→SAc| cD| ε D→Se| ε
(1)求出该文法的每一个非终结符U的FOLLOW集。 (2)该文法是LL(1)文法吗?
(3)构造C[S]的LL(1)分析表。
解答: (1)求文法的每一个非终结符U的FOLLOW集的过程如下:
因为:
① S是识别符号,且有A→BSD、B→SAc、D→Se,所以FOLLOW(S)应包含
int D→TL T→int 输入符号 real D→TL T→real id L→id R , R→,id R # R→ ε
FIRST(D)∪FIRST(Ac) ∪FIRST(e) ∪{#} ={a,d}∪{a,d,c,e}∪{e}∪{#}
={a,c,d,e#}
② 又因为A→BSD和D→ε,所以FOLLOW中还包含FOLLOW(A)。
因为S→aAbDe和B→SAc,所以 FOLLOW(A)=FIRST(bDe)∪FIRST(c)={b,c}
综合①、②得FOLLOW(S)={a,d,c,e,#}∪{a,b,c,d,e,#} 因为A→BSD,所以 FOLLOW(B)=FIRST(SD)={a,d} 因为S→aAbDe | d、A→BSD| e和B→SAc | cD,所以
FOLLOW(D)=FIRST(e)∪FOLLOW(A)∪FOLLOW(B)
={e}∪{b,c}∪{a,d}={a,b,c,d,e} (2)G[S]不是LL(1)文法。
因为产生式B→SAc|cD| ε 中
FIRST(SAc)∩FOLLOW(B)={a,d}≠?
(3)构造G[S]的LL(1)分析表。
按照LL(1)分析表的构造算法构造方法G[S]的LL(1)分析表如表4-3-2所示。
表4-3-2 G[S]的LL(1)分析表 S A B a aAbDe BSD Sac/ε b c BSD cD ε d d BSD Sac/ε Se/ε e e ε # Se/ε ε D 4、 将文法G[V]改造成为LL(1)的。
G[V]:V→N|N[E] E→V|V+E
N→i
解答: 对文法G[V]提取公共左因子后得到文法: G′[V]:V→NA
A→ε|[E] E→VB B→ε|+E N→i
求出文法G′[V]中每一个非终结符号的FIRST集: FIRST(V)={i} FIRST(A)={[, ε}
FIRST(E)={i}
FIRST(B)={+, ε}
FIRST(N)={i}
求出文法G′[V]中每一个非终结符号的FOLLOW集:
FOLLOW(V)={#}∪FIRST(B)\\{ε}∪FOLLOW(E)={#,+,]}
FOLLOW(A)= FOLLOW(V)={+,,#}
FOLLOW(E)= FIRST(])\\{ε}∪FOLLOW(B)= FIRST(])\\{ε}∪FOLLOW(E)={]}
FOLLOW(B)= FOLLOW(E)={ ]} FOLLOW(N)= FIRST(A)\\{ε}∪FOLLOW(V)={[,],+,#} 可以看到,对文法G′[V]的产生式A→ε|[E],有
FIRST([E])∩FOLLOW(A)={[}∩{+,],#}= ?
对产生式B→ε|+E,有
FIRST(+E)∩FOLLOW(B)={+}∩{]}= ?
而文法的其他产生式都只有一个不为ε的右部,所以文法G′[V]是LL(1)文法。 5、已知文法: G[A]: A→aAa|ε
(1)该文法是LL(1)文法吗?为什么?
(2)若采用LL(1)方法进行语法分析,如何得到该文法的LL(1)分析表? (3)若输入符号串“aaaa”,请给出语法分析过程。 解答:(1)因为产生式A→aAa|ε 有空产生式右部,而 FOLLOW(A)={#}∪FIRST(a)={a, #} 造成 FIRST(A)∩FOLLOW(A)={A, ε}∩{a, #}≠? 所以该文法不是LL(1)文法。
(2)若采用LL(1)方法进行语法分析,必须修改该文法。 因该文法产生偶数(可以为0)个a,所以得到文法 G′[A]: A→aaA|ε
此时对产生式A→aaA|ε, 有 FOLLOW(A)={#}∪FOLLOW(A)={#},因而 FIRST(A)∩FOLLOW(A)={a, ε}∩{#}=? 所以文法G′[A]是LL(1)文法,按LL(1)分析表构造算法构造该文法的LL(1)分析表如表4-3-3所示。
表4-3-3 A
(3)若采用LL(1)方法进行语法分析,对符号串“aaaa”的分析过程如表4-3-4所示。
表4-3-4 步骤 1 2 3 4 5 6 7 8
对符号串“aaaa”的分析过程 分析栈 输入串 #A #A a a #A a #A #A a a #A a #A # a a a a # a a a a # a a a # a a # a a # a# # # 产生式/动作 A→aaA 匹配 匹配 A→aaA 匹配 匹配 A→ε 接受 文法G′[A]的LL(1)分析表 A A→aaA # A→ε 第七节 习题
设有文法G[S]为:
S→a|b|(A)
A→SdA|S
(1) 完成下列算符优先关系表,见表5-7-1,并判断G[S]是否为算符优先文法。
表5-7-1 算符优先关系表
a b ( ) d # a ? ? b ? ? ( ? ? ) ? ? ? ? d # ? ? ? ?
(2)给出句型(SdSdS)的短语、简单短语、句柄、素短语和最左素短语。 (3)给出输入串(adb)#的分析过程。 解答:
(1)先求文法G[S]的FIRSTVT集和LASTVT集:
由S→a|b|(A)得:FIRSTVT(S)={a,b,( );
由A→Sd?得:FIRSTVT(A)={d};又由A→S?得:FIRSTVT(S) ? FIRSTVT(A),即FIRSTVT(A)={d,a,b,(};
由S→a|b|(A)得;LASTVT(S)={a,b,}};
由A→?dA得:LASTVT(A)={d},又由A→S得:LASTVT(S) ? LASTVT(A),即LASTVT(A)={d,a,b,)}。
构造优先关系表方法如下:
① 对P→?ab?,或P→?aQb?,有a?b; ② 对P→?aR?,而b∈FIRSTVT(R),有a?b; ③ 对P→?Rb?,而a∈FIRSTVT(R),有a?b。 由此得到:
① 由S→(A)得:(?);
② 由S→(A?得:(?FIRSTVT(A),即:(?d,(?a ,(?b,(?(;由A→?dA得:d?FIRSTVT(A), 即:d?d,d?a,d?b,d?(;
③ 由S→A)得,LASTVT(A)?),即:d?),a?),b?),)?);由A→Sd?得:LASTVT(S)?d,即:a?d,b?d,)?d;
此外,由#S#得:#?#;
由#?FIRSTVT(S)得:#?a,#?b,#?(;脂由LASTVT(S)?#得:d?#,a?#,b?#,)?#。
最后得到算符优先关系表,见表5-7-2。
表5-7-2 算符优先关系表
a b ( ) d # a ? ? ? b ? ? ? ( ? ? ? ) ? ? ? ? ? d ? ? ? ? # ? ? ? ? ?
由表5-7-2可以看出,任何两个终结符之间至少只满足?、?、?三种优先关系之一,故G[S]为算符优先文法。
(2)为求出句型(SdSdS)的短语、简单短语、句柄,我们先画出该句型对应的语法树,如图5-7-3所示。由图5-7-3得到: 短语:S,SdS,SdSdS,(SdSdS)
S 简单短语(即直接短语):S 句柄(即最左直接短语):S
素短语:SdS,它同时也是该句型的最左素短语。
A ( )
S d A S d A S
相关推荐: