单引号文字值失败 Antlr 词法分析器

Single quoted literal value fails Antlr lexer

我有一个词法分析器规则将单引号文字字符串定义为

L_S_STRING  : '\'' (('\'' '\'') | ('\' '\'') | ~('\''))* '\''

它在一种特殊情况下失败了:

'yyyy-MM-dd\'T\'HH:mm:ss\'Z\''

问题确实出在最后两个单引号上。如果我在两者之间添加一个 space ,它就起作用了。或者我可以使用两个单引号来结束并且它也有效,例如

'yyyy-MM-dd\'T\'HH:mm:ss\'Z'''

我不确定这是否与非贪婪运算符导致 ('\'' '\'') 的首次匹配有关?如果是这样,我不明白最后一个版本是如何工作的。

无论如何,有人可以帮忙吗?

更新 - 我无法在完整语法之外重现它。这可能是一条红鲱鱼。

更新 - 我错过了一些重要的上下文,所以我在这里发布了另一个问题

我无法重现。给定以下语法:

lexer grammar Test;

L_S_STRING  : '\'' (('\'' '\'') | ('\' '\'') | ~('\''))* '\'';
OTHER       : . ;

可按如下方式进行测试:

String source = "A'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\''B";

Test lexer = new Test(CharStreams.fromString(source));
CommonTokenStream tokens = new CommonTokenStream(lexer);
tokens.fill();

for (Token t : tokens.getTokens()) {
    System.out.printf("%-15s %s\n", Test.VOCABULARY.getSymbolicName(t.getType()), t.getText());
}

将打印:

OTHER           A
L_S_STRING      'yyyy-MM-dd\'T\'HH:mm:ss\'Z\''
OTHER           B
EOF             <EOF>