From 920595e594e70c8eb6414e5fc41e5a7f5751f36b Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 23 Aug 2020 22:53:39 +0200 Subject: [PATCH] Eliminate DQUOT_START/SQUOT_START tokens Quoted strings are naturally terminated by end marker, potentially preceded by DQUOT_STRING/SQUOT_STRING. This renders the corresponding start tokens really just a academic completeness, costing us memory while not bringing anything to the table. Skip generation of these tokens, reducing memory usage by up to 4.5%. JIRA: YANGTOOLS-1089 Change-Id: I0b7ce9bf292b0dd8475d63869ddfd8d2b86a387c Signed-off-by: Robert Varga --- .../yang/parser/antlr/YangStatementLexer.g4 | 4 +- .../yang/parser/antlr/YangStatementParser.g4 | 4 +- .../yang/parser/rfc7950/ir/AntlrSupport.java | 42 ++++++++++--------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementLexer.g4 b/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementLexer.g4 index fa44dd7d0e..58f7807e79 100644 --- a/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementLexer.g4 +++ b/yang/yang-parser-antlr/src/main/antlr4/org/opendaylight/yangtools/yang/parser/antlr/YangStatementLexer.g4 @@ -86,8 +86,8 @@ UQUOT_STRING : -> type(UQUOT_STRING); // Double/single-quoted strings. We deal with these using specialized modes. -DQUOT_START : '"' -> pushMode(DQUOT_STRING_MODE); -SQUOT_START : '\'' -> pushMode(SQUOT_STRING_MODE); +DQUOT_START : '"' -> pushMode(DQUOT_STRING_MODE), skip; +SQUOT_START : '\'' -> pushMode(SQUOT_STRING_MODE), skip; // // Double-quoted string lexing mode. We do not need to recognize all possible 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 8becc97173..69148f618c 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 @@ -34,8 +34,8 @@ argument : // here to eliminate the need for another parser construct. Quoted strings // account for about 50% of all arguments encountered -- hence the added // parse tree indirection is very visible. - (DQUOT_START DQUOT_STRING? DQUOT_END | SQUOT_START SQUOT_STRING? SQUOT_END) - (SEP* PLUS SEP* (DQUOT_START DQUOT_STRING? DQUOT_END | SQUOT_START SQUOT_STRING? SQUOT_END))* + (DQUOT_STRING? DQUOT_END | SQUOT_STRING? SQUOT_END) + (SEP* PLUS SEP* (DQUOT_STRING? DQUOT_END | SQUOT_STRING? SQUOT_END))* | unquotedString ; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/AntlrSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/AntlrSupport.java index 9d615b08ca..b215c218a9 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/AntlrSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/AntlrSupport.java @@ -124,9 +124,8 @@ public final class AntlrSupport { case 0: throw new VerifyException("Unexpected shape of " + argument); case 1: - return createUnquoted(argument); + return createSimple(argument); case 2: - case 3: return createQuoted(argument); default: return createConcatenation(argument); @@ -144,9 +143,6 @@ public final class AntlrSupport { // Separator, just skip it over case YangStatementParser.PLUS: // Operator, which we are handling by concat, skip it over - case YangStatementParser.DQUOT_START: - case YangStatementParser.SQUOT_START: - // Quote starts, skip them over as they are just markers case YangStatementParser.DQUOT_END: case YangStatementParser.SQUOT_END: // Quote stops, skip them over because we either already added the content, or would be appending @@ -180,15 +176,10 @@ public final class AntlrSupport { } private Single createQuoted(final ArgumentContext argument) { - final ParseTree literal = argument.getChild(1); - verify(literal instanceof TerminalNode, "Unexpected literal %s", literal); - final Token token = ((TerminalNode) literal).getSymbol(); + final ParseTree child = argument.getChild(0); + verify(child instanceof TerminalNode, "Unexpected literal %s", child); + final Token token = ((TerminalNode) child).getSymbol(); switch (token.getType()) { - case YangStatementParser.DQUOT_END: - case YangStatementParser.SQUOT_END: - // This is an empty string, the difference between double and single quotes does not exist. Single - // quotes have more stringent semantics, hence use those. - return SingleQuoted.EMPTY; case YangStatementParser.DQUOT_STRING: return createDoubleQuoted(token); case YangStatementParser.SQUOT_STRING: @@ -210,15 +201,22 @@ public final class AntlrSupport { return dquotArguments.computeIfAbsent(str, DoubleQuoted::new); } - private SingleQuoted createSingleQuoted(final Token token) { - return squotArguments.computeIfAbsent(strOf(token), SingleQuoted::new); - } - - private Single createUnquoted(final ArgumentContext argument) { + private IRArgument createSimple(final ArgumentContext argument) { final ParseTree child = argument.getChild(0); if (child instanceof TerminalNode) { - // This is as simple as it gets: we are dealing with an identifier here. - return idenArguments.computeIfAbsent(strOf(((TerminalNode) child).getSymbol()), Identifier::new); + final Token token = ((TerminalNode) child).getSymbol(); + switch (token.getType()) { + case YangStatementParser.IDENTIFIER: + // This is as simple as it gets: we are dealing with an identifier here. + return idenArguments.computeIfAbsent(strOf(token), Identifier::new); + case YangStatementParser.DQUOT_END: + case YangStatementParser.SQUOT_END: + // This is an empty string, the difference between double and single quotes does not exist. Single + // quotes have more stringent semantics, hence use those. + return SingleQuoted.EMPTY; + default: + throw new VerifyException("Unexpected token " + token); + } } verify(child instanceof UnquotedStringContext, "Unexpected shape of %s", argument); @@ -227,6 +225,10 @@ public final class AntlrSupport { return uquotArguments.computeIfAbsent(strOf(child), Unquoted::new); } + private SingleQuoted createSingleQuoted(final Token token) { + return squotArguments.computeIfAbsent(strOf(token), SingleQuoted::new); + } + private ImmutableList createStatements(final StatementContext stmt) { final List statements = stmt.statement(); return statements.isEmpty() ? ImmutableList.of() -- 2.36.6