SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
拡張性のある PEGパーサの実装 
夏のプログラミングシンポジウム 2014 
Haskellで
PEGパーサ
パーサとは 
入力(プログラム)が 文法に従ってるかどうか判別
パーサの種類 
-上向き 
- yacc 
-下向き 
- javacc 
- ANTLR 
- PEG
PEGの特徴 
- 曖昧さがない 
- 字句解析器と統合 
- 線形時間
PEGの例 
E = B C B = (“a” / “b”) B / “” C = “c”+ 
プログラム:”aabbcc” 
文法:
演算子 
- 連接 
- 選択 
- not-predicate 
- and-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パーサの提案・実装 
- 考慮する点がいっぱい

Weitere ähnliche Inhalte

Andere mochten auch

L-1グランプリ "D言語"
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"det coder
 
ANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognitionelliando dias
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1moai kids
 
正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方webcampusschoo
 
競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略K Moneto
 
青空文庫テキストフォーマットについて (aozorahack)
青空文庫テキストフォーマットについて (aozorahack)青空文庫テキストフォーマットについて (aozorahack)
青空文庫テキストフォーマットについて (aozorahack)masayoshi takahashi
 

Andere mochten auch (6)

L-1グランプリ "D言語"
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"
 
ANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language RecognitionANTLR-ANother Tool for Language Recognition
ANTLR-ANother Tool for Language Recognition
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1
 
正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方正しいマインドマップの使い方・描き方
正しいマインドマップの使い方・描き方
 
競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略競技プログラミング頻出アルゴリズム攻略
競技プログラミング頻出アルゴリズム攻略
 
青空文庫テキストフォーマットについて (aozorahack)
青空文庫テキストフォーマットについて (aozorahack)青空文庫テキストフォーマットについて (aozorahack)
青空文庫テキストフォーマットについて (aozorahack)
 

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