我有一个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>