public <T> T parse(Reader reader, Class<T> targetType) throws IOException {
logger.debug("Parsing configuration for type:{}", targetType);
ANTLRErrorListener listener = new BaseErrorListener() {
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
throw new ConfigurationException(String.format("Unable to parse configuration: %s (at line:%s pos:%s)", msg, line, charPositionInLine), e);
}
};
TypeDescriptor typeDescriptor = TypeMapping.ofType(targetType);
ANTLRInputStream inputStream = new ANTLRInputStream(reader);
ConfigurationLexer lexer = new ConfigurationLexer(inputStream);
lexer.removeErrorListeners();
lexer.addErrorListener(listener);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
com.rocana.configuration.antlr.ConfigurationParser parser = new com.rocana.configuration.antlr.ConfigurationParser(tokenStream);
parser.removeErrorListeners();
parser.addErrorListener(listener);
ParseTree parseTree = parser.config();
logger.debug("Parsed configuration:{}", parseTree.toStringTree(parser));
Visitor<T> visitor = new Visitor<>(typeDescriptor);
visitor.visit(parseTree);
logger.debug("Configured object:{}", visitor.getResult());
return visitor.getResult();
}
ConfigurationParser.java 文件源码
java
阅读 28
收藏 0
点赞 0
评论 0
项目:rocana-configuration
作者:
评论列表
文章目录