代码之家  ›  专栏  ›  技术社区  ›  LudvigH

行模式的Parsec开始?

  •  3
  • LudvigH  · 技术社区  · 8 年前

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

    GHCi中的一个尝试是

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

    Parsec中最惯用的“行的开始”解析是什么?

    2 回复  |  直到 8 年前
        1
  •  2
  •   castletheperson    8 年前

    您可以使用 getPosition sourceColumn 为了找出解析器当前正在查看的列号。列编号为 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 "=="
    
        2
  •  1
  •   Shersh    8 年前

    也许你可以用 many (char '\n') char '\n' 线路起点 确保标题前只有零行或多行空行 == my header ==