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

时间:2017-05-13 20:06:10

标签: recursion compiler-construction grammar

场景:为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ε

2 个答案:

答案 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
                \
                 ε