# 前書き 今この文章をに目を通してくださっているみなさんは、「いつか自分でプログラミング言語を作ってみたい!」と思ったことがあるかもしれません。でもほとんどの人は「正直言って,言語を作るなんて自分には敷居が高過ぎる」とあきらめてしまいます。ご安心を! 何を隠そうこれまでの私も,「コンパイラ」とか「インタープリタ」名の付く技術書を幾つも眺めてきました。「字句解析,構文解析,インタープリタ,VM…」など,本に書かれている概念自体はある程度理解できるものの,それを実装して実際に動くものを作るのは別問題です。 でもしばらく前のこと,仕事で数十万行にも及ぶ大きなデータファイルを作成する必要がありました。エディタを使って手作業するなら軽く数ヶ月かかってしまいます。それでは大変なので,設定ファイルを定義してプログラムにデータを生成させようということになりました。数千行の特別な書式の設定ファイルを準備すれば,ものの数分で膨大かつ正確なデータを生成してくれるのです。 はからずも「プログラミング言語のようなもの」を作ることになりました。まずは設定ファイルをパースしなければなりません。「さて,パーサをどう実装する? Lex+Yaccを使う? パーサーを手書きで書く? いずれにしても面倒で難しそう…」と悩みつつWebで検索していたところ,偶然[『PEG』][Link_PEG]という言葉を目にしました。PEGとは「Parsing Expression Grammar」の略号です。調べてみると,PEGの文法ファイル一つで,字句解析と構文解析を行えること,普段良く使っている正規表現に似ていること,自分でもPEGパーサコンビネータやジェネレータを作成できそうなことがわかりました。 さっそく日々の仕事で使っているC++で,PEGコンビネータとパーサジェネレータを作り始めました。はい,コンパイラ作成の経験などなかった私でも,意外にあっさり実装できてしまいました。その後,先の設定ファイルの文法をPEGでデザインし(これがまたとても面白い!),パーサジェネレータでいとも簡単にパーサを生成することができました。 これが契機となって、「もう少し頑張れば、自分にもプログラミング言語を作ることができるかも」と思えるようになりました。文法定義とパーサーの生成がとても簡単になったので,言語作成の敷居がぐっと下がったように感じたのです。さらにこのPEGライブラリに改良を重ね,実際にプログラミング言語を作って動かすことができるようになりました! 正直なところ,今でも「コンパイラ技術」についての深い知識は持ち合わせていません。PEGの[オリジナルの論文][Link_Paper]に書かれている理論も完璧に理解しているわけではありません。それでも言語処理系を作ることの楽しさを十分味わい,この分野についてもっと勉強したいというモチベーションを得ることもできたことは素晴らしい経験でした。 皆さんにもこの同じ喜びを味わっていただきたと思い,この文章を書いています。想定している読者は,ある程度のプログラミングの経験を持っていて,自分で言語を創りあげたいとの熱意を持っている方です。 必要な道具はC++11対応のコンパイラだけです。最新の主要C++コンパイラは,Clang,GCC,Visual C++にかかわらず,全てC++11に対応しています。 ではさっそく始めましょう! Happy Hacking! [Link_PEG]: https://ja.wikipedia.org/wiki/Parsing_Expression_Grammar [Link_Paper]: http://bford.info/pub/lang/peg