单引号文字值失败 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>
我有一个词法分析器规则将单引号文字字符串定义为
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>