我试图让一个超级简单的语法为带有C ++目标的ANTLR3工作。
我发现如果我在操作中引用任何变量,我会收到以下错误:
invalid conversion from ‘const CommonTokenType* {aka const CommonToken<Traits<NlpCfgRuleAntlrLexer, NlpCfgRuleAntlrParser>>*}’ to ‘Traits<NlpCfgRuleAntlrLexer, NlpCfgRuleAntlrParser>::CommonTokenType* {aka CommonToken<Traits<NlpCfgRuleAntlrLexer, NlpCfgRuleAntlrParser>>*}’ [-fpermissive]
这是我语法的核心部分:
def
: ID ':' {$ID.text;}
;
ID : 'a'..'z'+ ;
如果我将生成的C ++源代码转到此行:
ImplTraits::CommonTokenType* ID1 = NULL;
...并将其更改为:
const ImplTraits::CommonTokenType* ID1 = NULL;
...然后编译错误就消失了。
也许解决方法在这里:(?)
https://github.com/ibre5041/antlr3/commit/0c90ab8f8506a46e37f54988207cb4d6a1d2596a
如果是这样,请问为什么在ANTLR的C ++目标中超级超级超级基本功能会被打破?
如果它对其他人有帮助,我目前正在通过在我的Makefile中运行命令来手动搜索和替换生成的代码来解决这个问题:
perl -p -i -e 's/ ImplTraits::CommonTokenType\*/ const ImplTraits::CommonTokenType*/g' $(GEN)/mydir/*.cpp