context.getText() excludes spaces in ANTLR4
Asked Answered
T

1

2

The getText() returns the complete statement excluding the spaces between the words. One way of considering the spaces is to include them in grammar. But, is there any other way to get the complete String with the spaces considered.

Topgallant answered 21/5, 2018 at 7:14 Comment(0)
S
6

Yes, there is (assuming here you are using ParserRuleContext.getText(). The idea is to ask the input char stream for a range of characters. The position values are stored in the start and stop tokens of the context.

Here's some code (converted from C++, so it might not be 100% correct):

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));
}

Since this retrieval function uses the absolute char indexes, it doesn't count in any possible whitespace rule.

Stanton answered 21/5, 2018 at 8:27 Comment(4)
See also this question.Capacitance
And also this question.Capacitance
what does context.start and context.stop mean?Hershey
These are the terminal nodes which were matched first and last in the rule represented by the context.Stanton

© 2022 - 2024 — McMap. All rights reserved.