言語でファイルを解析したいとします。X。本当に、私はその中の情報のほんの一部にしか関心がありません。その目的のためにHaskellの多くのeDSL(例えばMegaparsec)にパーサを書くのは簡単です。容易に機能getFoo :: Text -> Maybe Foo
を生じさせる正確な入力を再構築できるパーサーを作成する方法は確立されていますか?
data Foo = Foo Int -- the information I'm after.
parseFoo :: Parsec Text Foo
parseFoo = ...
。
しかし、今、私も同じように変更しますFoo
情報のソースは、つまりは基本的に私はそれをすることによってそれを行うことが可能です
changeFoo id ≡ id
getFoo . changeFoo f ≡ fmap f . getFoo
性質を持つ
changeFoo :: (Foo -> Foo) -> Text -> Text
を実装したいですパーサーの結果をレンズのようなものに変更する
parseFoo :: Parsec Text (Foo, Foo -> Text)
parseFoo = ...
しかし、定義がもっと煩雑になる–私はただ無関係の情報を光沢させることはできませんが、すべてのstring
サブパルスのマッチを保存し、手動で再構成する必要があります。
これは、文字列再構成をパーサーモナドの周囲にあるStateT
レイヤーに保つことによっていくらか自動化できますが、既存のプリミティブパーサーを使用することはできません。
この問題の既存の解決策はありますか?
は、一般的に「抽象構文木」を構築し、すべての書式設定が省略されます。あなたが探しているのは "具体的な構文木"です。私はこれを構築するライブラリを知らない。 – sapanoia