context.getText() 排除 ANTLR4 中的空格
context.getText() excludes spaces in ANTLR4
getText() returns 完整的语句不包括单词之间的空格。考虑空格的一种方法是将它们包含在语法中。但是,有没有其他方法可以得到考虑空格的完整字符串。
是的,有(假设你在这里使用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));
}
由于此检索函数使用绝对字符索引,因此它不计入任何可能的空白规则。
getText() returns 完整的语句不包括单词之间的空格。考虑空格的一种方法是将它们包含在语法中。但是,有没有其他方法可以得到考虑空格的完整字符串。
是的,有(假设你在这里使用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));
}
由于此检索函数使用绝对字符索引,因此它不计入任何可能的空白规则。