33
拡張性のある PEGパーサの実装 夏のプログラミングシンポジウム 2014

拡張性のあるPEGパーサの実装

  • Upload
    masato

  • View
    402

  • Download
    0

Embed Size (px)

DESCRIPTION

夏のプログラミングシンポジウム 2014でのプレゼンです

Citation preview

Page 1: 拡張性のあるPEGパーサの実装

拡張性のある PEGパーサの実装

夏のプログラミングシンポジウム 2014

Page 2: 拡張性のあるPEGパーサの実装

PEGパーサ

Page 3: 拡張性のあるPEGパーサの実装

パーサとは

入力(プログラム)が 文法に従ってるかどうか判別

Page 4: 拡張性のあるPEGパーサの実装

パーサの種類

-上向き

- yacc

-下向き

- javacc - ANTLR - PEG

Page 5: 拡張性のあるPEGパーサの実装

PEGの特徴

- 曖昧さがない

- 字句解析器と統合

- 線形時間

Page 6: 拡張性のあるPEGパーサの実装

PEGの例

E = B C

B = (“a” / “b”) B / “”

C = “c”+

プログラム:”aabbcc”

文法:

Page 7: 拡張性のあるPEGパーサの実装

演算子

- 連接

- 選択

- and-predicate

- not-predicate

Page 8: 拡張性のあるPEGパーサの実装

連接

e1 e2

入力がe1にマッチした後 e2にマッチするかどうかを調べる

Page 9: 拡張性のあるPEGパーサの実装

選択

e1 / e2

入力が e1にマッチするかどうかを調べ 失敗したら,e2を調べる

Page 10: 拡張性のあるPEGパーサの実装

And-predicate

&e

入力が eにマッチするかどうかを調べる ただし,入力は先に進めない &”a” “a” は aにマッチ

Page 11: 拡張性のあるPEGパーサの実装

Not-predicate

!e

入力が eにマッチするかどうかを調べ 失敗したら,OK !”a”はa以外の1文字にマッチ ただし入力は進めない

Page 12: 拡張性のあるPEGパーサの実装

Ponder

Page 13: 拡張性のあるPEGパーサの実装

機能を拡張しやすく

目標

Page 14: 拡張性のあるPEGパーサの実装

data ParsecT s u m a = ParsecT { runParsecT :: State s u -> m (Consumed (m (Reply s u a))) }

Parsecの一部

Page 15: 拡張性のあるPEGパーサの実装

最小限のパーサとは?

Page 16: 拡張性のあるPEGパーサの実装

入力

(マッチ成功,失敗)

を渡すと

が返ってくる

Page 17: 拡張性のあるPEGパーサの実装

“aabbccdd”

(“aabbcc”, “dd”)

Page 18: 拡張性のあるPEGパーサの実装

最小限のパーサとは?

Page 19: 拡張性のあるPEGパーサの実装

最小限のパーサとは?

Stateモナド

Page 20: 拡張性のあるPEGパーサの実装

最小限のPEGパーサとは?

Page 21: 拡張性のあるPEGパーサの実装

Stateモナド +Errorモナド

最小限のPEGパーサとは?

Page 22: 拡張性のあるPEGパーサの実装

PEG+拡張性で考えると?

Page 23: 拡張性のあるPEGパーサの実装

PEG+拡張性で考えると?

Stateモナド +Errorモナド +拡張用モナド

Page 24: 拡張性のあるPEGパーサの実装

Stateモナド Errorモナド 拡張用モナド

モナドトランスフォーマー でまとめちゃう

Page 25: 拡張性のあるPEGパーサの実装

type ParserT s e m a = StateT s (ErrorT e m) a

Page 26: 拡張性のあるPEGパーサの実装

type ParserT s e m a = StateT s (ErrorT e m) a

ユーザが拡張をするモナド

PEG部分

Page 27: 拡張性のあるPEGパーサの実装

type ParserT s e m a = StateT s (ErrorT e m) a

Page 28: 拡張性のあるPEGパーサの実装

一番簡単な使用例

Page 29: 拡張性のあるPEGパーサの実装

type Parser a = ParserT String String Identity a

入力:文字列(String) エラー:文字列(String) 拡張: なし

Page 30: 拡張性のあるPEGパーサの実装

デモ

Page 31: 拡張性のあるPEGパーサの実装

拡張すればするほど layerが深くなる

問題点

再利用しにくい

Page 32: 拡張性のあるPEGパーサの実装

解決方法

- Data types á la carte

- Free Monad

- Extensible Effects:

an alternative to Monad Transformers

この辺りの技術を使えば大丈夫かも?

Page 33: 拡張性のあるPEGパーサの実装

まとめ - 拡張が容易なPEGパーサの提案・実装

- 再利用しにくい問題

コード:https://github.com/matt76k/ponder