知って損はない、各言語のBNF定義
[ 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) の定義 は次のようになっています。
下の図をぱっと見てわかると思いますが、これが正確な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