Antlr:清理lexer中的字符串标记?

Antlr:清理lexer中的字符串标记?,antlr,antlr4,Antlr,Antlr4,我正在编写一个组合语法,它具有权威指南中定义的标准字符串标记 STRING: '"' (ESC|.)*? '"' ; fragment ESC : '\\"' | '\\\\' ; // 2-char sequences \" and \\ 我注意到的一件事是字符串标记的.Text属性始终是输入中看到的带引号的转义形式,如下所示 // from grammar like rule: title:STRING; var title = context.title.Text; // == \"my

我正在编写一个组合语法,它具有权威指南中定义的标准字符串标记

STRING: '"' (ESC|.)*? '"' ;
fragment
ESC : '\\"' | '\\\\' ; // 2-char sequences \" and \\
我注意到的一件事是字符串标记的
.Text
属性始终是输入中看到的带引号的转义形式,如下所示

// from grammar like rule: title:STRING;
var title = context.title.Text; // == \"my string\"
这意味着我必须在解析器中“更正”字符串,去掉引号并处理转义字符,无论我在哪里引用字符串标记。这感觉就像是在解析器中完成的词法分析工作

我想知道是否有办法改变lexer的输出,以便lexer令牌可以显示已清理的内容?我注意到在生成的lexer上有很多可能的覆盖,但是我注意到
IToken.Text
是只读的,所以我看不出如何修改它

其他有用的地方包括:

  • 双引号字符串,如
    “foo”
  • 单引号字符串,如
    “sql字符串”
  • 变量引用,如
    $foo
    ,其中感兴趣的文本是
    foo

您还可以检查令牌是否实现了
WritableToken
,并设置值

请参阅java文档

或者C#源

机具
(I)WritableToken

请参阅