From dc3c6c7929ac24bd6a4a34b91320086199f89672 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 (cherry picked from commit b462288cc6e678b9350551c64ecda96196ebe8b4) --- .../yangtools/antlrv4/code/gen/YangStatementParser.g4 | 5 ++++- .../yang/parser/rfc7950/repo/YangStatementStreamSource.java | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/yang/yang-parser-rfc7950/src/main/antlr/org/opendaylight/yangtools/antlrv4/code/gen/YangStatementParser.g4 b/yang/yang-parser-rfc7950/src/main/antlr/org/opendaylight/yangtools/antlrv4/code/gen/YangStatementParser.g4 index 9f836e2e32..dadf258875 100644 --- a/yang/yang-parser-rfc7950/src/main/antlr/org/opendaylight/yangtools/antlrv4/code/gen/YangStatementParser.g4 +++ b/yang/yang-parser-rfc7950/src/main/antlr/org/opendaylight/yangtools/antlrv4/code/gen/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 354e8d93af..e46db1ff8c 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; @@ -23,6 +24,7 @@ import org.antlr.v4.runtime.tree.ParseTreeWalker; import org.antlr.v4.runtime.tree.TerminalNode; import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementLexer; import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser; +import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.FileContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.StatementContext; import org.opendaylight.yangtools.concepts.AbstractIdentifiable; import org.opendaylight.yangtools.yang.common.QName; @@ -166,7 +168,7 @@ public final class YangStatementStreamSource extends AbstractIdentifiable