Parsec Haskell Lists - PullRequest
       5

Parsec Haskell Lists

1 голос
/ 24 апреля 2010

Я использую Text.ParserCombinators.Parsec и Text.XHtml для анализа ввода и получения вывода HTML.

Если мой ввод:

    * First item, First level
    ** First item, Second level
    ** Second item, Second level
    * Second item, First level

Мой вывод должен быть:

<ul><li>First item, First level <ul><li>First item, Second level </li><li>Second item, Second level </li></ul></li><li>Second item, First level</li></ul>

Я написал это, но, очевидно, не работает рекурсивно

list = do{ s <- many1 item;return (olist << s) }
item = do{ 
    (count 1 (char '*'))
    ;s <- manyTill anyChar newline
    ;return ( li <<  s)
  }

Есть идеи? Рекурсия может быть более двух уровней.
Спасибо!

1 Ответ

2 голосов
/ 24 апреля 2010
list n = do first <- item n
            rest <- many $ try $ try (list (n+1)) <|> item n
            return $ ulist << (first : rest)

item n = do count n (char '*')
            s <- manyTill anyChar newline
            return $ li << s

Теперь parse (list 1) "foo" "* a\n** a 1\n** a 2\n* b\n** b 1\n** b 2\n" вернет то, что вы просили.

Обратите внимание, что вложенные списки должны быть внутри li, чтобы это был действительный xhtml.

...