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を使用して何かを解析し、その結果と、その左右の位置をオフセットとして返します。

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 に答える