+
+ /**
+ * Use a Lexer/Parser pair extracting the parser's root item.
+ *
+ * @param lexer lexer to use
+ * @param parser parser to use
+ * @param parseMethod Root item extractor method
+ * @param ref Source reference
+ * @return Parsed item
+ * @throws NullPointerException if any argument is null
+ * @throws SourceException if a parser error occurs
+ */
+ public static <T> T parse(final Lexer lexer, final Parser parser, final Supplier<T> parseMethod,
+ final StatementSourceReference ref) {
+ final Listener listener = new Listener(ref);
+ lexer.removeErrorListeners();
+ lexer.addErrorListener(listener);
+ parser.removeErrorListeners();
+ parser.addErrorListener(listener);
+
+ final T ret = parseMethod.get();
+ listener.validate();
+ return ret;
+ }