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

时间:2014-02-23 19:52:30

标签: antlr

所以我有以下语法:

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,但我相信这与目标语言无关。

1 个答案:

答案 0 :(得分:0)

我认为你应该这样做:

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表达式评估。请注意这一点            包括所有令牌的文本,包括那些令牌           在隐藏的渠道,这是你想要的          因为通常有所有的空白和         评论。在提到当前规则时,        此属性可用于任何操作,包括       任何例外行动。

来自the Definitive Antrl reference