单引号文字值使Antlr lexer失败

时间:2018-11-22 08:06:48

标签: antlr antlr4

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

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

发表了另一个问题

1 个答案:

答案 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>