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

30 lines
4.4 KiB

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