开始学习Haskell时,我决定熟悉Parsec,但也存在一些问题。我正在尝试以FB2格式实现对书籍的解析。在传统的标签上(文本)是好的,但当标签内的标签-不工作。
import Text.ParserCombinators.Parsec
data FB2Doc = Node String FB2Doc
| InnText String
deriving (Eq,Show)
parseFB2 :: GenParser Char st [FB2Doc]
parseFB2 = many test
test :: GenParser Char st FB2Doc
test = do name <- nodeStart
value <- getvalue
nodeEnd
return $ Node name value
nodeStart = do char '<'
name <- many (letter <|> digit <|> oneOf "-_")
char '>'
return name
nodeEnd = do string "</"
many (letter <|> digit)
char '>'
spaces
gettext = do x <- many (letter <|> digit <|> oneOf "-_")
return $ InnText x
getvalue = do (nodeStart >> test) <|> gettext <|> return (Node "" (InnText ""))
main = do
print $ parse parseFB2 "" "<h1><a2>ge</a2></h1> <genre>history_russia</genre>"发布于 2011-10-10 20:43:45
我想你想要的是:
getvalue = try test <|> gettext空节点需要try:"<bla></bla>"。test将使用</bla>的'<',try允许回溯。
https://stackoverflow.com/questions/7705885
复制相似问题