mirror of
https://github.com/yhirose/cpp-peglib.git
synced 2024-12-22 20:05:31 +00:00
Updated tutorial.
This commit is contained in:
parent
a1704cad73
commit
1038b71b12
@ -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記法を使ってどのように言語を定義していくのか見てみましょう。
|
||||
|
@ -1,12 +1,12 @@
|
||||
# PEGで言語をデザインしてみよう
|
||||
|
||||
PEGについて一言で説明としたら,「言語を定義するための言語」です。言語としてのPEGは,C++やJavaScriptなどの言語とはずいぶん毛色が違います。むしろ正規表現,XML Schemer,DBのテーブルスキーマのように「規則を定義」するタイプの言語です。
|
||||
PEGは「言語を定義するための言語」です。言語としてのPEGは,C++やJavaScriptなどの言語とはずいぶん毛色が違います。むしろ正規表現,XML Schemer,DBのテーブルスキーマのように「規則を定義」するタイプの言語です。
|
||||
|
||||
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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user