Haskell Parse与Parsec的段落和em元素

时间:2010-04-25 01:32:59

标签: parsing haskell html-parsing parsec

我正在使用Text.ParserCombinators.ParsecText.XHtml来解析这样的输入:

this is the beginning of the paragraph --this is an emphasized text-- and this is the end\n

我的输出应该是:

<p>this is the beginning of the paragraph <em>this is an emphasized text</em> and this is the end\n</p>

此代码解析并返回强调元素


em = do{ 
      ;count 2 (char '-') ;
      ;s <- manyTill anyChar (count 2 (char '-')) 
      ;return  (emphasize  << s)
     }

但我不知道如何使用强调项目来获取段落

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个黑客,但我认为它符合你的要求:

list = (:[])
text = many (try em <|> (anyChar >>= return . list)) 
       >>= return . ("<p>"++) . (++"</p>") . concat

(每个非强调字符都以其自己的字符串形式返回。)


以下是它的工作原理:

在每个字符处,首先尝试解析em。这从两个破折号开始。由于em在使用单个短划线后可能会失败,例如在“a-b”中,您需要在其前面添加try。如果在输入的其余部分中不允许使用破折号,则不需要尝试,但可能不是这种情况。否则,消耗anyChar。但这是Char类型,而不是String,所以它必须包含在列表中。

这将返回一个单字符字符串列表,其中强调部分是交错的。但是您需要一个由p标记包围的字符串,因此您首先concat,然后将开始/结束标记添加到开头/结尾。然后你返回那个值。

可能有一种方法可以重写整个解析器,以便在看到两个破折号之前消耗输入而不是anyChar。但是我不知道如何把它写在我的头顶,所以你得到这个黑客,这可能效率低很多。