2013-05-10 64 views
1

需要在我调查从ANTLR项目wiki的JSON ANTLR语法此刻的ANTLR语法的解释:http://www.antlr.org/wiki/display/ANTLR3/JSON+Interpreter对JSON语法

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

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

我能不明白的是为什么他们在否定\\\"String规则?无论如何,它将匹配EscapeSequence

如果我们将其更改为~('\u0000'..'\u001f')那么它应该是相同的。

我错过了什么?

回答

2

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

对比中的EscapeSequence规则允许使用反斜杠和双引号。

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

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

+0

哦,我看到'EscapeSequence'允许'\\\',而'String'不允许''''。对? – zerkms 2013-05-10 10:07:29

+0

我想你明白了,尽管你的评论格式出错了。 – Gunther 2013-05-10 10:18:00

+0

噢:-S这是因为这个反斜杠才是逃避反射。好,谢谢 – zerkms 2013-05-10 10:23:47