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

Preview:

DESCRIPTION

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

Citation preview

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

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

PEGパーサ

パーサとは

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

パーサの種類

-上向き

- yacc

-下向き

- javacc - ANTLR - PEG

PEGの特徴

- 曖昧さがない

- 字句解析器と統合

- 線形時間

PEGの例

E = B C

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

C = “c”+

プログラム:”aabbcc”

文法:

演算子

- 連接

- 選択

- and-predicate

- not-predicate

連接

e1 e2

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

選択

e1 / e2

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

And-predicate

&e

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

Not-predicate

!e

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

Ponder

機能を拡張しやすく

目標

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

Parsecの一部

最小限のパーサとは?

入力

(マッチ成功,失敗)

を渡すと

が返ってくる

“aabbccdd”

(“aabbcc”, “dd”)

最小限のパーサとは?

最小限のパーサとは?

Stateモナド

最小限のPEGパーサとは?

Stateモナド +Errorモナド

最小限のPEGパーサとは?

PEG+拡張性で考えると?

PEG+拡張性で考えると?

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

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

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

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

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

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

PEG部分

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

一番簡単な使用例

type Parser a = ParserT String String Identity a

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

デモ

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

問題点

再利用しにくい

解決方法

- Data types á la carte

- Free Monad

- Extensible Effects:

an alternative to Monad Transformers

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

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

- 再利用しにくい問題

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

Recommended