/**
* Parses the expression using antlr, aborts the parsing on the first error.
*
* @param expression
* an expression, not {@code null}
* @return a {@link ParseTree} for further processing
* @throws ExpressionException
*/
ParseTree parseExpression(String expression) throws ExpressionException {
if (expression == null) {
throw new IllegalArgumentException("expression must not be null");
}
ANTLRInputStream in = new ANTLRInputStream(expression);
FunctionExpressionLexer lexer = new CapitulatingFunctionExpressionLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
FunctionExpressionParser parser = new FunctionExpressionParser(tokens);
parser.removeErrorListeners();
lexer.removeErrorListeners();
ExpressionErrorListener listener = new ExpressionErrorListener();
parser.addErrorListener(listener);
lexer.addErrorListener(listener);
parser.setErrorHandler(new CapitulatingErrorStrategy());
try {
ParseTree tree = parser.operationExp();
if (listener.containsError()) {
throw new ExpressionException(listener.getErrorMessage(), listener.getErrorLine());
} else {
return tree;
}
} catch (CapitulatingRuntimeException e) {
if (listener.containsError()) {
throw new ExpressionException(listener.getErrorMessage(), listener.getErrorLine());
} else {
// cannot happen since the parser and lexer always register the error before trying
// to recover
throw new ExpressionException("Unknown error");
}
}
}
AntlrParser.java 文件源码
java
阅读 26
收藏 0
点赞 0
评论 0
项目:rapidminer
作者:
评论列表
文章目录