考虑具有非终结符n={s,c,s1}的语法,终端t={a,b,i,t,e},以s作为起始符号,以及下面的一组规则:
S --> iCtSS1|a S1 --> eS|ϵ C --> b
语法不是LL(1),因为: (A) 它是左递归的 (B) 没错 (C) 这是模棱两可的 (D) 它不是上下文无关的。 答复: (C) 说明:
LL(1)语法不会在其解析表的单个单元格中给出多个条目。它在单个单元格中只有一个条目,因此应该是明确的。
选择A是错误的。 语法不是递归的。对于左递归的语法,产生式应该是a->Ab形式,其中a是单个非终结符,b是任何语法符号字符串。
选项B是错误的 因为右递归语法与LL(1)无关。
选项D是错误的 .因为给定的语法显然是上下文无关的语法。如果一个语法有形式为A->(V)的结果,那么它就是CFG∪ T) *,其中A是单个非端子,V是一组非端子,T是一组端子。
因此,选项C应该是正确的。i、 语法模棱两可。
但让我们看看语法是如何模棱两可的。
如果语法不明确,那么在生成解析表时,它应该在单元格中提供多个条目。解析表是借助两个函数生成的:FIRST和FOLLOW。
语法的分析表将 不 在一个单元格中有多个条目(即将是LL(1)语法) 如果且仅当 以下条件适用于形式A->α|β的每次生成
1) 第一(α)∩ 第一(β)=Φ
2) 如果FIRST(α)包含‘ε’,那么FIRST(α)∩遵循(A)=Φ,反之亦然。
现在
- 对于生产,S->iCtSS1 | a,规则1得到满足,因为第一(iCtSS1)∩ 第一(a)={i}∩ {a} =Φ
- 对于生产,S1->eS |ε,满足规则1,作为第一个(eS)∩ 第一(ε)={e}∩ {ε} = Φ . 但是这里由于第一个是ε,我们必须检查规则2。第一(eS)∩ 跟随(S1)={e}∩ {e,$}≠ Φ . 因此,规则2在这个产生式规则中失败。因此,解析表中将有多个条目,因此语法是不明确的,而不是LL(1)。
请参考以下链接,了解如何首先查找并遵循:
http://geeksquiz.com/compiler-design-first-in-syntax-analysis/
http://geeksquiz.com/compiler-design-follow-set-in-syntax-analysis/