![](/img/trans.png)
[英]Why right-recursive grammar is not appropriate for Bottom-Up LR(k) parsing?
[英]Is there a better way to write a right-recursive grammar's production rules than this?
场景:给出一个右递归语法的生产规则,该规则描述由字符R和N构成的所有非空字符串的集合,其中可能包含R的任意多个连续重复,但恰好包含N的两个或三个重复。
回答:
A-> NB | R + A
B-> ND | NC | ∈
C-> ND | ∈
D-> R + D | ∈
不正确:
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,从而生成第一组Ns。 然后,它移动到B,在第一组和第二组Ns之间生成Rs。 然后它将移至C,生成第二组Ns。 然后,它移动到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为止都是一样的,不是提供ε选项,而是提供添加另一组R或转到E即另一组N的选项,但是如果以前没有R,则不会发生这种情况。已作为C的转换输出,然后提供了另一个选择以递归方式添加R或空字符串。
从输入NRNR生成的示例解析树
S
\
A
/ \
N B
/ \
R C
/ \
N D
/ \
R D
\
E
\
F
\
ε
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.