Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,395 views

Published on

Haskellゴング発表資料

Published in: Technology
  • Login to see the comments

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 ご静聴ありがとうございました。

×