cpp-peglib/tutorial/intro.md
2015-08-12 15:13:11 -04:00

4.0 KiB
Raw Blame History

前書き

今この文章をに目を通してくださっているみなさんは、「いつか自分でプログラミング言語を作ってみたい!」と思ったことがあるかもしれません。でもほとんどの人は「正直言って,言語を作るなんて自分には敷居が高過ぎる」とあきらめてしまいます。ご安心を!

何を隠そうこれまでの私も「コンパイラ」とか「インタープリタ」名の付く技術書を幾つも眺めてきました。「字句解析構文解析インタープリタVM…」など本に書かれている概念自体はある程度理解できるもののそれを実装して実際に動くものを作るのは別問題です。

でもしばらく前のこと,仕事で数十万行にも及ぶ大きなデータファイルを作成する必要がありました。エディタを使って手作業するなら軽く数ヶ月かかってしまいます。それでは大変なので,設定ファイルを定義してプログラムにデータを生成させようということになりました。数千行の特別な書式の設定ファイルを準備すれば,ものの数分で膨大かつ正確なデータを生成してくれるのです。

はからずも「プログラミング言語のようなもの」を作ることになりました。まずは設定ファイルをパースしなければなりません。「さて,パーサをどう実装する? Lex+Yaccを使う パーサーを手書きで書く? いずれにしても面倒で難しそう…」と悩みつつWebで検索していたところ偶然『PEG』という言葉を目にしました。PEGとは「Parsing Expression Grammar」の略号です。調べてみるとPEGの文法ファイル一つで字句解析と構文解析を行えること普段良く使っている正規表現に似ていること自分でもPEGパーサコンビネータやジェネレータを作成できそうなことがわかりました。

さっそく日々の仕事で使っているC++でPEGコンビネータとパーサジェネレータを作り始めました。はいコンパイラ作成の経験などなかった私でも意外にあっさり実装できてしまいました。その後先の設定ファイルの文法をPEGでデザインしこれがまたとても面白いパーサジェネレータでいとも簡単にパーサを生成することができました。

これが契機となって、「もう少し頑張れば、自分にもプログラミング言語を作ることができるかも」と思えるようになりました。文法定義とパーサーの生成がとても簡単になったので言語作成の敷居がぐっと下がったように感じたのです。さらにこのPEGライブラリに改良を重ね実際にプログラミング言語を作って動かすことができるようになりました

正直なところ今でも「コンパイラ技術」についての深い知識は持ち合わせていません。PEGのオリジナルの論文に書かれている理論も完璧に理解しているわけではありません。それでも言語処理系を作ることの楽しさを十分味わい,この分野についてもっと勉強したいというモチベーションを得ることもできたことは素晴らしい経験でした。

皆さんにもこの同じ喜びを味わっていただきたと思い,この文章を書いています。想定している読者は,ある程度のプログラミングの経験を持っていて,自分で言語を創りあげたいとの熱意を持っている方です。

必要な道具はC++11対応のコンパイラだけです。最新の主要C++コンパイラはClangGCCVisual C++にかかわらず全てC++11に対応しています。

ではさっそく始めましょう!

Happy Hacking!