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 にそれを使用させる方法がわかりません! SourcePos
Parsecは、内部の一部として独自のものを維持しているようState
です。そして、これはさまざまなtoken
プリムによって更新されるようです。したがって、標準のChar
パーサーでは、私の制御が及ばないのです。
これをどのように行うべきですか?