1

使用 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))

它使用解析器 p 解析某些东西,并返回它的结果,以及它的左右位置作为offsets

alex(词法分析器生成器)例如处理保持绝对字符偏移、行号和列号的位置。我错过了秒差距的绝对字符偏移量。

4

2 回答 2

1

不,不可能在 Parsec 中获取当前字符串索引,因为 Parsec 不跟踪该索引。您可以ParsecT在状态单子上使用单子转换器并手动跟踪已解析的索引。

于 2012-05-06T20:22:39.457 回答
1

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

offset :: String -> SourcePos -> Maybe Location
offset source pos = elemIndex pos positions
  where positions = scanl updatePosChar firstPos source
        firstPos = initialPos (sourceName pos)
于 2013-02-28T00:08:07.987 回答