Recursion 有没有比这更好的方法来编写正确的递归语法的产生式规则?

Recursion 有没有比这更好的方法来编写正确的递归语法的产生式规则?,recursion,compiler-construction,grammar,Recursion,Compiler Construction,Grammar,场景:为正确的递归语法提供生成规则 描述由字符组成的所有非空字符串的集合 R和N,可以包含任意多个连续的 R的重复,但恰好是两个或三个连续的 重复N 答复: A->NB | R+A B->nd | nc | Nε C->nd | Nε D->R+D|Rε不正确: A -> NNB | NNNB | RA | R B -> R | RA | ε 编辑:以上不正确,我误解了场景 正确: S -> RS | A A -> NA | NB B -> RB | RC C -

场景:为正确的递归语法提供生成规则 描述由字符组成的所有非空字符串的集合 R和N,可以包含任意多个连续的 R的重复,但恰好是两个或三个连续的 重复N

答复:

A->NB | R+A

B->nd | nc | Nε

C->nd | Nε

D->R+D|Rε不正确:

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,B在第一组和第二组Ns之间生成Rs。然后它移动到C,C生成第二组N。然后移动到D,它可以生成0个或多个Rs,或者完成,或者移动到E,它生成第三组Ns。最后,它移动到F,它生成0个或更多Rs。

这同样有效,而且更简单:

S -> RS | A
A -> NA | NB
B -> RB | RC
C -> NC | ND
D -> RD | E
E -> NE | F
F -> RF | ε
与D相同,在D中,不是提供ε选项,而是提供添加另一组R或转到E的选项,E是另一组N,但如果之前没有R,则不会发生这种情况,因为它们将作为C的转换输出,然后是另一个递归添加R或空字符串的选项

从输入NRNR生成的解析树示例

S
  \
   A
  / \
 N   B
    / \
   R   C
      / \
     N   D
        / \
       R   D
            \
             E
              \
               F
                \
                 ε

你能详细解释一下吗?你确定这是正确的,因为看起来你可以有一个只由一个R a->R组成的句子,这不能满足2-3 N的要求吗?哦。我可能误解了你的意思。所以我想你需要一个语法,它能生成2到3组N的字符串。