ANTLR树构造问题

时间:2011-07-12 08:28:07

标签: antlr

如果我有像

这样的语法规则
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))

但是,它没有用。

有没有一种简单的方法可以解决这个问题?

提前致谢。 :)

1 个答案:

答案 0 :(得分:2)

您有两种选择:

1

a : (left=A | left=B) (right=C | right=D | right=E) -> ^($left $right)
  ;

或:

2

a : left right -> ^(left right)
  ;

left 
  :  A 
  |  B
  ;

right
  :  C
  |  D
  |  E
  ;

就个人而言,我更喜欢2 nd 选项。