Я пытаюсь получить очень простую грамматику, работающую для ANTLR3 с целью C ++.
Я обнаружил, что если я ссылаюсь на какие-либо переменные в своем действии, я получаю следующую ошибку:
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
Если так, могу ли я спросить, почему базовая функциональность супер-супер-супер нарушена в цели C ++ ANTLR?
Если это кому-нибудь еще пригодится, я сейчас работаю над этим, выполнив команду в моем Makefile, чтобы вручную выполнить поиск и замену в сгенерированном коде:
perl -p -i -e 's/ ImplTraits::CommonTokenType\*/ const ImplTraits::CommonTokenType*/g' $(GEN)/mydir/*.cpp
Задача ещё не решена.
Других решений пока нет …