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"不是单个标记.