我正在尝试使用Parsec解析mediawiki文本。 MediaWiki标记中的某些构造只能出现在行的开头(例如标头标记==header level 2==)。在regexp中,我将使用锚点(例如^)来查找行的开头。

GHCi的一种尝试是

Prelude Text.Parsec> parse (char '\n' *> string "==" *> many1 letter <* string "==") "" "\n==hej=="
Right "hej"


但这不太好,因为它将在文件的第一行失败。我觉得这应该是一个已解决的问题...

在Parsec中最惯用的“行首”解析是什么?

最佳答案

您可以使用getPositionsourceColumn来找出解析器当前正在查看的列号。如果当前位置在行的开头(例如在输入的开头或在1\n字符之后),则列号将为\r

没有内置的组合器,但是您可以轻松实现:

import Text.Parsec
import Control.Monad (guard)

startOfLine :: Monad m => ParsecT s u m ()
startOfLine = do
    pos <- getPosition
    guard (sourceColumn pos == 1)


现在,您可以将标头解析器编写为:

header = startOfLine *> string "==" *> many1 letter <* string "=="

关于haskell - Parsec行开始模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46225920/

10-11 14:30