繁体   English   中英

Haskell用Parsec解析段落和em元素

[英]Haskell Parse Paragraph and em element with 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)
     }

但我不知道如何强调段落

有任何想法吗?

谢谢!!

这是一个hack,但是我认为它可以满足您的要求:

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

(每个非强调字符都作为其自己的字符串返回。)


运作方式如下:

在每个字符上,首先尝试解析em 这从两个破折号开始。 由于em在消耗了一个破折号之后可能会失败,例如“ ab”,因此您需要在try前面加上前缀。 如果在其余的输入中不允许使用破折号,则无需尝试,但事实并非如此。 否则,消耗anyChar。 但这是Char类型,而不是String类型,因此必须包装在列表中。

这将返回带有交错部分的单字符字符串列表。 但是您想要一个由p标签包围的单个字符串,因此您首先concat ,然后将start / end标签添加到开始/结束。 然后,您返回该值。

可能存在一种重写整个解析器的方法,以便您消耗输入,而不是anyChar,直到看到两个破折号。 但是我不确定如何从头顶上写下来,所以您得到了这种破解,效率可能低很多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM