private Path_argContext parseLeafRefPathSource(final String path) throws LeafRefYangSyntaxErrorException {
final LeafRefPathLexer lexer = new LeafRefPathLexer(CharStreams.fromString(path));
- final CommonTokenStream tokens = new CommonTokenStream(lexer);
- final LeafRefPathParser parser = new LeafRefPathParser(tokens);
- parser.removeErrorListeners();
+ final LeafRefPathParser parser = new LeafRefPathParser(new CommonTokenStream(lexer));
final LeafRefPathErrorListener errorListener = new LeafRefPathErrorListener(module);
+ lexer.removeErrorListeners();
+ lexer.addErrorListener(errorListener);
+ parser.removeErrorListeners();
parser.addErrorListener(errorListener);
final Path_argContext result = parser.path_arg();
import com.google.common.annotations.Beta;
import java.util.function.Supplier;
import javax.annotation.concurrent.NotThreadSafe;
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import org.eclipse.jdt.annotation.NonNullByDefault;
listener.validate();
return ret;
}
+
+ /**
+ * 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;
+ }
}
\ No newline at end of file
private static StatementContext parseYangSource(final SourceIdentifier source, final InputStream stream)
throws IOException, YangSyntaxErrorException {
final YangStatementLexer lexer = new YangStatementLexer(CharStreams.fromStream(stream));
- final CommonTokenStream tokens = new CommonTokenStream(lexer);
- final YangStatementParser parser = new YangStatementParser(tokens);
- //disconnect from console error output
+ final YangStatementParser parser = new YangStatementParser(new CommonTokenStream(lexer));
+ // disconnect from console error output
+ lexer.removeErrorListeners();
parser.removeErrorListeners();
final YangErrorListener errorListener = new YangErrorListener(source);
+ lexer.addErrorListener(errorListener);
parser.addErrorListener(errorListener);
final StatementContext result = parser.statement();
}
static Predicate<Set<QName>> parseIfFeatureExpression(final StmtContext<?, ?, ?> ctx, final String value) {
- final IfFeatureExpressionParser parser = new IfFeatureExpressionParser(new CommonTokenStream(
- new IfFeatureExpressionLexer(CharStreams.fromString(value))));
- return new IfFeaturePredicateVisitor(ctx).visit(SourceExceptionParser.parse(parser, parser::if_feature_expr,
- ctx.getStatementSourceReference()));
+ final IfFeatureExpressionLexer lexer = new IfFeatureExpressionLexer(CharStreams.fromString(value));
+ final IfFeatureExpressionParser parser = new IfFeatureExpressionParser(new CommonTokenStream(lexer));
+ return new IfFeaturePredicateVisitor(ctx).visit(SourceExceptionParser.parse(lexer, parser,
+ parser::if_feature_expr, ctx.getStatementSourceReference()));
}
@Override
@Override
public YangXPathExpression parseExpression(final String xpath) throws XPathExpressionException {
// Create a parser and disconnect it from console error output
- final xpathParser parser = new xpathParser(new CommonTokenStream(new xpathLexer(
- CharStreams.fromString(xpath))));
- parser.removeErrorListeners();
+ final xpathLexer lexer = new xpathLexer(CharStreams.fromString(xpath));
+ final xpathParser parser = new xpathParser(new CommonTokenStream(lexer));
+
final List<XPathExpressionException> errors = new ArrayList<>();
- parser.addErrorListener(new BaseErrorListener() {
+ final BaseErrorListener listener = new BaseErrorListener() {
@Override
public void syntaxError(final @Nullable Recognizer<?, ?> recognizer, final @Nullable Object offendingSymbol,
final int line, final int charPositionInLine, final @Nullable String msg,
errors.get(0).addSuppressed(ex);
}
}
- });
+ };
+
+ lexer.removeErrorListeners();
+ lexer.addErrorListener(listener);
+ parser.removeErrorListeners();
+ parser.addErrorListener(listener);
final YangExpr expr = parseExpr(parser.main().expr());
if (!errors.isEmpty()) {
}
private YangLiteralExpr parseLocationLiteral(final String text) {
- final instanceIdentifierParser parser = new instanceIdentifierParser(new CommonTokenStream(new xpathLexer(
- CharStreams.fromString(text))));
+ final xpathLexer lexer = new xpathLexer(CharStreams.fromString(text));
+ final instanceIdentifierParser parser = new instanceIdentifierParser(new CommonTokenStream(lexer));
+ lexer.removeErrorListeners();
parser.removeErrorListeners();
+ // FIXME: add listeners
+
final InstanceIdentifierContext id = parser.instanceIdentifier();
final int length = id.getChildCount();
final List<Step> steps = new ArrayList<>(length / 2);