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