Здравствуйте, Odissey_, Вы писали:
Исходя из здравого смысла и того, что я не знаю Haskell — как-то так
Для работы нужен Parsec, хотя возможно Hutton's парсер тоже пойдет (сможет без try?)
type Tag = String
data Node = Node Tag [Node]
| Text String
deriving(Show,Eq)
parseTag = do { char '<'
; tag <- many1 lower
; char '>'
; return tag
}
tagLikeThis tag = do{ char '<'
; string tag
; char '>'
; return tag
}
parseText = do { txt <- many lower
; return $ Text txt
}
parseTagNode = try ( do { x <- parseText
; tag <- parseTag
; node <- parseTagNode
; tagLikeThis tag
; y <- parseText
; return $ Node ("<"++tag++">") [x,y,node]
} )
<|> parseText
------------------------------------------------------------------
*Main> run parseTagNode "eee<aa>fff<bb>uuu<dd><dd><bb>ee<aa>ss"
Node "<aa>" [Text "eee",Text "ss",Node "<bb>" [Text "fff",Text "ee",Node "<dd>" [Text "uuu",Text "",Text ""]]]