内部にコメントのあるテキストを表すデータ構造があるとします。このように、文字列attoparsecの条件付き先読み
"Text, {-comment-}, and something else"
コメントチャンクのためとE
ため
T "Text, " (C "comment" (T ", and something else" E))
パーサとして符号化することができように
data TWC
= T Text TWC -- text
| C Text TWC -- comment
| E -- end
deriving Show
は非常に簡単です:
twcP :: Parser TWC
twcP = eP <|> cP <|> tP
cP :: Parser TWC
cP = do
_ <- string "{-"
c <- manyTill anyChar (string "-}")
rest <- cP <|> tP <|> eP
return (C (pack c) rest)
eP :: Parser TWC
eP = do
endOfInput
return E
実装します
tP :: Parser TWC
tP = do
t <- many1 anyChar
rest <- cP <|> eP
return (T (pack t) rest)
はそれが
> parseOnly twcP "text{-comment-}"
Right (T "text{-comment-}" E)
it ∷ Either String TWC
、その貪欲な性質のテキストとしてコメント欄を消費させるように些細な方法で、テキストチャンクのためのパーサをINGのことだから、質問がされるまでの解析のロジックを表現する方法です入力の終了またはコメントセクションまで?つまり、条件付き先読みパーサーを実装する方法は?私が最初に少しにあなたのコードをリファクタリングしたい、という取り組む前に
tP = do
t <- many1 anyChar
: