6

最近、私はパーサーと文法、そしてそれらがどのように機能するかを研究しています。http://www.ietf.org/rfc/rfc4627.txtEBNFを使用するJSONの形式文法を読んでいました。私はBNFとEBNFの理解にかなり自信を持っていましたが、どうやらまだ完全には理解していません。RFCは、次のような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
4

3 に答える 3

15

言及された文書http://www.ietf.org/rfc/rfc4627.txtには、次のように記載されています。

このドキュメントの文法規則は、[RFC4234]で説明されているように解釈されます。

RFC4234は、EBNFではなくABNF(拡張BNF)について説明しています。このドキュメントを見ると、次の定義が見つかります。

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の定義によれば正しく、ゼロを含む任意の数の繰り返しを許可します。

于 2013-04-12T07:34:27.753 に答える
9

構文は、誰かが何かを表すために具体的なエンティティを書き留めることを選択する方法に関するものです。

エンティティの前にクリーネ閉包を繰り返すことは非標準であり、それを行うことを著者が選択したことは、慣習に慣れている人々を混乱させるだけであることに同意します。しかし、それは完全に有効です。著者は構文の意味を定義することができ、標準のユーザーであるあなたはそれを受け入れることができます。

クリーネ閉包を彼が行った場所に置くことにはいくつかの議論があります。それはあなたがリストを期待するかもしれないポイントに続くリストがあることを示します。接尾辞スタイルのクリーネ閉包は同じことを示していますが、それは一種の驚きです。最初にリスト要素を(左から右に)読んでから、星を見つけます。

実際問題として、クリーネ閉包後の驚きの要因は、一般に、慣習に違反するという驚きの要因を上回るのに十分ではありません。しかし、その規格の作成者は彼らの選択をしました。

構文へようこそ。

于 2010-11-07T15:57:22.183 に答える
1

標準の良いところは、選択できるものが非常に多いことです。

どうやら、ニクラウスヴィルトは、30数年前にあなたと同じことを考えていたようです:

プログラミング言語の人口は着実に増加しており、この成長に終わりはありません。多くの言語定義がジャーナルに掲載されており、その多くはテクニカルレポートに掲載されており、おそらくさらに多くの言語が専有サークルに限定されたままです。これらの定義に頻繁に触れた後、「共通の分母」の欠如に気付くのを忘れることはできません。広く受け入れられている唯一の事実は、言語構造が構文によって定義されているということです。しかし、構文の説明の表記でさえ、一般的に合意された標準形を避けていますが、基礎となる祖先は常にAlgol60レポートのバッカスナウア形です。多くの場合、変動はごくわずかであるため、明らかな動機が非常に不足しているために煩わしくなります。

はい、RFC-4627で使用される表記法はあまり一般的ではありませんが、理解できないものではありません。

于 2010-11-07T15:58:08.567 に答える