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)
// 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
// 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
quotedString :
DQUOT_START DQUOT_STRING? DQUOT_END
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);
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();
if (firstChild instanceof UnquotedStringContext) {
// Simple case, just grab the text, as ANTLR has done all the heavy lifting
final String str = firstChild.getText();