【发布时间】:2023-04-08 13:30:01
【问题描述】:
假设有一个数据结构表示内部带有 cmets 的文本。
data TWC
= T Text TWC -- text
| C Text TWC -- comment
| E -- end
deriving Show
这样的字符串像
"Text, {-comment-}, and something else"
可以编码为
T "Text, " (C "comment" (T ", and something else" E))
注释块和E 的解析器非常简单:
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)
由于其贪婪的性质,使其将 cmets 部分作为文本使用
> parseOnly twcP "text{-comment-}"
Right (T "text{-comment-}" E)
it ∷ Either String TWC
那么,问题是如何表达直到输入结束或直到评论部分的解析逻辑?也就是说,如何实现条件前瞻解析器?
【问题讨论】:
标签: haskell attoparsec