如何使用ANTLR 4转义转义字符?

jam*_*iss 12 quotes antlr escaping antlr4

许多语言都使用某种引号绑定了一个字符串,如下所示:

"Rob Malda is smart."

ANTLR 4可以将这样的字符串与词法分析器规则匹配,如下所示:

QuotedString : '"' .*? '"';

要使用字符串中的某些字符,必须对它们进行转义,可能是这样的:

"Rob \"Commander Taco\" Malda is smart."

ANTLR 4也可以匹配这个字符串;

EscapedString : '"' ('\\"|.)*? '"';

(取自最终ANTLR 4参考文献的第96页)

这是我的问题:假设转义的字符与字符串分隔符是相同的字符.例如:

"Rob ""Commander Taco"" Malda is smart."

(这在Powershell中完全合法.)

lexer规则会匹配什么?我认为这会奏效:

EscapedString : '"' ('""'|.)*? '"';

但事实并非如此.词法分析器将转义字符标记"为字符串分隔符的结尾.

Bar*_*ers 13

使用~运算符否定某些字符:

EscapedString : '"' ( '""' | ~["] )* '"';
Run Code Online (Sandbox Code Playgroud)

或者,如果字符串中没有换行符,请执行以下操作:

EscapedString : '"' ( '""' | ~["\r\n] )* '"';
Run Code Online (Sandbox Code Playgroud)

您不希望使用非贪婪的运算符,否则""将永远不会被使用"a""b"并将其标记为"a""b"不是单个标记.