You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
cpp-peglib/tutorial/intro.md

3.6 KiB

前書き

今この本をに目を通してくださっているみなさんは、「ぜひプログラミング言語を作ってみたい!」と考えている方のお一人でしょう。でも自分で言語を作ってみるなんて敷居が高過ぎるのでは?何を隠そう少し前の私も,『コンパイラ』と名の付く技術書をパラっと眺める度に,その内容の難しさに恐れを抱きました。orz...

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

はたして「プログラミング言語のようなもの」を作ることになりました。「さて,どう実装する? YACCを使う? パーサーを手書きで書く? でも面倒で難しそう...」と悩みつつWebで検索していたところ,偶然『PEG』という可愛らしい言葉が目に入りました。PEGとは「Parsing Expression Grammar」の略号です。調べてみると,難しそうなYACCより簡単に文法が定義でき,かつPEGをサポートするライブラリがパーサーを生成してくれるのです。さらに調べてみると,PEGライブラリ自体が誰にでも比較的簡単に実装可能ということも発見しました!

それでWeb上の記事をいろいろ漁りながら,仕事で使っているC++用のPEGライブラリを見よう見まねで作り始めました。はい,コンピュータサイエンスを正式に学ぶことのなかった私でも、意外とあっさり実装できました。そのあと設定ファイルの文法をデザインし(これがまたとても面白い!),そのパーサーをPEGライブラリでいとも簡単に作ることができました。嬉しいことに、仕事のプロジェクトはとてもうまくいきました。

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

恥ずかしい話ですが,今でも「字句解析,構文解析,構文木,意味解析,コード生成,最適化...」について、そこそこの深い知識しか持ち合わせていません。PEGのオリジナルの論文理論も完璧に理解しているわけではありません。それでも言語処理系を作ることの楽しさを十分経験でき,さらにこの分野をもっと勉強したいというモチベーションを得ることもできたことは大きな収穫でした。

皆さんにもこの同じ喜びを味わっていただきたと思い,この文章を書いています。必要なのはテキストエディタ(当然Vimですよね?)とC++11対応のコンパイラだけです。最新のClang,GCC,Visual C++をお持ちであれば,さっそく始めましょう!