我正在寻找一种方法来了解是否使用了可选的子规则。例如:
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节点构造函数......它会降低可读性(想象一个更大的规则)。
有没有人知道我错过的东西?
谢谢。
答案 0 :(得分: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);
}
;
我们现在拥有良好初始化的变量的优势,我们仍然只有一个节点构造函数,每个参数都需要。