Как только я инициализировал анализатор, лексер и получил контекст translationUnit, как я могу перейти непосредственно к (ближайшему) ParserRuleContext, который содержит определенную позицию строки и символа в antlr4 (время выполнения CPP)?
Обычно я использую шаблон Listener
для обхода контекста translationUnit.В каждом посещенном контексте я могу получить соответствующую строку и символьную позицию контекста, используя следующий код:
antlr4::Token* tokenclass = _tokenstream->get(myContext->getSourceInterval().a); // use ".b" if end of interval is needed
size_t CharPositionStartInLine = tokenclass->getCharPositionInLine();
size_t LineStart = tokenclass->getLine();
Я хотел бы выполнить обратное: получить токен из определенной строки и позиции символа, а затем получить (первый) родительский контекст.Возможно ли это?
Я думаю, что могу достичь того, что хочу (т.е. найти контекст, основанный на позиции строки и символа), проверяя каждую строку и позицию символа context
внутри функции enterEveryRule(antlr4::ParserRuleContext* context)
, но этокажется слишком сложным.Так есть ли более простой способ восстановить ParserRuleContext для определенной строки / символьной позиции?