如何同时使用$text规则返回值获取原始文本



所以我有以下语法:

top_cmd :cmds
        {
            std::cout << $cmds.text << std::endl;
        }
        ;

cmds returns [char* str]
    : cmd+
    {
        str = new char('a');
    }
    ;

我收到 g++ 编译错误:

"str" was not declared in this scope

如果我删除此行

std::cout << $cmds.text << std::endl;

然后编译就可以了。

我用谷歌搜索了如何使用"$text",在我看来,它应该使用$text来重写规则。在我的示例中,函数"cmds"在我删除有问题的行时返回"char*",并在保留它时返回一些复杂的结构。

我可以想到以下解决方法:

1. do not have lower level rules return anything, but pass variable into lower level rules.
2. use re-write rules

但两者都是相当大的变化(我的真实项目相当大),考虑到我有多少时间让步。

那么有没有捷径呢?基本上我不想改变top_cmd和cmds的语法,但我可以获得cmds匹配的全文。

我正在使用ANTLR3C,但我相信这与目标语言无关。

我认为你应该做这样的事情:

top_cmd :cmds
    {
        std::cout << $cmds.text << std::endl;}
    ;

cmds returns [char* str]
: cmd+
  {
      $str = new char('a'); //added $
  }
  ;

$cmds.text将返回与规则 cmds 匹配的文本。如果要返回 str,则应将其更改为$cmds.str

$text:与规则匹配的文本或匹配的文本 从规则的开始到点 $text表达式评估。请注意,这 包括所有令牌的文本,包括那些 在隐藏频道上,这就是您想要的 因为通常它有所有的空格和 评论。当提到当前规则时, 此属性在任何操作中都可用,包括 任何异常操作。

来自权威安特尔参考

最新更新