Upload
masato
View
402
Download
0
Embed Size (px)
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