如果我有像
这样的语法规则a: A (C|D|E)
我可以通过为每个替代方案(C,D,E)添加重写规则来为规则创建AST,如下所示:
a: A (C -> ^(A C)
| D -> ^(A D)
| E -> ^(A E))
但是,如果我得到另一个稍微不同的语法规则,如
a: (A|B) (C|D|E)
如何为每个可能的匹配创建AST?我第一次尝试这样:
a: (A|B) (C|D|E) -> ^((A|B) (C|D|E))
但是,它没有用。
有没有一种简单的方法可以解决这个问题?
提前致谢。 :)
答案 0 :(得分:2)
您有两种选择:
a : (left=A | left=B) (right=C | right=D | right=E) -> ^($left $right)
;
或:
a : left right -> ^(left right)
;
left
: A
| B
;
right
: C
| D
| E
;
就个人而言,我更喜欢2 nd 选项。