/**
* Read expression from reader.
*
* @param reader A reader supplying the input of an expression.
* @return A TimeSeriesMetricExpression corresponding to the parsed input
* from the reader.
* @throws IOException on IO errors from the reader.
* @throws
* com.groupon.lex.metrics.timeseries.TimeSeriesMetricExpression.ParseException
* on invalid expression.
*/
public static TimeSeriesMetricExpression valueOf(Reader reader) throws IOException, ParseException {
final Logger LOG = Logger.getLogger(TimeSeriesMetricExpression.class.getName());
class DescriptiveErrorListener extends BaseErrorListener {
public List<String> errors = new ArrayList<>();
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol,
int line, int charPositionInLine,
String msg, org.antlr.v4.runtime.RecognitionException e) {
LOG.log(Level.INFO, "Parse error: {0}:{1} -> {2}", new Object[]{line, charPositionInLine, msg});
errors.add(String.format("%d:%d: %s", line, charPositionInLine, msg));
}
}
final DescriptiveErrorListener error_listener = new DescriptiveErrorListener();
final ExpressionLexer lexer = new ExpressionLexer(CharStreams.fromReader(reader));
lexer.removeErrorListeners();
lexer.addErrorListener(error_listener);
final Expression parser = new Expression(new BufferedTokenStream(lexer));
parser.removeErrorListeners();
parser.addErrorListener(error_listener);
final Expression.ExprContext expr;
try {
expr = parser.expr();
} catch (Exception ex) {
LOG.log(Level.SEVERE, "parser yielded exceptional return", ex);
if (!error_listener.errors.isEmpty())
throw new ParseException(error_listener.errors, ex);
else
throw ex;
}
if (!error_listener.errors.isEmpty()) {
if (expr.exception != null)
throw new ParseException(error_listener.errors, expr.exception);
throw new ParseException(error_listener.errors);
} else if (expr.exception != null) {
throw new ParseException(expr.exception);
}
return expr.s;
}
TimeSeriesMetricExpression.java 文件源码
java
阅读 21
收藏 0
点赞 0
评论 0
项目:monsoon
作者:
评论列表
文章目录