2010-11-07 34 views
4

最近我一直在研究解析器和語法以及它們是如何工作的。我正在閱讀使用EBNF的http://www.ietf.org/rfc/rfc4627.txt的JSON形式語法。我對自己對BNF和EBNF的理解非常有信心,但顯然我還沒有完全理解它。該RFC定義了一個JSON對象是這樣的:關於EBNF表示法和JSON的問題

object = begin-object [ member *(value-separator member) ] 
    end-object 

我明白的是,這裏的意圖是要表達的任何JSON對象可以(可選地)具有的部件,然後可以後跟0或更多(值的隔膜,成員)對。我不明白的是爲什麼星號出現之前(value-separator member)。是不是星號應該模仿正則表達式,所以它出現項目要重複0次或更多次?不應將JSON對象語法寫成如下形式:

object = begin-object [ member (value-separator member)* ] 
    end-object 

回答

8

語法是關於某人選擇寫下具體實體來表示某些事物的方式。

我會同意puttting Kleene星之前的實體重複是非標準的,作者選擇 這樣做只是混淆了用於約定的人。但它是完全有效的;作者 得到了定義什麼語法的意思,而你,標準的用戶,就是接受它。

把Kleene明星放在他所在的地方有一些爭論:它表示在您可能需要列表的位置處出現以下列表 。後綴式Kleene星號表示 相同,但這有點令人驚訝;首先你閱讀列表元素(從左到右), 然後你發現這顆星星。

實際上,後Kleene明星的驚喜因素通常不足以超過違反慣例的意外因素。但該標準的作者做出了他們的選擇。

歡迎使用語法。

1

關於標準的好處是,有這麼多的選擇。

顯然,尼克拉斯·沃斯在想同樣的事情you thirty-some years ago

編程語言 的人口穩步增長,並 沒有這種增長在 視線的盡頭。許多語言定義 出現在期刊中,許多語言定義在 技術報告中找到,並且更多的數字仍然限於 專有圓圈。在經常使用這些定義 之後,一個 不能不注意到缺少「公分母」。唯一廣泛接受的事實是語言 結構由語法定義。但 甚至符號語法 描述沒有涵蓋任何共同商定的 標準形式,儘管基本的 祖先始終是Algol 60報告的Backus-Naur 表格。由於 變化往往只是輕微的,他們 成爲他們非常討厭他們很缺乏的一個明顯的動機。

是的,在RFC-4627中使用的符號不太常見,但不是難以理解的。

11

在提到的文獻,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. 

因此,符號

*(value-separator member) 

是正確的根據ABNF定義,並允許任意數量的重複,包括零。