2010-04-24 134 views
1

我使用Text.ParserCombinators.Parsec和Text.XHtml解析输入并获取HTML输出。Parsec Haskell列表

如果我输入的是:

 
    * 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) }

任何想法? 递归可以超过两个级别

谢谢!

回答

2
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"将返回你所要求的。

但请注意,嵌套列表本身应该在里面,因为这是有效的xhtml。

+0

谢谢!但当我做 'parse(list 1)“foo”“* a \ n ** a 1 \ n ** a 2 \ n * b \ n ** b 1 \ n ** b 2 \ n”' 返回

  • 一个
  • * 1
  • * 2
  • b
    • b 1个
    • B 2
Martin 2010-04-24 18:27:09

+0

@马丁:呸,你说得对。我在测试时没有仔细阅读输出。 – sepp2k 2010-04-24 18:31:39

+0

你能帮我改进输出吗? 谢谢! – Martin 2010-04-24 18:36:53