2011-05-16 73 views
0

我正在寻找一种方法来了解是否使用了可选的子规则。例如:Antlr3 AST创建:如何测试可选的子规则?

my_rule returns [node* n = 0]: 
    (v = (optional_subrule)?) 
    { 
    $n = new node($v ? $v.n : MY_DEFAULT_VALUE); 
    } 
; 

但这不起作用。我尝试过很多办法把它写并没有什么似乎无需编写代码是可能的...

my_rule returns [node* n = new node()]: 
    ((optional_subrule { n->set_subrule(...); })?) 
; 

而当你有一个野牛的背景,你喜欢在你的规则到底有您的AST节点构造...它降低了可读性(想象一个更大的规则)。

有人知道我错过了什么吗?

谢谢。

回答

1

ANTLR不允许这样的功能。不能使用解决方案proposed by Bart Kiers,因为它会导致未定义的行为代码。

所以我不得不重写规则为:

my_rule returns [node* n = 0] 
@init 
{ 
    type temporary_variable = init_value; 
}: 
    (v = optional_subrule { temporary_variable = $v.result; })? 
    mandatory_subrule 
    { 
    $n = new node(temporary_variable, $mandatory_subrule.result); 
    } 
; 

我们现在有一个良好的初始化变量的优势,我们仍然有必要每参数只在一个节点的构造。