单引号文字值使Antlr lexer失败



我有一个lexer规则,它将单引号文本字符串定义为

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

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

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

问题实际上在于最后两个单引号。如果我在两者之间加一个空格,它就会起作用。或者我可以用两个单引号结束,它也起作用,例如

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

我不确定这是否与导致("\"\"(的第一个匹配的非贪婪运算符有关?如果是这样的话,我看不出上一个版本是如何工作的。

无论如何,有人能帮忙吗?

更新-我无法在完整语法之外复制它。这可能是转移注意力。

更新-我错过了一些重要的上下文,所以我在这里发布了另一个问题Antlr4:当有转义字符加回车时,单引号规则失败,新行

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

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 %sn", Test.VOCABULARY.getSymbolicName(t.getType()), t.getText());
}

将打印:

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

最新更新