Antlr3 AST创建:如何测试可选的子规则?

时间:2011-05-16 22:40:03

标签: parsing antlr bison antlr3 abstract-syntax-tree

我正在寻找一种方法来了解是否使用了可选的子规则。例如:

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 个答案:

答案 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);
  }
;

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