2パスパーサを作成しています。最初にテキストを(Alex
を使用して)スキャンし、それらのトークンを解析します(Parsec
を使用)。私が良いエラーメッセージを書くことができるように、私はトークンに位置情報を追加しようとするまで、うまくいった。スキャニングトークンがパーサーを複雑にする場合の位置のトラッキング
もともと私が持っていた:私は、各Token
コンストラクタにPosition
要素を追加したり、data TokenWithPosition = T Token Position
のような新しいタイプを作成することができますいずれかのような
data Token = TAtom | TString String | TInt Integer | TFloat [...]
それはそうです。
私は後者のパスを開始しましたが、現在、私はParsecのトークンを記述したいときにTokenWithPosition
を作成しなければならないか、または毎回TokenWithPosition
をアンラップする必要があります比較をする。要するに、私のきれいな文法は、位置情報を無視するために必要なコードでオーバーランされています。
私の質問:2番目のパスでパーサを複雑にすることなく位置情報を追跡するきれいな方法がありますか?これは標準的な解決策を持つようなものです。