「チャンク」のリストを解析したい文字列がいくつかあります。私の文字列は、このhaskellで文字列を解析する
"some text [[anchor]] some more text, [[another anchor]]. An isolated ["
のように見て、私はこの
[
TextChunk "some text ",
Anchor "anchor",
TextChunk " some more text, "
Anchor "another anchor",
TextChunk ". An isolated ["
]
のようなものを取り戻すことを期待し、私は私が必要なものを行う機能と型を記述するために管理してきましたが、彼らはあまりに醜いようです。 これを行うにはより良い方法がありますか?
data Token = TextChunk String | Anchor String deriving (Show)
data TokenizerMode = EatString | EatAnchor deriving (Show)
tokenize::[String] -> [Token]
tokenize xs =
let (_,_,tokens) = tokenize' (EatString, unlines xs, [TextChunk ""])
in reverse tokens
tokenize' :: (TokenizerMode, String, [Token]) -> (TokenizerMode, String,[Token])
-- If we're starting an anchor, add a new anchor and switch modes
tokenize' (EatString, '[':'[':xs, tokens) = tokenize' (EatIdentifier, xs, (Identifier ""):tokens)
-- If we're ending an anchor ass a new text chunk and switch modes
tokenize' (EatAnchor, ']':']':xs, tokens) = tokenize' (EatString, xs, (TextChunk ""):tokens)
-- Otherwise if we've got stuff to consume append it
tokenize' (EatString, x:xs, (TextChunk t):tokens) = tokenize'(EatString, xs, (TextChunk (t++[x])):tokens)
tokenize' (EatAnchor, x:xs, (Identifier t):tokens) = tokenize'(EatAnchor, xs, (Identifier (t++[x])):tokens)
--If we've got nothing more to consume we're done.
tokenize' (EatString, [], tokens) = (EatString, [], tokens)
--We'll only get here if we're given an invalid string
tokenize' xx = error ("Error parsing .. so far " ++ (show xx))
これは実際にトークン化していないので、解析しています。そして、すべてのあなたの解析ニーズのために、Parsec。 –
@CatPlusPlusは、その解析で一致するテキストとタイトルを更新することに同意しました。 –
@CatPlusPlus parsecを使ってどのように見えるか教えてください。私は私の好みに少し不明瞭なドキュメント/ tutesを見つけています。 –