【问题标题】:Antlr3 AST creation : how to test an optional subrule?Antlr3 AST 创建:如何测试可选子规则?
【发布时间】:2011-05-16 22:40:02
【问题描述】:

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

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 节点构造函数……这会降低可读性(想象一个更大的规则)。

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

谢谢。

【问题讨论】:

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


    【解决方案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);
      }
    ;
    

    我们现在拥有初始化良好变量的优势,而且我们仍然只有一个节点构造函数,其中包含所需的每个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多