Parsec 3活用事例 :
Keepalived構文チェッカ



              id:maoe
自己紹介
青江光敏(id:maoe)
http://d.hatena.ne.jp/maoe/
株式会社はてな インフラチーム
ネットワーク設計構築運用
サーバの面倒など
自己紹介
青江光敏(id:maoe)
http://d.hatena.ne.jp/maoe/
株式会社はてな インフラチーム
ネットワーク設計構築運用
サーバの面倒など
(インフラチームアルバイト絶賛募集中)
Parsec
Haskellでデファクトスタンダードとなってい
るparser combinator
RWH 16章: Parsecを使う
Parsec
Haskellでデファクトスタンダードとなってい
るparser combinator
RWH 16章: Parsecを使う
 Parsec 2を前提としている

最新版はParsec 3
Parsec 3で変わること
モナド変換子に対応した
Applicativeのインスタンスになった
モジュール名がText.Parsecになった
ByteStringな入力も可能になった
ドキュメントがまともになった
Parsec 3で変わること
モナド変換子に対応した
Applicativeのインスタンスになった
モジュール名がText.Parsecになった
ByteStringな入力も可能になった
ドキュメントがまともになった
モナド変換子でできること
Writerモナドでログをとれる?
IOモナドでデバッグプリントできる?
モナド変換子でできること
Writerモナドでログをとれる?
IOモナドでデバッグプリントできる?


IOモナドでinclude文を簡単にパーズできるよ
うになった!
例 : Keepalived構文チェッカ
例 : Keepalived構文チェッカ
わかりにくいのでヤメ
例 : しりとりノート

こぶた               きょうと
たぬき               とちぎ
include つづき.txt   ぎふ
きつね               ふくい
ねこ                いばら...
例 : しりとりノート
Line "こぶた"

Line "たぬき"

Included [ Line "きょうと"

       , Line "とちぎ"

       , Line "ぎふ"

       , Line "ふくい"

...
構成要素と基本的なパーザ
type Note = [Content]
data Content = Line     String
             | Included Note


pNote = many $ pInclude <...
pIncludeの実装方針
includeに続くファイル名(つづき.txt)を取得
parserの入力を新ファイルの内容にセット
 Text.Parsec.setInputで入力を差し替えられる

新ファイルをパーズ
parserの状態を元に戻...
pIncludeの実装
pInclude = do
  Line file <- lexeme (string "include")
            *> pLine
  Included <$> newContext (pFile f...
デモ
実際のソースコード
 http://github.com/maoe/shiritori
まとめ
Parsec 3からパーザ中でI/Oができるように
includeを簡単にパーズできるようになった
発展: include *(glob)にも対応している例
 keepalived.confパーザライブラリ
 http://github...
Q&A
ご静聴ありがとうございました。
Upcoming SlideShare
Loading in …5
×

Parsec 3活用事例: Keepalived構文チェッカ (Haskell Gong 2009)

3,028 views

Published on

Haskellゴング発表資料

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,028
On SlideShare
0
From Embeds
0
Number of Embeds
651
Actions
Shares
0
Downloads
16
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Parsec 3活用事例: Keepalived構文チェッカ (Haskell Gong 2009)

  1. 1. Parsec 3活用事例 : Keepalived構文チェッカ id:maoe
  2. 2. 自己紹介 青江光敏(id:maoe) http://d.hatena.ne.jp/maoe/ 株式会社はてな インフラチーム ネットワーク設計構築運用 サーバの面倒など
  3. 3. 自己紹介 青江光敏(id:maoe) http://d.hatena.ne.jp/maoe/ 株式会社はてな インフラチーム ネットワーク設計構築運用 サーバの面倒など (インフラチームアルバイト絶賛募集中)
  4. 4. Parsec Haskellでデファクトスタンダードとなってい るparser combinator RWH 16章: Parsecを使う
  5. 5. Parsec Haskellでデファクトスタンダードとなってい るparser combinator RWH 16章: Parsecを使う Parsec 2を前提としている 最新版はParsec 3
  6. 6. Parsec 3で変わること モナド変換子に対応した Applicativeのインスタンスになった モジュール名がText.Parsecになった ByteStringな入力も可能になった ドキュメントがまともになった
  7. 7. Parsec 3で変わること モナド変換子に対応した Applicativeのインスタンスになった モジュール名がText.Parsecになった ByteStringな入力も可能になった ドキュメントがまともになった
  8. 8. モナド変換子でできること Writerモナドでログをとれる? IOモナドでデバッグプリントできる?
  9. 9. モナド変換子でできること Writerモナドでログをとれる? IOモナドでデバッグプリントできる? IOモナドでinclude文を簡単にパーズできるよ うになった!
  10. 10. 例 : Keepalived構文チェッカ
  11. 11. 例 : Keepalived構文チェッカ わかりにくいのでヤメ
  12. 12. 例 : しりとりノート こぶた きょうと たぬき とちぎ include つづき.txt ぎふ きつね ふくい ねこ いばらき どうぶつ.txt つづき.txt
  13. 13. 例 : しりとりノート Line "こぶた" Line "たぬき" Included [ Line "きょうと" , Line "とちぎ" , Line "ぎふ" , Line "ふくい" , Line "いばらき" ] Line "きつね" Line "ねこ"
  14. 14. 構成要素と基本的なパーザ type Note = [Content] data Content = Line String | Included Note pNote = many $ pInclude <|> pLine pLine = Line <$> lexeme (many1 notNewline) lexeme p = p <* spaces
  15. 15. pIncludeの実装方針 includeに続くファイル名(つづき.txt)を取得 parserの入力を新ファイルの内容にセット Text.Parsec.setInputで入力を差し替えられる 新ファイルをパーズ parserの状態を元に戻す 新ファイルのパーズ結果を返す
  16. 16. pIncludeの実装 pInclude = do Line file <- lexeme (string "include") *> pLine Included <$> newContext (pFile file) pFile中でreadFileしてpNoteでパーズしている newContextで現在のポジションや入力を保存し ておき、新たな状態でpFileを呼び出す
  17. 17. デモ 実際のソースコード http://github.com/maoe/shiritori
  18. 18. まとめ Parsec 3からパーザ中でI/Oができるように includeを簡単にパーズできるようになった 発展: include *(glob)にも対応している例 keepalived.confパーザライブラリ http://github.com/maoe/text-keepalived インフラチームアルバイト絶賛募集中
  19. 19. Q&A ご静聴ありがとうございました。

×