Antlr4 区分文字\n与嵌入换行符

Antlr4 区分文字\n与嵌入换行符,antlr4,Antlr4,我正在用antlr编写的模型验证Rust解析器的手写内容。我遇到了antlr转义字符串的问题: [15:48:50]~/src/rust2/src/grammar> grun RustLexer tokens -tokens "\n" [@0,0:3='"\n"',<46>,1:0] [15:48:50]~/src/ru

我正在用antlr编写的模型验证Rust解析器的手写内容。我遇到了antlr转义字符串的问题:

[15:48:50]~/src/rust2/src/grammar> grun RustLexer tokens -tokens                                                                               
"\n"
[@0,0:3='"\n"',<46>,1:0]
[15:48:50]~/src/rust2/src/grammar>grun-RustLexer令牌-令牌
“\n”
[@0,0:3='“\n',,1:0]

[15:51:15]~/src/rust2/src/grammar>grun-RustLexer令牌-令牌
"
"
[@0,0:2='“\n',,1:0]

创建相同的字符串内容。antlr在这里还有其他行为方式吗?特别是,如果它将literal
\
转义为
\\
,我就可以在我的工具中折叠它们。目前,我正在丢失有关输入的信息。

grun
可能正在将
“\n”
扩展为换行符,因为lexer肯定不会这样做(幸运的是)

给定语法
测试

语法测试;
作语法分析
: .*? EOF
;
断线
:“\n”
;
其他
: .
;
解析
“\n\\n”

TestLexer lexer=新的TestLexer(新的antlInputStream(“\n\\n”);
for(令牌:lexer.getAllTokens()){
System.out.printf(“%s->%n”,TestLexer.ruleNames[token.getType()-1],token.getText());
}
将打印以下内容:

换行符-><
>
其他->
其他->

B.t.w.,我想你已经意识到了?

我想这只是调试打印的一个问题,其中可能没有转义“\”。在代码背后,例如Java或C#,它应该很好。您尝试过这个吗?正如您所看到的,第一种情况(0:3)的范围比(0:2)长,因此它实际上应该只是一个调试打印问题。但无论如何,你可以在github上提出一个问题。我不知道该尝试什么,我只使用了grun工具。如果我可以手动以不同的方式打印,也可以。我不认为您可以修复grun输出,但在Java或C#项目中使用antlr解析器的“真实”应用程序中不应该出现问题。如果您计划只使用grun,您将不得不在github上提出一个问题并等待修复。至于生锈的antlr,是的,我正在努力更新它,但我需要单独验证lexer,以便稍后正确处理宏扩展。简而言之,这很复杂:)。不,我的shell没有将“\n”扩展为换行符,这里甚至没有涉及shell,这只是对grun的stdin。我将更详细地了解运行时API,以及如何使用它来获得所需的内容,感谢您提供的代码片段!
[15:51:15]~/src/rust2/src/grammar> grun RustLexer tokens -tokens
"
"
[@0,0:2='"\n"',<46>,1:0]