我有一个词法分析器规则,将单引号文字字符串定义为
L_S_STRING : '\'' (('\'' '\'') | ('\\' '\'') | ~('\''))* '\''
在一种特殊情况下失败:
'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z\\''
问题确实出在最后两个单引号上。如果我在两者之间添加了一个空格,它会起作用。或者,我可以使用两个单引号将它括起来,例如,
'yyyy-MM-dd\\'T\\'HH:mm:ss\\'Z'''
我不确定是否与导致('\'''\'')首个匹配的非贪心运算符有关?如果是这样,我看不到最新版本的效果。
无论如何,有人可以帮忙吗?
更新-我无法在完整的语法之外复制它。这可能是一条红鲱鱼。
更新-我错过了一些重要的背景信息,所以我在这里Antlr4: single quote rule fails when there are escape chars plus carriage return, new line
发表了另一个问题答案 0 :(得分:0)
我无法复制。给出以下语法:
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>