我试图重用词法分析器/解析器来顺序解析短文本块。为了确保不会留下以前运行的任何残留物,我总是这样做
mLexer.reset();
mLexer.setInputStream(new ANTLRInputStream(data));
mParser.reset();
mParser.setTokenStream(new CommonTokenStream(mLexer));
认为无论以前发生什么,这都会完全重置词法分析器和解析器。不幸的是,在解析无效模式时,有些东西仍然存在。
我的词法分析器无法恢复:
@Override
public void recover(final LexerNoViableAltException e) {
throw new RuntimeException(e);
}
我的解析器也不会:
private class HexParserErrorStrategy extends org.antlr.v4.runtime.DefaultErrorStrategy {
@Override
public void recover(final Parser recognizer, final RecognitionException e) {
throw new RuntimeException(e);
}
@Override
public Token recoverInline(final Parser recognizer) throws RecognitionException {
throw new RuntimeException();
}
@Override
public void reportUnwantedToken(final Parser recognizer) {
throw new RuntimeException();
}
}
当我解析像“123456”这样的字符串时,效果很好。之后我解析了一个无效的模式,这给了我一个 RE。如果我再次尝试解析“123456”,结果与第一次运行的结果不同。
那么如何相应地重置我的解析器/词法分析器?