目前我正在调查来自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'|'\"'|'\''|'\\')
;
我无法得到的是他们在\\
规则中否定\"
和String
的原因?无论如何,它将与EscapeSequence
匹配。
如果我们将其更改为~('\u0000'..'\u001f')
,那么它应该是相同的。
我错过了什么?
答案 0 :(得分:2)
这用于禁止单个未转义的反斜杠和单个未转义的双引号。请注意,它们显示为'\\'
和'\"'
,因为至少前者在语法文字中也是不允许的。
相反,EscapeSequence规则允许转义反斜杠和双引号。
省略单个未转义的双引号会将String标记化扩展到可以找到的最后一个引号,但它应该在第一个未转义的引号处终止。
省略排除单个未转义的反斜杠将允许以反斜杠开头的序列,不支持EscapeSequences。