gpt4 book ai didi

haskell - 秒差距行开始模式?

转载 作者:行者123 更新时间:2023-12-02 12:18:06 26 4
gpt4 key购买 nike

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

GHCi 的一次尝试是

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

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

秒差距中最惯用的“行起始”解析是什么?

最佳答案

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

没有用于此目的的内置组合器,但您可以轻松实现:

import Text.Parsec
import Control.Monad (guard)

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

现在您可以将 header 解析器编写为:

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com