2013-04-19 4 views
10

2パスパーサを作成しています。最初にテキストを(Alexを使用して)スキャンし、それらのトークンを解析します(Parsecを使用)。私が良いエラーメッセージを書くことができるように、私はトークンに位置情報を追加しようとするまで、うまくいった。スキャニングトークンがパーサーを複雑にする場合の位置のトラッキング

もともと私が持っていた:私は、各TokenコンストラクタにPosition要素を追加したり、data TokenWithPosition = T Token Positionのような新しいタイプを作成することができますいずれかのような

data Token = TAtom | TString String | TInt Integer | TFloat [...] 

それはそうです。

私は後者のパスを開始しましたが、現在、私はParsecのトークンを記述したいときにTokenWithPositionを作成しなければならないか、または毎回TokenWithPositionをアンラップする必要があります比較をする。要するに、私のきれいな文法は、位置情報を無視するために必要なコードでオーバーランされています。

私の質問:2番目のパスでパーサを複雑にすることなく位置情報を追跡するきれいな方法がありますか?これは標準的な解決策を持つようなものです。

答えて

3

独自の「プリミティブパーサー」を実装するには、Text.Parsec.Prim(たとえば、tokenPrim)の関数を使用する必要があります。

これらのプリミティブパーサーは、Parsecの内部状態を位置情報で更新し、位置なしで純粋なTokenを返します。