【发布时间】:2023-03-19 14:21:01
【问题描述】:
开始学习Haskell,我决定熟悉Parsec,但是出现了问题。我正在尝试以 FB2 的格式实现对书籍的解析。对常规标签( text )是好的,但是当标签内的标签 - 不起作用。
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>"
【问题讨论】:
-
我还没有进行真正的一轮调试,但是
getvalue的nodeStart >> test子句看起来有点可疑:它有一个nodeStart与nodeEnd不匹配;它丢弃了已启动节点的名称;而且,由于test立即调用many,它永远不会返回一个空的节点列表。 -
@FUZxxl,OP 将其作为一种学习练习,而不是,我认为,作为实现生产质量 XML 解析器的一种方式。所以“使用一个为你做这件事的库”并不能真正实现这个目标。
-
您能否提供更多关于它如何不起作用的信息。一条错误消息,预期的输出,等等。这些事情有助于将我们的注意力引导到代码的重要部分。
-
@luqui 我删除了我的评论......你是对的。我忘记了。谢谢。