Parsing 将C位置解析为偏移量

Parsing 将C位置解析为偏移量,parsing,haskell,parsec,Parsing,Haskell,Parsec,使用Parsec可以很容易地将位置作为偏移量(作为输入开头的字符)获取吗?如果是,怎么做?在内部,Parsec将该位置保持为具有源名称、行和列的数据类型 我希望能够编写一个类似 pWithPos p = do left <- getPosition -- gets the current position as an offset x <- p right <- getPosition --

使用Parsec可以很容易地将位置作为偏移量(作为输入开头的字符)获取吗?如果是,怎么做?在内部,Parsec将该位置保持为具有源名称、行和列的数据类型

我希望能够编写一个类似

pWithPos p = do left <- getPosition       -- gets the current position as an offset
                x <- p
                right <- getPosition       -- gets the current position as an offset
                return (x,(left,right))

pWithPos p=do leftNo,无法在Parsec中获取当前字符串索引,因为Parsec不跟踪该索引。您可以在状态monad上使用
ParsecT
monad转换器,并手动跟踪解析的索引。

您可以使用此函数计算偏移量,给定输入字符串和SourcePos:

offset :: String -> SourcePos -> Maybe Location
offset source pos = elemIndex pos positions
  where positions = scanl updatePosChar firstPos source
        firstPos = initialPos (sourceName pos)

抵消什么?parsec已经告诉您从0的行偏移量和从0的列偏移量。是否希望从文件开头开始偏移字符?@DonStewart我希望从输入开始偏移字符。这有多困难?我想有些原语必须重新定义,对吗?这将是非常困难的;你必须基本上重新定义每一个原语,以及所有依赖于这些原语的东西。没有一个“解析器状态类型类”具有可以替换的函数。我建议您根据字符串索引信息重新定义逻辑。您需要这些信息做什么?例如,您可以创建一个函数,将
(行、列)
和输入字符串转换为索引。如果您愿意,我可以向您展示如何构造该函数。我正在阅读硕士论文《子表达式的一般选择》,其中出现了在文本编辑器中保留标记偏移位置的问题。作者已经找到了一种使用parsec获取标记偏移量的方法,但我想用一种更优雅的方式来解决这个问题。一个函数接收输入字符串和(行、列)位置并得到相应的绝对偏移量位置似乎很容易:只需通过计算新行数来找到每行开头的偏移量,并添加列。我将试着写它。这实际上是完整输入大小的O(n),还是我遗漏了一些使运行更有效的东西?我会担心在解析器中以任何规则调用它。由于updatePosChar的工作方式,这看起来也会将选项卡计算为介于1(或0?)和8之间的一些通常不可预测的值:(