バッカス・ナウア記


Backus%E2%80%93Naur_form

Boyce–Coddの正規形
と混同しないでください でコンピュータサイエンス、バッカス正規形(/ ˌ B æ K ə S N aʊər / )またはバッカス正規形(BNFは)であるメタ構文のための記法文脈自由文法しばしば記述するために使用される、シンタックスの言語、計算に使用しますコンピュータプログラミング言語、ドキュメント形式、命令セット、通信プロトコルなど。これらは、言語の正確な説明が必要な場合は常に適用されます。たとえば、公用語の仕様、マニュアル、プログラミング言語理論の教科書などです。
元のバッカス・ナウア記法の多くの拡張機能と変形が使用されています。拡張バッカスナウア記法(EBNF)や拡張バッカスナウア記法(ABNF)など、正確に定義されているものも

コンテンツ
1 歴史
2 序章
3 例
4 さらなる例
5 バリアント
5.1 BNFを使用したソフトウェア
6 も参照してください
7 参考文献
8 外部リンク
8.1 言語文法

歴史
書き換え規則を使用して言語の構造を記述するという考えは、少なくとも、古代インドのサンスクリット語の文法学者であり、紀元前6世紀から4世紀の間に住んでいたヒンドゥー教の尊敬される学者であるパーニニの業績にまでさかのぼることができます。 サンスクリット語の構造を説明する彼の表記法は、Backusの表記法と同等の力であり、多くの同様の特性を持っています。
西洋社会では、文法は科学的研究ではなく、教育の主題と長い間見なされていました。説明は非公式であり、実際の使用を対象としています。20世紀の前半に、レナードブルームフィールドやゼリグハリスなどの言語学者は、句構造を含む言語の記述を形式化する試みを開始しました。
一方、正式な論理システムとしての文字列書き換えルールは、Axel Thue(1914年)、Emil Post(1920〜40年代)、Alan Turing(1936)などの数学者によって導入および研究されました。チョムスキーの学生に言語学を教え、情報理論でMITの構文の説明のための基礎として、本質的にThueの形式主義が何であるかを取ることによって、言語学と数学を組み合わせ、自然言語。彼はまた、生成規則(文脈自由文法の規則)と変換規則(1956)の明確な区別を紹介しました。
ジョン・バッカス、のプログラミング言語設計IBMは、提案されたメタ言語「メタ言語式」の として今日知られている新しいプログラミング言語IALの構文記述するためにALGOL 58(1959)。彼の記譜法は、ALGOL60レポートで最初に使用されました。
BNFは、チョムスキーの文脈自由文法の表記法です。バックスはチョムスキーの仕事に精通していた。
Backusによって提案されたように、式は名前が山括弧で囲まれた「クラス」を定義しました。たとえば、。これらの名前はそれぞれ、基本的な記号のクラスを示します。
ALGOLのさらなる開発により、ALGOL60が誕生しました。委員会の1963年の報告書で、ピーター・ナウアはバッカスの表記法をバッカスの通常の形式と呼んでいます。ドナルド・クヌースは、BNFは、たとえばチョムスキー標準形とは異なり、「従来の意味での通常形ではない」ため、バッカス・ナウア形として読むべきであると主張しました。PāṇiniBackus形式という名前は、拡張Backusの通常の形式が正確でない可能性があり、Pāṇiniが以前に同様の表記法を独自に開発したという事実を考慮して、かつて提案されました。
BNFは、ALGOL60レポートのPeterNaurによってメタ言語式として説明されています:
角かっこ<>で囲まれた文字のシーケンスは、値が記号のシーケンスであるメタ言語変数を表します。マーク “:: =”と “|” (後者は「または」の意味を持ちます)はメタ言語接続です。変数でも接続詞でもない数式内のマークは、それ自体を示します。数式内のマークまたは変数の並置は、示されたシーケンスの並置を意味します。
ALGOL 60レポートの別の例は、BNFメタ言語とチョムスキーの文脈自由文法の主な違いを示しています。メタ言語変数は、それらの形成を定義するルールを必要としません。それらの形成は、<>括弧内の自然言語で簡単に説明できます。次のALGOL60レポートセクション2.3コメント仕様は、これがどのように機能するかを例示しています。
プログラムのシンボルの中にテキストを含めるために、次の「コメント」規則が適用されます。
基本的な記号のシーケンス:
と同等です
; コメント<';'>;を含まないシーケンス ;
コメントの開始<';'>;を含まないシーケンス 始める
end <「end」または「;」を含まないシーケンス または 'else'> 終わり
ここでの同等性とは、左の列に示されている3つの構造のいずれかが、文字列の外側で発生した場合に、プログラムのアクションに影響を与えることなく、右の列の同じ行に示されている記号に置き換えることができることを意味します。
Naurは、Backusの2つのシンボルを一般的に利用可能なキャラクターに変更しました。::=シンボルは、もともと:≡。|シンボルはもともと言葉「であったか」(それ以上のバー付き)。 :14  IBMで働いていた場合、Backusは機密保持契約を結んでおり、IBM独自のプロジェクトからのものである場合は彼の情報源について話すことはできませんでした。
BNFは、論理回路設計で使用され、当時使用されていた標準形の ブール代数方程式と非常によく似ています。Backusは数学者であり、FORTRANプログラミング言語の設計者でした。ブール代数の研究は、一般的に数学のカリキュラムの一部です。私たちが知っていることは、BackusもNaurも、囲まれた名前を非終端記号として記述していないということです< >。チョムスキーの用語は、もともとBNFの説明には使用されていませんでした。Naurは、後でそれらをALGOLコース資料のクラスとして説明しました。 ALGOL 60レポートでは、それらはメタ言語変数と呼ばれていました。で囲まれたメタシンボル、、、およびクラス名以外は::=、定義されている言語のシンボルです。メタシンボルは「として定義されている」と解釈されます。別の定義を分離するために使用され、「または」として解釈されます。メタシンボルは、クラス名を囲む区切り文字です。BNFは、以下のように記述されているメタ言語ピーター・ナウアとによりALGOLの話のためのソール・ローゼン。|< >::=|< >
1947年、ソール・ローゼンは、最初はIALグループになり、最終的にALGOLにつながった言語委員会で、新しいコンピューティング機械協会の活動に参加しました。彼はACMのコミュニケーションの最初の編集長でした。私たちが知っていることは、BNFがALGOL60レポートでALGOL言語について話すためのメタ言語として最初に使用されたことです。これが、1962年にPeter Naurによって開発されたALGOLプログラミングコースの資料で説明されている方法です。 IBM、Honeywell、Burroughs、およびDigital Equipment Corporationによる初期のALGOLマニュアルは、ALGOL60レポートに従ってメタ言語として使用されていました。ソール・ローゼンは彼の著書で、BNFをALGOLについて話すためのメタ言語として説明しています。メタ言語としての使用例は、算術式の定義です。
< expr > :: = <用語> | < expr > < addop > < term >
代替の最初のシンボルは、定義されているクラスであり、Naurによって説明されているように、代替シーケンスが前の代替から再帰的に開始でき、何度でも繰り返すことができることを指定する機能を備えた繰り返しです。たとえば、上記は、その後に任意の数のが続くものとして定義され ます。
このようSchorreさんなど、いくつかの後にmetalanguagesでは、META II、BNF再帰的な繰り返し構造は、引用符で囲まれた文字列を使用して定義されたシーケンス演算子とターゲット言語の記号に置き換えられます。<そして>、ブラケットを除去しました。()数学的グループ化のための括弧が追加されました。ルールは、META IIなどに表示されます
EXPR = TERM $( ‘+’ TERM .OUT( ‘ADD’)| ‘-‘ TERM .OUT( ‘SUB’));
これらの変更により、META IIとその派生プログラミング言語は、自然言語記述、メタ言語変数、言語構成記述を使用する機能を犠牲にして、独自のメタ言語を定義および拡張できるようになりました。多くのスピンオフメタ言語はBNFに触発されました。 META II、TREE-META、およびMetacompilerを参照して
BNFクラスは、言語構造の形成を記述します。形成は、パターンまたはパターンを形成するアクションとして定義されます。クラス名exprは、自然言語で、その後にシーケンスが続くものとして記述されます 。クラスは抽象化です。その形成とは無関係にそれについて話すことができます。exprで加算または減算されるものとして、その定義とは関係なく、用語について話すことができます。特定のデータ型である用語と、データ型の特定の組み合わせを使用してexprを評価する方法について説明できます。または、式を並べ替えて、データ型と混合型の評価結果をグループ化することもできます。自然言語の補足は、コンパイラーの実装とALGOLプログラムを作成するプログラマーが使用する言語クラスのセマンティクスの特定の詳細を提供しました。自然言語の説明は、構文もさらに補足しました。整数規則は、構文を記述するために使用される自然言語とメタ言語の良い例です。
<整数> :: = <数字> | <整数> <数字>
上記の空白の詳細はありません。ルールに記載されている限り、数字の間にスペースを入れることができます。自然言語では、数字シーケンスに数字の間に空白を含めることはできないことを説明することで、BNFメタ言語を補完します。英語は可能な自然言語の1つにすぎません。ALGOLレポートの翻訳は、多くの自然言語で利用可能でした。
BNFの起源は、プログラミング言語開発への影響ほど重要ではありません。 ALGOL 60レポートの発行直後の期間、BNFは多くのコンパイラ-コンパイラシステムの基礎でした。
Edgar T.Ironsによって開発された「ALGOL60用の構文指向コンパイラ」やBrookerとMorrisによって開発された「コンパイラ構築システム」のように、BNFを直接使用したものもSchorre Metacompilersのような他のものは、ほんの少しの変更でそれをプログラミング言語にしました。シンボル識別子になり、囲んでいる<、>を削除し、ターゲット言語のシンボルに引用符で囲まれた文字列を使用しました。算術のようなグループ化は、グループ化が唯一の価値であるクラスの使用を削除する単純化を提供しました。META II算術式ルールは、グループ化の使用法を示しています。META IIルールに配置された出力式は、アセンブリ言語でコードとラベルを出力するために使用されます。META IIのルールは、BNFのクラス定義と同等です。Unixユーティリティyaccは、METAIIと同様のコード生成を備えたBNFに基づいています。yaccはパーサジェネレータとして最も一般的に使用されており、そのルーツは明らかにBNFです。
今日のBNFは、現在も使用されている最も古いコンピューター関連言語の1つです。

