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/chap_02.md

86 lines
4.1 KiB

# PEGで言語をデザインしてみよう
PEGについて一言で説明しなさいと言われたら,「言語を定義するための言語」と言えるかもしれません。パーサジェネレータは,PEGを使って厳密に定義された言語の文法を読み込んで,パーサを生成することができます。
PEGは,C++やJavaScriptなどの処理手続きを記述する言語とはずいぶん毛色が違います。むしろ正規表現,XML Schemer,DBのテーブルスキーマのような「規則を定義」するタイプの言語に似ています。
この章では,次の「言語」をPEGを使って定義してみます。
* 日本語の「文」
* カンマ区切り行
* 括弧付き四則計算式
* JSON
* JavaScriptの小さなサブセット
下に行くほど文法定義が難しくなり,PEGのより多くの記法を使う必要が出てきます。これらの例が終わる頃には,きっと簡単なスクリプト言語を自分でデザインできるようになるでしょう。(もちろん文法を定義しただけなので,コードを動きませんが。^^;)
PEGの記法については,この章を読み進めるうちに自然に学べるようになっています。しかし時間が許すなら,是非kimizuさんの[「PEG基礎文法最速マスター」][Link_BasicGrammar]をご覧ください。PEGの記法について,とても簡潔にわかりやすくまとめられています。
「習うより慣れろ」と古くから言われるように,実際に手を動かしてコードを書くことは理解を深めるための早道です。その際[「PEG Playground」](http://yhirose.github.io/peglint/)ご活用ください。このWeb アプリは,PEGの文法定義コードと定義される言語のコードをリアルタイムにチェックしてくれます。
ではさっそく一番目の例から見てみましょう。
## 日本語の「文」を定義する
文法と聞くと,遠い昔の国語の授業を懐かしく思い出します。まずは簡単な「文」のルールを定義しましょう。
<- 主語 述語 ''
「文」は,連続する「主語」「述語」「'。'」で成り立っています。さらに「主語」と「述語」は,
主語 <- 名詞 助詞
述語 <- 動詞 助詞
と品詞を使って定義してみました。それぞれの品詞に実際の言葉を幾つか入れてみましょう。
名詞 <- 'サーバー' / 'クライアント'
動詞 <- '落ち' / '復旧し'
助詞 <- '' / '' / '' / 'ます'
ではこのルールにマッチする文を考えましょう。例えば,
サーバーが落ちた。
悲しいですが,この文はルールにマッチします。
サーバーを復旧します。
希望が見えてきました。
プログラムが落ちた。
プログラムが「名詞」のリストにないので,マッチしません!
文法を少し修正しましょう。
<- 修飾語? 主語 述語 ''
主語 <- 名詞 助詞
述語 <- 動詞 助詞
修飾語 <- 形容詞
名詞 <- 'サーバー' / 'クライアント'
形容詞 <- '古い' / '新しい'
動詞 <- '落ち' / '復旧し'
助詞 <- '' / '' / '' / 'ます' / ''
「文」ルールに「修飾語」を追加しました。`?`が付いていますが,これは「出現してもしなくてもよい」という意味です。また「形容詞」ルールも加わりました。これで次のような文全てがマッチします。
サーバーが落ちた。
古いサーバーが落ちた。
サーバーを復旧します。
新しいサーバーに復旧します。
PEGの感覚がつかめてきましたか?
さて,ここまでで使用した4つの記法についておさらいしましょう。
| 記法 | 意味 |
|:---------|:---------------|
| <- | 構文規則の定義 |
| &#2423; | 連接 |
| / | 選択 |
| ? | 0回または1回 |
| 'string' | 文字列リテラル |
[Link_BasicGrammar]: http://kmizu.hatenablog.com/entry/20100203/1265183754