Special-case identifier lexer token 09/92209/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 20 Aug 2020 14:48:41 +0000 (16:48 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 20 Aug 2020 18:36:08 +0000 (20:36 +0200)
An unquoted string can be an IDENTIFIER, which is the most common
case anyway. This token does not have to be further validated and
thus it makes sense to special-case it. This has the neat effect
of reducing the depth of our parse tree, too -- bringing memory
usage down by 6.6% versus the original fix.

JIRA: YANGTOOLS-1089
Change-Id: I63701719e90334558048201d70d8264ab9299efb
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 0ec7fd50a8d7768f55d03e2ad1c6156fb6836c67)

yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementParser.g4
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/ArgumentContextUtils.java

index cbfeee38c7b5211477ff370d074508732fb5f841..eec9c62d653697d2a44d7bc31a7a443aa43baacb 100644 (file)
@@ -21,8 +21,9 @@ keyword : IDENTIFIER (COLON IDENTIFIER)?;
 // the flaky definitions of RFC6020, which allow for insane quoting as well as
 // exclusion of comments. We also need to allow for stitching back tokens like
 // PLUS/COLON, which may end up being valid identifiers. Finally we need to allow
-// IDENTIFIER to be concatenated back to a string
-argument : unquotedString | quotedString (SEP* PLUS SEP* quotedString)*;
+// IDENTIFIER to be concatenated back to a string -- but it is common enough
+// so we want to specialize it.
+argument : IDENTIFIER | unquotedString | quotedString (SEP* PLUS SEP* quotedString)*;
 
 quotedString :
     DQUOT_START DQUOT_STRING? DQUOT_END
index 2a37de6d5de53763a1f5c846884ba062f911e426..2f35f13f66a0774bf75e5175e4cb4aaf6c770cb3 100644 (file)
@@ -114,6 +114,12 @@ abstract class ArgumentContextUtils {
     final @NonNull String stringFromStringContext(final ArgumentContext context, final StatementSourceReference ref) {
         // Get first child, which we fully expect to exist and be a lexer token
         final ParseTree firstChild = context.getChild(0);
+        if (firstChild instanceof TerminalNode) {
+            // Simplest of cases -- it is a simple IDENTIFIER, hence we do not need to validate anything else and can
+            // just grab the string and run with it.
+            return firstChild.getText();
+        }
+
         if (firstChild instanceof UnquotedStringContext) {
             // Simple case, just grab the text, as ANTLR has done all the heavy lifting
             final String str = firstChild.getText();