Генерация метки в Antlr4 с C ++ не позволяет получить доступ к значению метки - PullRequest
0 голосов
/ 28 июня 2019

У меня есть старая грамматика, в которой я работал с некоторым кодом Java, теперь я меняю поколение в Cpp.

Мое правило содержит метку, но когда я реализую Слушатель при правиле выхода, в CPP нет способа получить значение элемента по метке

правило:

msg : 
    destination=address
    time
    sender=address
;

То, как я получал доступ к значению метки в Java (из моего пользовательского прослушивателя), было таким:

ctx.destination.getText()

но кое-как, теперь в CPP я вижу, что в сгенерированном базовом слушателе метка назначения используется для генерации nullptr, который никогда не используется.

MessageGrammar::AddressContext *destination = nullptr;

Я что-то не так делаю? метки не используются в генерации CPP?

1 Ответ

0 голосов
/ 29 июня 2019

Вот что ANTLR4 генерирует для меня:

ExampleParser::MsgContext* ExampleParser::msg() {
  MsgContext *_localctx = _tracker.createInstance<MsgContext>(_ctx, getState());
  enterRule(_localctx, 16, ExampleParser::RuleMsg);

  auto onExit = finally([=] {
    exitRule();
  });
  try {
    enterOuterAlt(_localctx, 1);
    setState(60);
    dynamic_cast<MsgContext *>(_localctx)->destination = address();
    setState(61);
    time();
    setState(62);
    dynamic_cast<MsgContext *>(_localctx)->sender = address();

  }
  catch (RecognitionException &e) {
    _errHandler->reportError(this, e);
    _localctx->exception = std::current_exception();
    _errHandler->recover(this, _localctx->exception);
  }

  return _localctx;
}

Как видите, destination член получает результат от назначенного вызова правила address.

Элемент destination является общедоступным, поэтому вы можете получить к нему доступ в своем слушателе (при выходе из правила, а не при входе в правило, где это поле еще не назначено).

...