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

81 lines
4.4 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を使って,簡単な「文」のルールを作ってみましょう。こんな感じでどうでしょうか?
<- 主語 述語 '。'
連続する主語」「述語」「'。'」で成り立っていますさらに主語述語
主語 <- 名詞 助詞
述語 <- 動詞 助詞
と品詞を使って定義してみましたそれぞれの品詞に実際の言葉を幾つか入れてみましょう
名詞 <- 'サーバー' / 'クライアント'
動詞 <- '落ち' / '復旧し'
助詞 <- '' / '' / '' / 'ます'
ではこのルールにマッチする文を考えましょう例えば
サーバーが落ちた
悲しいですがこの文はルールにマッチします
サーバーを復旧します
希望が見えてきました
プログラムが落ちた
プログラムが名詞のリストにないのでマッチしません
文法を少し修正しましょう
<- 修飾語? 主語 述語 '。'
名詞 <- 'サーバー' / 'クライアント'
形容詞 <- '古い' / '新しい'
動詞 <- '落ち' / '復旧し'
助詞 <- '' / '' / '' / 'ます' / ''
ルールに修飾語を追加しました。`?`が付いていますがこれは出現してもしなくてもよいという意味ですまた形容詞ルールも加わりましたこれで次のような文全てがマッチします
サーバーが落ちた
古いサーバーが落ちた
サーバーを復旧します
新しいサーバーに復旧します
PEGの感覚がつかめてきましたか
さてここまでで使用した4つの記法についておさらいしましょう
| 記法 | 意味 | |
|:-----|:---------------------------------------------|
| <- | ルールの定義 | 右側がルール名左側はPEGの式 |
| / | 選択|右から左へ順番にマッチを試みる |
| ? | 0回または1回 | |
| '' | 文字列リテラル | |
[Link_BasicGrammar]: http://kmizu.hatenablog.com/entry/20100203/1265183754