场景:为RIGHT-recursive语法提供生产规则 描述了由字符组成的所有非空字符串的集合 R和N,可能包含任意多个连续的 R的重复,但恰好是两个或恰好三个连续的 重复N。
答案:
A - > N B | R + A
B - > N D | N C | Nε
C - > N D | Nε
D - > R + D | Rε
答案 0 :(得分:1)
不正确:
A -> NNB | NNNB | RA | R
B -> R | RA | ε
编辑:以上不正确,我误解了这个场景。
正确:
S -> RS | A
A -> NA | NB
B -> RB | RC
C -> NC | ND
D -> RD | RE | ε
E -> NE | NF
F -> RF | ε
工作原理: 它以S开始,可以生成0或更多R或移动到A,从而生成第一组N.然后它移动到B,它在第1和第2组Ns之间产生Rs。然后它移动到C,产生第二组Ns。然后它移动到D,它可以生成0或更多的Rs并完成或移动到E,这将生成第3组Ns。最后它移动到F,产生0或更多的Rs。
答案 1 :(得分:0)
这也很有效,而且更简单:
S -> RS | A
A -> NA | NB
B -> RB | RC
C -> NC | ND
D -> RD | E
E -> NE | F
F -> RF | ε
与D相同,它不是提供ε选项而是提供添加另一组R的选项或者转到另一组N的E,但如果之前没有R,则不会发生这种情况。因为它们将作为C的转换输出,然后是递归添加R或空字符串的另一个选项。
从输入NRNR生成的示例解析树
S
\
A
/ \
N B
/ \
R C
/ \
N D
/ \
R D
\
E
\
F
\
ε