所以我有以下语法:
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表达式评估。请注意,这 包括所有令牌的文本,包括那些 在隐藏频道上,这就是您想要的 因为通常它有所有的空格和 评论。当提到当前规则时, 此属性在任何操作中都可用,包括 任何异常操作。
来自权威安特尔参考