より良い環境を求めて このページをアンテナに追加 RSSフィード

2006-09-20

[] パーサの修正メモ

下のソース。

breakStringのところは、ただの文字列をチェックしてるんだからリストにしてどれか一つにマッチしたらエラーにすべきところだった。

明日直そう。

[] wiki

http://www.n314.com/Haskell/wiki/

はてな記法のpreを採用してみた。


パーサが何となく分かってきた。まだ何となく・・。

普通の文章をパース中にリストとか表示するために中断する方法がまだ無駄なことやってるかも。

type WikiParser a = GenParser String State a

paragraph = do es <- many1 sentences <?> "paragraph"
               return $ map p' es
    where p' es = Tag "p" [] es

sentences = do ss <- many1 sentence <?> "sentence"
               return $ sepByBr ss

sentence :: WikiParser Contents
sentence = do line <- sentenceLine <?> "sentence"
              st <- getState
              return [(Text $ compileText st line)]

-- テキストから脱出するためのパーサ
sentenceLine :: WikiParser String
sentenceLine = try ((breakString >> unexpected "breakString")
                    <|> (breakBlock >> unexpected "breakBlock")
                    <|> anyLine )


breakString :: WikiParser String
breakString = satisfyString (== preStart)
          <|> satisfyString (== superPreStart)
          <|> satisfyString (== hrString)
          <|> blank
breakBlock :: WikiParser Contents
breakBlock = lists 1

文章読み込み中に何かの構文があれば unexpected で強制的に脱出してる。

トークンか何かを使えばもっと簡潔に書けるような。。。

[] ラムダ計算

ラムダ計算 - Wikipedia

Haskellをやりながら読むと、頭に入りやすいな。