Parsec定位为抵消

时间:2012-05-06 20:08:12

标签: parsing haskell parsec

可以通过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解析一些内容,并返回其结果,以及偏移的左右位置。

alex(词法分析器生成器)例如处理positions保持绝对字符偏移,行号和列号。我在parsec中缺少绝对字符偏移量。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

给定输入字符串和SourcePos:

,您可以使用此函数计算偏移量
offset :: String -> SourcePos -> Maybe Location
offset source pos = elemIndex pos positions
  where positions = scanl updatePosChar firstPos source
        firstPos = initialPos (sourceName pos)