[英]Haskell Parse Paragraph and em element with Parsec
我正在使用Text.ParserCombinators.Parsec和Text.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.