Parsec开始行模式?

时间:2017-09-14 18:22:00

标签: haskell mediawiki parsec

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

GHCi的一次尝试是

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

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

什么是最惯用的&#34;行的开头&#34;在Parsec解析?

2 个答案:

答案 0 :(得分:2)

您可以使用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 "=="

答案 1 :(得分:1)

您可以使用many (char '\n')代替char '\n'。在解析器组合器中,没有行开始的意义,因为它们总是在输入开始时运行。您唯一能做的就是手动检查输入可以从哪个符号开始。使用many (char '\n')可确保标题== my header ==之前只有零个或多个空行。