【问题标题】:Haskell Parse Paragraph and em element with Parsec使用 Parsec 的 Haskell Parse Paragraph 和 em 元素
【发布时间】:2010-04-25 01:32:58
【问题描述】:

我正在使用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)
     }

但我不知道如何获得强调项目的段落

有什么想法吗?

谢谢!!

【问题讨论】:

  • 我理解正确吗?您想要包含字符流和强调项目的段落的 Parsec 术语?

标签: parsing haskell html-parsing parsec


【解决方案1】:

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

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

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


它是这样工作的:

在每个字符处,首先尝试解析em。这从两个破折号开始。由于em 在使用单个破折号后可能会失败,例如“a-b”,因此您需要为其添加前缀try。如果在其余输入中不允许使用破折号,则不需要尝试,但情况可能并非如此。否则,使用 anyChar。但这是Char 类型,而不是String,所以它必须被包装在一个列表中。

这将返回一个单字符串列表,其中强调部分交错。但是你想要一个被p 标签包围的字符串,所以你首先concat,然后将开始/结束标签添加到开始/结束。然后你返回那个值。

可能有一种方法可以重写整个解析器,以便在看到两个破折号之前使用输入而不是 anyChar。但我不知道怎么把它写下来,所以你得到了这个 hack,它的效率可能要低得多。

【讨论】:

  • 谢谢!但是当我尝试解析时,返回一个错误:未定义的变量“list”
  • 糟糕。那是我个人实用程序库的一部分,我忘记了。我添加了定义。
  • 谢谢 Nathan!,我仍然有获取

    元素的问题

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多