1

目前我正在研究来自 ANTLR 项目 wiki 的 JSON ANTLR 语法:http ://www.antlr.org/wiki/display/ANTLR3/JSON+Interpreter

String  :
    '"' ( EscapeSequence | ~('\u0000'..'\u001f' | '\\' | '\"' ) )* '"'
    ;

fragment EscapeSequence
        :   '\\' (UnicodeEscape |'b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
        ;

我无法得到的是他们为什么在规则中否定\\和否定?无论如何,它将被匹配。\"StringEscapeSequence

如果我们将其更改为~('\u0000'..'\u001f')then 它应该意味着相同。

我错过了什么?

4

1 回答 1

2

这用于禁止单个未转义的反斜杠和单个未转义的双引号。请注意,这些显示为'\\'and '\"',因为至少前者在语法文字中也是不允许的。

相比之下,EscapeSequence 规则允许转义反斜杠和双引号。

省略单个非转义双引号的排除会将字符串标记化扩展到可以找到的最后一个引号,但是它应该在第一个非转义引号处终止。

省略单个未转义反斜杠的排除将允许以反斜杠开头的序列,这是不支持的 EscapeSequences。

于 2013-05-10T10:05:46.120 回答