From b462288cc6e678b9350551c64ecda96196ebe8b4 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 11 Aug 2020 10:47:25 +0200 Subject: [PATCH] Refactor YANG statement parser structure Current definition leads to leading whitespace being considered a part of the statement. This leads to misleading line/character being reported as the start of the statement. Fix this by introducing a top-level 'file', which encapsulates at least one statement with its leading/trailing whitespace. The other parts then come together naturally. JIRA: YANGTOOLS-1129 Change-Id: I9f725b09eae6f8acf4397c97c60f99caaade798b Signed-off-by: Robert Varga --- .../yangtools/yang/parser/antlr/YangStatementParser.g4 | 5 ++++- .../yang/parser/rfc7950/repo/YangStatementStreamSource.java | 6 ++++-- 2 files changed, 8 insertions(+), 3 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 9f836e2e32..dadf258875 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 @@ -11,7 +11,10 @@ options { tokenVocab = YangStatementLexer; } -statement : SEP* keyword SEP* (argument)? SEP* (SEMICOLON | LEFT_BRACE SEP* (statement)* SEP* RIGHT_BRACE SEP*) SEP*; +// NOTE: we need to use SEP*/SEP+ because comments end up breaking whitespace +// 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; argument : STRING (SEP* PLUS SEP* STRING)* | IDENTIFIER; 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 7d26fa946c..9f1f6dd08b 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 @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.repo; import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; @@ -31,6 +32,7 @@ import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; 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.StatementContext; import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule; import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition; @@ -171,7 +173,7 @@ public final class YangStatementStreamSource extends AbstractIdentifiable