2013-12-12

知って損はない、各言語のBNF定義

maxresdefault.jpg

[ PR ]


プログラムの技術をワンランクアップさせるために必要なのは、正確なコンパイラの知識だと思います。

より正確にコンパイラを知るための入門として、BNFを知ることをおすすめします。

BNFとは

BNF (Backus-Naur form) とは、バッカス・ナウア記法の略で、プログラミング言語の文法を定義するためによく使われます。

コンパイラを作成する際によく使われるyaccなども、BNFに近い記法を利用して文法を定義します。

例1:JavaのBNF定義

説明するより、実際のBNFを見た方が良いと思います。

http://cui.unige.ch/isi/bnf/JAVA/ にJavaの文法をBNFで定義したものがありますが、例えば if文 (if statement) の定義 は次のようになっています。

20131212010713.jpg

下の図をぱっと見てわかると思いますが、これが正確なJavaのif文の定義です。

-[ ... ]は省略可能を意味しています。 - expressionやstatementは別途定義されていて、ページの中のリンクをクリックすると定義に飛びます。

例2 : C言語のBNF定義

https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm

こちらは前項のような可視化やリンクなどの補助がないので、より正確に読み取る必要があります。

C言語のif文(switch文も含む)は次のように定義されています。

<selection-statement> ::=
    if ( <expression> ) <statement>
    | if ( <expression> ) <statement> else <statement>
    | switch ( <expression> ) <statement>

まとめ

プログラミング言語の文法を定義する基本的な方法がBNFで、実用的にはBNFから派生した実用的な言語(yaccなど)が使われています。

BNFのほかにもオートマトンを使ったりもしますが、とりあえずBNFを押さえておけば役に立つと思います。

なお、BNFだけではコンパイラは成立せず、実際にはBNFなどの定義を元に、構文解析器を作る必要がありますので、その辺りも押さえておきたいところですね。

ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み
青木 峰郎
ソフトバンククリエイティブ
売り上げランキング: 130,329

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.