From 112338b5905b06725ca2297c2814c78a608625a5 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 11 Aug 2020 11:38:52 +0200 Subject: [PATCH] Rework keyword parser rule A keyword is either a plain identifier, or two identifiers concatenated through a colon. Make this a bit clearer, aiding debugging of issues. Also push KeywordContext down to StatementContextVisitor.getValidStatementDefinition(), so that we can improve efficiency once IDENTIFIER token has been fixed up. Change-Id: Ic64285255564ae33f8ad208b9a3598ba20cd26fb Signed-off-by: Robert Varga (cherry picked from commit 220f54de00be7e3906349059fdd4bb139859ee23) --- .../yang/parser/antlr/YangStatementParser.g4 | 2 +- .../parser/rfc7950/repo/StatementContextVisitor.java | 8 ++++---- .../rfc7950/repo/YangStatementStreamSource.java | 11 ++++++++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementParser.g4 b/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementParser.g4 index dadf258875..1d7554bf78 100644 --- a/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementParser.g4 +++ b/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementParser.g4 @@ -15,6 +15,6 @@ options { // sequences into two. file : SEP* statement SEP* EOF; statement : keyword (SEP+ argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (statement SEP*)* RIGHT_BRACE); -keyword : (IDENTIFIER COLON)? IDENTIFIER; +keyword : IDENTIFIER (COLON IDENTIFIER)?; argument : STRING (SEP* PLUS SEP* STRING)* | IDENTIFIER; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/StatementContextVisitor.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/StatementContextVisitor.java index e2ddf346b9..734f13526d 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/StatementContextVisitor.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/StatementContextVisitor.java @@ -56,11 +56,12 @@ class StatementContextVisitor { * * @param prefixes collection of all relevant prefix mappings supplied for actual parsing phase * @param stmtDef collection of all relevant statement definition mappings provided for actual parsing phase - * @param keywordText statement keyword text to parse from source + * @param keyword statement keyword text to parse from source * @param ref Source reference * @return valid QName for declared statement to be written, or null */ - QName getValidStatementDefinition(final String keywordText, final StatementSourceReference ref) { + QName getValidStatementDefinition(final KeywordContext keyword, final StatementSourceReference ref) { + final String keywordText = keyword.getText(); final int firstColon = keywordText.indexOf(':'); if (firstColon == -1) { final StatementDefinition def = stmtDef.get(QName.create(YangConstants.RFC6020_YIN_MODULE, keywordText)); @@ -103,11 +104,10 @@ class StatementContextVisitor { // Slow-path allocation of a new statement private boolean processNewStatement(final int myOffset, final StatementContext ctx) { - final String keywordTxt = verifyNotNull(ctx.getChild(KeywordContext.class, 0)).getText(); final Token start = ctx.getStart(); final StatementSourceReference ref = DeclarationInTextSource.atPosition(sourceName, start.getLine(), start.getCharPositionInLine()); - final QName def = getValidStatementDefinition(keywordTxt, ref); + final QName def = getValidStatementDefinition(verifyNotNull(ctx.getChild(KeywordContext.class, 0)), ref); if (def == null) { return false; } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java index 58cfe419bd..a307b4bb04 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java @@ -33,6 +33,7 @@ import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.parser.antlr.YangStatementLexer; import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser; import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.FileContext; +import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.KeywordContext; import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.StatementContext; import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule; import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition; @@ -145,9 +146,13 @@ public final class YangStatementStreamSource extends AbstractIdentifiable