StreamカスタムタイプでParsecを使用しています。このストリームは本質的にはそうですStringが、文字列内で見つかった入力を他の文字列に展開することがあります (エイリアス展開を考えてください)。たとえば、「§4.1 ¶3」が与えられた場合、「セクション 4.1 パラグラフ 3」をパーサーにフィードする可能性があります。
私はこれをすべて機能させています。私のタイプは次のようになります。
data DealiasingStream = ...
instance (Monad m) => Stream DealiasingStream m Char where ...
type ShellParser = Parsec DealiasingStream ()
の従属型DealiasingStreamは だけであることに注意してくださいChar。これにより、パーサーShellParserがすべての標準文字パーサーを使用できるようになります。
私の質問は、私のストリームへの元の入力に関する位置を Parsec に報告させることです。のドキュメントにStreamは次のように書かれています:
Streamインスタンスは、ストリーム状態で「ストリーム内の位置」を維持する責任がありますs。自明でない方法でモナドを使用していない限り、これは自明です。
実際、私のストリーム タイプは、いつでもレポートしたい位置を認識しています... しかし、Parsec にそれを使用させる方法がわかりません! SourcePosParsecは、内部の一部として独自のものを維持しているようStateです。そして、これはさまざまなtokenプリムによって更新されるようです。したがって、標準のCharパーサーでは、私の制御が及ばないのです。
これをどのように行うべきですか?