Парсек списки Haskell

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

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

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

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

  • First item, First level
    • First item, Second level
    • Second item, Second level
  • Second item, First level

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

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

Какие-либо идеи? Рекурсия может быть больше чем двумя уровнями.
Спасибо!

1
задан user3335966 14 April 2019 в 17:44
поделиться

1 ответ

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

Теперь проанализируйте (список 1) "foo" "* a \ n ** a 1 \ n ** a 2 \ n * b \ n ** b 1 \ n ** b 2 \ n " вернет то, что вы просили.

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

2
ответ дан 3 September 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: