Updated tutorial.

This commit is contained in:
yhirose 2015-08-10 00:35:04 -04:00
parent a1704cad73
commit 1038b71b12
3 changed files with 14 additions and 11 deletions

View File

@ -1,6 +1,6 @@
# まずはHello world
はじめに取り組むプログラムは,もちろん**hello world**ですよね。
はじめに取り組むプログラムは,もちろん**Hello world**ですよね。
では「hello world!」と正しく入力できたら「OK」そうでなければ「NG」と表示するプログラムを作ってみましょう以下がソースコードです。
@ -122,15 +122,15 @@ const auto grammar = R"(
}
```
このように,パーサジェネレータを使うと簡単に構文解析パーサを生成ことができます。もちろん実用的な言語の文法はもっと複雑ですし,パーサは構文チェックをするだけでコードを実行することできません。実際に動作するインタープリタ型言語の作成には,次のようなステップが必要です。
これでパーサジェネレータを使う準備ができました。
実用的な言語の文法はずっと複雑ですし,パーサだけでコードを実行することできません。実際に動作する状態に持って行くには,さらに行うべきことがあります。インタープリタ型言語の場合,次のようなステップが必要です。
1. 言語の文法を定義する
2. パーサーを生成する
3. ソースコードをパースして、AST抽象構文木を生成する
4. ASTを実行するインタープリタを作成する
PEGライブラリはステップ2と3のみ扱いステップ1と2は自分で扱わなければなりません。しかし,この文法定義とインタープリタ作成の部分が一番面白いところで,デザインセンスと実装技術の見せ所です。
PEGライブラリはステップ2と3のみ扱い残りは自分で扱わなければなりません。しかし,この文法定義とインタープリタ作成の部分が個性を出せる一番面白いところで,デザインセンスと実装技術の見せ所です。
これからの章では,それぞれのステップを順を追って説明していきます。その際,実際にコードを動かしたり拡張していくなら,より一層理解が深まるに違いありません。
Happy Hacking!
では最初にPEG記法を使ってどのように言語を定義していくのか見てみましょう。

View File

@ -1,12 +1,12 @@
# PEGで言語をデザインしてみよう
PEGについて一言で説明としたら,「言語を定義するための言語」です。言語としてのPEGはC++やJavaScriptなどの言語とはずいぶん毛色が違います。むしろ正規表現XML SchemerDBのテーブルスキーマのように「規則を定義」するタイプの言語です。
PEG「言語を定義するための言語」です。言語としてのPEGはC++やJavaScriptなどの言語とはずいぶん毛色が違います。むしろ正規表現XML SchemerDBのテーブルスキーマのように「規則を定義」するタイプの言語です。
PEGで文法を書き表すことによって人間に読みやすくかつ厳密に文法を定義できます。さらにこの文法ファイルを使ってその言語のパーサーをプログラムに自動生成させることもできます。
PEGの記法はとてもシンプルで習得しやすいものです。BNFや正規表現をご存知の方でしたらほんのわずかな時間で覚えられるでしょう。
PEGの理論的背景についてもっと知りたい方はBryan Fordさんの[2004年の論文[Link_Ford]を読みましょう。このTechnical Paperの2番めのセクションにはPEGをPEGで定義するとても興味深いコードが載せられています。私もこれを参照しながらパーサジェネレータを実装しました。
PEGの理論的背景についてもっと知りたい方はBryan Fordさんの[2004年の論文][Link_Ford]を読みましょう。このTechnical Paperの2番めのセクションにはPEGをPEGで定義するとても興味深いコードが載せられています。私もこれを参照しながらパーサジェネレータを実装しました。
「習うより慣れろ」と古くから言われるように,実際に手を動かしてコードを書くことは理解を深めるための早道です。その際[「PEG Playground」](http://yhirose.github.io/peglint/)を使ってみてください。このWebアプリはPEGの文法定義コードと定義される言語のコードをリアルタイムにチェックしてくれます。
@ -69,7 +69,7 @@ CSVの文法が定義できました
NO_DQUOTE_FIELD <- (![,"\r\n] .)*
DQ_FIELD <- '"' (!["] . / '""')* '"'
これが確かに正しいかテストしてみましょう。
では,この文法をテストしてみましょう。
[Link_BasicGrammar]: http://kmizu.hatenablog.com/entry/20100203/1265183754
[Link_Ford]: http://pdos.csail.mit.edu/papers/parsing:popl04.pdf

View File

@ -22,9 +22,12 @@
#include <iostream>
int main(void) {
std::cout << "hello world!\n";
}```
}
```
では,さっそく始めましょう!
ではさっそく始めましょう!
Happy Hacking!
[Link_PEG]: https://ja.wikipedia.org/wiki/Parsing_Expression_Grammar
[Link_Paper]: http://bford.info/pub/lang/peg