Cha*_*l72 5 grammar parsing json bnf ebnf
最近我一直在研究解析器和语法以及它们是如何工作的.我正在阅读http://www.ietf.org/rfc/rfc4627.txt使用EBNF的JSON的正式语法.我对BNF和EBNF的理解非常有信心,但显然我还是不完全理解它.RFC定义了一个JSON对象,如下所示:
object = begin-object [ member *( value-separator member ) ]
end-object
Run Code Online (Sandbox Code Playgroud)
我理解这里的意图是表达任何JSON对象可以(可选)拥有一个成员,然后是0或更多(值分隔符,成员)对.我不明白的是,为什么会出现星号之前的(value-separator member).不应该模仿正则表达式的星号,这样看来以后要重复0次以上的项目?不应该像这样编写JSON对象语法:
object = begin-object [ member ( value-separator member )* ]
end-object
Run Code Online (Sandbox Code Playgroud)
hoo*_*oke 14
在上述文件中,http://www.ietf.org/rfc/rfc4627.txt表示
本文档中的语法规则将按[RFC4234]中的描述进行解释.
RFC4234描述了ABNF(增强型BNF),而不是EBNF.如果您仔细阅读本文档,您将找到以下定义:
3.6. Variable Repetition: *Rule
The operator "*" preceding an element indicates repetition. The full
form is:
<a>*<b>element
where <a> and <b> are optional decimal values, indicating at least
<a> and at most <b> occurrences of the element.
Default values are 0 and infinity so that *<element> allows any
number, including zero; 1*<element> requires at least one;
3*3<element> allows exactly 3 and 1*2<element> allows one or two.
Run Code Online (Sandbox Code Playgroud)
所以,符号
*( value-separator member )
Run Code Online (Sandbox Code Playgroud)
根据ABNF定义是正确的,并允许任意数量的重复,包括零.
语法是关于某人选择写下具体实体来表示某事的方式.
我同意在实体重复之前推出 Kleene明星是非标准的,作者选择这样做只会混淆习惯惯例的人.但它完全有效; 作者可以定义语法的含义,而您,标准的用户,只需接受它即可.
将Kleene星放在他所做的地方有一些争论; 它表示在您可能期望列表的位置存在列表.后缀式Kleene明星表示相同,但它有点令人惊讶; 首先你读取列表元素(从左到右),然后你发现了星星.
实际上,后Kleene-star的突然因素通常不足以超过违反惯例的意外因素.但该标准的作者做出了选择.
欢迎使用语法.