可以通过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中缺少绝对字符偏移量。
答案 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)