考虑以下语法:非终结点N = {S,C,S1},终结点T = {a,b,i,t,e},以S为起始符号,并遵循以下规则:
S --> iCtSS1|a
S1 --> eS|ϵ
C --> b
语法不是LL(1),因为:
(一)它是递归的
(B)是正确的递归
(三)模棱两可
(D)它不是上下文无关的。答案: (C)
解释:
LL(1)语法不会在其解析表的单个单元格中提供多个条目。它在单个单元格中只有一个条目,因此应该是明确的。
选项A是错误的。语法不是递归的。对于要保留的递归语法,产生形式应为A-> Ab形式,其中A为单个非终端,b为任何字符串的语法符号。
选项B是错误的。因为正确的递归语法与LL(1)没有关系。
选项D是错误的。因为给定的语法显然是上下文无关语法。如果语法的形式为A->(V∪T)*,则语法为CFG,其中A为单个非终结点,V为一组非终结点,T为一组终结点。
因此,选项C应该是正确的。即语法是模棱两可的。
但是,让我们看看语法是如何模棱两可的。
如果语法是模棱两可的,则在创建其解析表时应在一个单元格中给出多个条目。解析表是借助两个功能创建的:FIRST和FOLLOW。
语法的解析表在且仅当以下条件对形式A->α|β的每次生成均成立时,一个语法的解析表在一个单元格中将没有多个条目(即将是LL(1)语法)
1)FIRST(α)∩FIRST(β)=Φ
2)如果FIRST(α)包含“ε”,则FIRST(α)∩跟随(A)=Φ,反之亦然。
现在,
- 对于生产,S-> iCtSS1 | a满足规则1,因为FIRST(iCtSS1)∩FIRST(a)= {i}∩{a} =Φ
- 对于生产S1-> eS |ε,满足规则1,因为FIRST(eS)∩FIRST(ε)= {e}∩{ε} =Φ。但是这里由于FIRST中的’ε’,我们必须检查规则2。FIRST(eS)∩FOLLOW(S1)= {e}∩{e,$}≠Φ。因此,规则2在该生产规则中失败。因此,解析表中将有多个条目,因此语法是模棱两可的,而不是LL(1)。
请参考以下链接以了解如何查找“第一”和“跟随”:
http://quiz.geeksforgeeks.org/compiler-design-first-in-syntax-analysis/
http://quiz.geeksforgeeks.org/compiler-design-follow-set-in-syntax-analysis/
这个问题的测验