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

时间:2014-07-14 22:55:07

标签: antlr4

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

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

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

创建相同的字符串内容。有没有办法让antlr在这里以任何其他方式行事?特别是,如果它从文字\转义为\\,我可以接受,然后我可以在我的工具中删除它们。目前,我正在丢失有关输入的信息。

1 个答案:

答案 0 :(得分:1)

grun可能正在将"\n"扩展到换行符,因为词法分析器肯定不会这样做(幸运的是)。

鉴于语法Test

grammar Test;

parse
 : .*? EOF
 ;

LINE_BREAK
 : '\n'
 ;

OTHER
 : .
 ;

解析"\n\\n"

TestLexer lexer = new TestLexer(new ANTLRInputStream("\n\\n"));

for (Token token : lexer.getAllTokens()) {
  System.out.printf("%s -> <%s>%n", TestLexer.ruleNames[token.getType() - 1], token.getText());
}

将打印以下内容:

LINE_BREAK -> <
>
OTHER -> <\>
OTHER -> <n>

B.t.w。,我认为你知道this repository