ANTLR语法给了我颠倒的树

时间:2011-02-20 10:51:30

标签: antlr

我有一个解析点概念表达式的语法,如下所示:
A.B.C

memberExpression returns [Expression value]
  : i=ID                                     { $value = ParameterExpression($i.value); }
    ('.' m=memberExpression                  { $value = MemberExpression($m.value, $i.value); }
    )*     
  ;

这解析表达式很好,并给我一个像这样的树结构:

MemberExpression(
   MemberExpression(
     ParameterExpression("c"),
     "b"
   )
   , "a"
)

但我的问题是我想要一棵看起来像这样的树:

MemberExpression(
   MemberExpression(
     ParameterExpression("a"),
     "b"
   )
   , "c"
)

表示相同的表达“a.b.c”

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用ANTLR的便捷java.util.List运算符收集+=中的所有令牌,并使用@parser::members部分中的自定义方法创建所需的树:

// grammar def ...

// options ...

@parser::members {
  private Expression customTree(List tks) {
    // `tks` is a java.util.List containing `CommonToken` objects
  }
}

// parser ...

memberExpression returns [Expression value]
  :  ids+=ID ('.' ids+=ID)* { $value = customTree($ids); }
  ;

答案 1 :(得分:0)

我认为你要求的是互相递归,因此ANTLR不是解析它的好选择。

详细说明,您需要在树的根处使用C,因此您的规则将是:

rule: rule ID;

此规则将不确定是否应匹配

a.b

a.b.c