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