context.getText () исключает пробелы в ANTLR4 - PullRequest
0 голосов
/ 21 мая 2018

getText () возвращает полный оператор, исключая пробелы между словами.Одним из способов рассмотрения пробелов является включение их в грамматику.Но есть ли другой способ получить полную строку с учетом пробелов.

1 Ответ

0 голосов
/ 21 мая 2018

Да, есть (при условии, что вы используете ParserRuleContext.getText(). Идея состоит в том, чтобы запросить входной поток символов для диапазона символов. Значения позиций сохраняются в начальных и конечных токенах контекста.

Вот некоторый код (преобразованный из C ++, поэтому он может быть не на 100% правильным):

string sourceTextForContext(ParseTree context) {
  Token startToken = (context.start instanceof TerminalNode) ? (TerminalNode)(start).getSymbol() : (ParserRuleContext)(start).start;
  Token stopToken = (context.stop instanceof TerminalNode) ? (TerminalNode)(stop).getSymbol() : (ParserRuleContext)(stop).start;

  CharStream cs = start.getTokenSource().getInputStream();
  int stopIndex = stop != null ? stop.getStopIndex() : -1;
  return cs.getText(new Interval(start.getStartIndex(), stopIndex));
}

Поскольку эта поисковая функция использует абсолютные индексы символов, она не учитывается ни в одном из возможных правил пробелов..

...