, почему комбинатор parsecs «выбор», похоже, застрял на первом выборе?

Посмотрев образец кода CSV в Real World Haskell, я попытался создать небольшой синтаксический анализатор XML. Но ошибка закрытия тегов с "неожиданным" / " 'ошибки. Можете ли вы сказать мне, почему мой парсер "closeTag" не работает (или, возможно, никогда не вызывается)? Спасибо!

import Text.ParserCombinators.Parsec

xmlFile = manyTill line eof
line = manyTill tag eol
eol = char '\n'

word = many1 (noneOf "></")

tag = choice [openTag, closeTag, nullTag, word]

nullTag = between (char '<') (string "/>") word
closeTag = between (string "</") (char '>') word
openTag = between (char '<') (char '>')  tagContent
attrval = between (char '"') (char '"') word

atts = do {
        (char ' ')
        ; sepBy attr (char ' ')
}

attr = do {
                word
                ; char '='
                ; attrval
        }

tagContent = do {
                w <- word
                ; option []  atts
                ; return w
        }

parseXML :: String -> Either ParseError [[String]]
parseXML input = parse xmlFile "(unknown)" input

main =
    do c <- getContents
       case parse xmlFile "(stdin)" c of
            Left e -> do putStrLn "Error parsing input:"
                         print e
            Right r -> mapM_ print r
7
задан Guy Coder 15 December 2013 в 14:20
поделиться