我有一个解析点概念表达式的语法,如下所示:
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”
我怎样才能做到这一点?
答案 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