【问题标题】:An explanation of an ANTLR syntax required for JSON grammarJSON语法所需的ANTLR语法解释
【发布时间】:2013-05-10 05:19:49
【问题描述】:

目前我正在研究来自 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'),那么它的意思应该是一样的。

我错过了什么?

【问题讨论】:

    标签: parsing antlr grammar lexical-analysis


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 哦,我知道EscapeSequence 允许\\\`, while String` 不允许`\`。对吗?
    • 我想你明白了,虽然你的评论格式有问题。
    • 哦 :-S 这是因为这样的反斜杠是转义反引号。好的,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多