序章
BNF仕様は、次のように記述された一連の派生ルールです。
<記号> :: = __expression__
ここで、<シンボル> は非終端記号であり、__ expression__は1つ以上のシンボルシーケンスで構成されます。より多くのシーケンスは、選択を示す縦棒「|」で区切られ、全体が左側の記号の代わりになる可能性が左側に表示されない記号は端子です。一方、左側に表示される記号は、非端末と常に対<>との間に封入されています。
「:: =」は、左側の記号を右側の式に置き換える必要があることを意味します。


例として、米国の住所のこの可能性のあるBNFについて考えてみます。
<住所> :: = <名前部分> <番地> < zip部分>
< name-part > :: = < personal-part > < last-name > < opt-suffix-part > < EOL > | <個人の部分> <名前の部分> <パーソナルパート> :: = <イニシャル> “。” | <名> < street-address > :: = < house-num > < street-name > < opt-apt-num > < EOL >
< zip-part > :: = <町名> “、” <州コード> <郵便番号> < EOL >< opt-suffix-part > :: = “Sr。” | 「ジュニア」| <ローマ数字> | “” < opt-apt-num > :: = < apt-num > | 「」
これは次のように英語に翻訳されます:
住所は、名前の部分、番地の部分、郵便番号の部分で構成されます。
名前部分は、個人部分の後に姓とオプションのサフィックス(Jr.、Sr。、またはダイナスティック番号)と行末、または個人部分の後に名前部分(このルールは、BNFでの再帰の使用を示しており、複数のファーストネームとミドルネームおよびイニシャルを使用する人々のケースをカバーしています。
パーソナルパーツは、名またはイニシャルとそれに続くドットで構成されます。
番地は、家番号、番地、オプションのアパート指定子、行末で構成されます。
zipパーツは、町名、コンマ、州コード、ZIPコード、行末で構成されます。
opt-suffix-partは、「Sr。」、「Jr。」などのサフィックスで構成されます。またはローマ数字、または空の文字列(つまり何もない)。
opt-apt-numは、アパート番号または空の文字列(つまり何もない)で構成されます。
ここでは、多くの事項(名、アパート番号、郵便番号、ローマ数字の形式など)が指定されていないことに注意して追加のBNFルールを使用して説明できます。

さらなる例
BNF
  BNF シンタックスダイアグラム
BNFの構文自体は、次のようなBNFで表すことができます。
<構文>
:: = <ルール> | <ルール> <構文> <ルール>
:: = <オプトホワイトスペース> “”<"" <ルール名> “”>”” <オプトホワイトスペース> “” :: = “” <オプトホワイトスペース> <式> <行末> < opt-whitespace > :: = “””” < opt-whitespace > | “””” <式>
:: = <リスト> | <リスト> < opt-空白> “”|”” < opt-whitespace > < expression > < line-end >
:: = < opt-whitespace > < EOL > | <行末> <行末> <リスト>
:: = <用語> | <用語> < opt-空白> <リスト> <用語>
:: = <リテラル> | “”<"" <ルール名> “”>”” <リテラル>
:: = ‘””‘ < text1 > ‘””‘ | “”‘”” < text2 > “”‘”” < text1 >
:: = “””” | < character1 > < text1 > < text2 >
:: = ” | < character2 > < text2 > < character >
:: = <文字> | <数字> | <記号> <文字>
:: = “”A”” | 「B」| 「C」| 「D」| 「E」| 「F」| 「G」| 「H」| 「私」| 「J」| 「K」| 「L」| 「M」| 「N」| 「O」| 「P」| 「Q」| 「R」| 「S」| 「T」| 「U」| 「V」| 「W」| 「X」| 「Y」| 「Z」| 「a」| 「b」| 「c」| 「d」| 「e」| 「f」| 「g」| 「h」| 「私」| 「j」| 「k」| 「l」| 「m」| 「n」| 「o」| 「p」| 「q」| 「r」| 「s」| 「t」| 「u」| 「v」| 「w」| 「x」| 「y」| “”z”” <数字>
:: = “”0″” | 「1」| 「2」| 「3」| 「4」| 「5」| 「6」| 「7」| 「8」| “”9″” <記号>
:: = “”|”” | “””” | 「!」| 「#」| “”$”” | “”%”” | “”&”” | “”(”” | “”)”” | 「*」| 「+」| “”、”” | “”-“” | 「。」| “”/”” | “”:”” | “”;”” | “”>”” | “”=”” | “”<"" | 「?」| 「@」| ""["" | """" | ""]"" | ""^"" | ""_"" | ""` ""| ""{"" | ""}"" | ""〜"" <文字1 >
:: = <文字> | “”‘”” <文字2 >
:: = <文字> | ‘””‘ <ルール名>
:: = <文字> | <ルール名> <ルール文字> <ルール文字>
:: = <文字> | <数字> |””-“”
「」は空の文字列であることに注意して
元のBNFは、規則に示されているように引用符を使用していませんでした。これは、ルールを適切に解釈するために空白が必要ないことを前提としています。
適切なラインエンド指定子を表します(オペレーティングシステムに応じて、ASCII、キャリッジリターン、ラインフィード、またはその両方)。およびは、宣言されたルールの名前/ラベルまたはリテラルテキストにそれぞれ置き換えられます。
上記の米国の住所の例では、ブロック引用符全体が構文です。各行または行の途切れのないグループ化はルールです。たとえば、1つのルールは ::=。で始まります。そのルールの他の部分(行末を除く)は式であり、パイプで区切られた2つのリストで構成されます|。これらの2つのリストは、いくつかの用語(それぞれ、3つの用語と2つの用語)で構成されています。この特定のルールの各用語はルール名です。

バリアント
BNFには、一般的に単純さと簡潔さのために、または特定のアプリケーションに適合させるために、多くのバリアントと拡張機能が多くのバリアントに共通する機能の1つは、やなどの正規表現の繰り返し演算子を使用することです。拡張バッカスナウア記法(EBNF)は一般的なものです。*+
もう1つの一般的な拡張機能は、オプションのアイテムを角かっこで囲むことです。元のALGOL60レポートには存在しませんが(数年後にIBMのPL / I定義で導入されました)、この表記法は現在、広く認識されています。
拡張バッカスナウア記法(ABNF)およびルーティングバッカスナウア記法(RBNF)は、インターネット技術特別調査委員会(IETF)プロトコルを説明するために一般的に使用される拡張機能です。
構文解析式文法は、BNFと正規表現表記に基づいて構築され、形式文法の代替クラスを形成します。これは、生成的ではなく本質的に分析的です。
今日オンラインで見つかっている多くのBNF仕様は、人間が読める形式であることが意図されており、非公式です。これらには、多くの場合、次の構文規則と拡張機能の多くが含まれています。
角括弧で囲まれたオプションのアイテム:。
0回以上存在するアイテムは、中括弧で囲ま*れる ::= {}か、またはなどのアスタリスク()が接尾辞として付けられ ::= *ます。
1回以上存在するアイテムには+、などの追加(プラス)記号が接尾辞として付けられ ::= +ます。
終端記号はイタリックではなく太字で表示され、非終端記号は山括弧ではなくプレーンテキストで表示される場合が
アイテムがグループ化されている場合、それらは単純な括弧で囲まれています。

BNFを使用したソフトウェア
ANTLR、Javaで記述された別のパーサジェネレータ
BIツールであるQlikSenseは、スクリプト作成にBNFのバリアントを使用します
BNFコンバーター(BNFC )、「ラベル付きバッカスナウア記法」(LBNF)と呼ばれるバリアントで動作します。このバリアントでは、特定の非終端記号の各プロダクションにラベルが付けられます。このラベルは、その非終端記号を表す代数的データ型のコンストラクターとして使用できます。コンバーターは、HaskellやJavaを含むいくつかの言語で抽象構文の型とパーサーを生成することができます。
Coco / R、EBNFの属性文法を受け入れるコンパイラジェネレータ
DMS Software Reengineering Toolkit、任意の言語のプログラム分析および変換システム
ゴールドBNFパーサー
GNU bison、yaccのGNUバージョン
RPABNFパーサー。オンライン(PHP)デモ解析:JavaScript、XML
XACT X4MRシステム、プログラミング言語翻訳のためのルールベースのエキスパートシステム
XPLアナライザー。言語の簡略化されたBNFを受け入れ、XPLでその言語のパーサーを生成するツール。提供されているSKELETONプログラムに統合して、言語をデバッグすることができます(SHARE提供のプログラムで、その前にコンパイラジェネレータがあります)。
Yacc、パーサージェネレーター(Lexプリプロセッサーで最も一般的に使用されます)
bnfparser 2、ユニバーサル構文検証ユーティリティ
bnf2xml、高度なBNFマッチングを使用したXMLタグによるマークアップ入力。
JavaCC、 Javaコンパイラコンパイラtm(JavaCC tm)-Javaパーサジェネレータ。
Racketのパーサーツール、lexおよびyaccスタイルの解析(Beautiful Racketエディション)
Belr、C ++ 11で記述されたパーサジェネレータ。ABNFを使用します。

も参照してください
コンパイラ記述言語(CDL)
シンタックスダイアグラム–鉄道ダイアグラム
並進バッカス・ナウア記法(TBNF)
Wirth構文表記– 1977年のBNFの代替
明確な句の文法–Prologで使用されるBNFのより表現力豊かな代替手段
Van Wijngaarden文法–Algol68を定義するためにBNFよりも優先して使用されます
Meta-II –初期のコンパイラ作成ツールと表記法

参考文献
^ 「パニーニの伝記」。スコットランドのセントアンドリュース大学数学統計学部。
^ Ingerman、Peter Zilahy(1967年3月)。”” “” Pāṇini-バッカスフォーム “”提案”。ACMの通信。コンピューティングマシナリー協会。10(3):137 DOI:10.1145 / 363162.363165。S2CID 52817672。  Ingermanは、バッカス正規形が名前に変更することを示唆しているパニーニ最古の独立した発明者としてパニーニに起因する信用を与えるために、-Backusフォーム。
^ チョムスキー、ノーム(1956)。「言語記述のための3つのモデル」(PDF)。情報理論に関するIREトランザクション。2(3):113–24。土井:10.1109 /TIT.1956.1056813。2010年9月19日にオリジナル(PDF)からアーカイブされました。
^ チョムスキー、ノーム(1957)。構文構造。ハーグ:ムートン。
^ 構文式の意味は< >、のように括弧で囲まれた単語は、メンバーが基本記号のシーケンスであるクラスを表すと言うことでさらに説明できます。この種のクラス指定は、言語の説明に含まれています。単語、動詞、名詞などの通常の自然言語の指定を説明するために使用されます。ピーターナウア(1961年)。 「ALGOLプログラミングのコース」。NS。5、注1 。
^ バッカス、JW(1959)。「チューリッヒACM-GAMM会議で提案されている国際代数言語の構文とセマンティクス」。情報処理に関する国際会議の議事録。ユネスコ。pp。125–132。
^ ファレル、ジェームスA.(1995年8月)。「コンパイラの基本:拡張バッカスナウア記法」。
^ フルトン、III、スコットM.「ジョン・W・バッカス(1924-2007)」。BetaNews。株式会社。
^ クヌース、ドナルドE.(1964)。「バッカス・ナウアー形式とバッカス・ナウア形式」。ACMの通信。7(12):735–736。土井:10.1145 /355588.365140。S2CID 47537431。
  ^ Ingerman、PZ(1967)。「「 Pāṇiniバッカスフォーム」が提案されました」。ACMの通信。10(3):137 DOI:10.1145 / 363162.363165。S2CID 52817672。
  ^ ALGOL60レポートセクションを改訂。1.1。 「ALGOL60」。
^ ソールローゼン(1967年1月)。プログラミングシステムと言語。マグロウヒルコンピュータサイエンスシリーズ。ニューヨーク/ニューヨーク:マグロウヒル。ISBN  978-0070537088。
^ RBNF。
^ 「BNFC」、言語技術、SE:Chalmers
^ 「オンラインデモ」、RPatk
^ 「ツール」、Act world、2013-01-29にオリジナルからアーカイブ
^ ターゲットプロセッサがSystem / 360、またはz / Systemまでの関連であり、ターゲット言語がPL / I(または実際にはXPL)に類似している場合、必要なコード「エミッタ」はXPLから適合させることができます。 System / 360の「エミッター」。
^ マッキーマン、WM; ホーニング、JJ; ワートマン、DB(1970)。コンパイラジェネレータ。プレンティスホール。ISBN  978-0-13-155077-3。
^ 「BNFパーサー²」、Source Forge (プロジェクト)
^ bnf2xml ^ 「JavaCC」。
は、2008年11月1日より前にFree Online Dictionary of Computingから取得され、GFDLバージョン1.3以降の「再ライセンス」条件に基づいて組み込まれた資料に基づいています。

外部リンク
Garshol、Lars Marius、BNF、EBNF:それらは何で、どのように機能しますか?、いいえ:プライベート。
RFC  5234 —構文仕様の拡張BNF:ABNF。
RFC  5511 —ルーティングBNF:さまざまなプロトコル仕様で使用される構文。
ISO / IEC 14977:1996(E)情報技術–構文メタ言語–拡張BNF、「公開」、標準、ISOから
入手可能または
Kuhn、Marcus、Iso 14977(PDF)、英国から:CAM (後者は表紙がありませんが、それ以外ははるかにきれいです)

言語文法
ベルンハルト、アルゴール-60 BNF、DE:LRZミュンヘン、元のBNF。
「SQL-92、SQL-99、SQL-2003のBNF文法」、サベージ、オーストラリア:ネット、SQL用の無料で入手可能なBNF文法。
「BNFのWebクラブ」、DBの研究は、CH:からアーカイブUnige、オリジナルの2007年1月24日には、取得した2007年1月25日を、SQL、Ada、Java用の無料で入手可能なBNF文法。
「コンパイラ構築のための無料プログラミング言語文法」、ソースコード、自由な国、C / C ++、Pascal、COBOL、Ada 95、PL / I用の無料で入手可能なBNF / EBNF文法。
「STEP標準に関連するBNFファイル」、Expエンジン(SVN)、Source Forge、2012年12月25日にオリジナルからアーカイブ。ISO 10303(STEP)規格のパーツ11、14 、および21が含まれています。”