Dire che voglio analizzare un file in lingua X. Davvero, mi interessa solo una piccola parte delle informazioni all'interno. È abbastanza facile scrivere un parser in uno dei numerosi eDSL di Haskell a tale scopo (ad esempio Megaparsec).Esiste un modo stabilito per scrivere parser in grado di ricostruire il loro input esatto?
data Foo = Foo Int -- the information I'm after.
parseFoo :: Parsec Text Foo
parseFoo = ...
Che prontamente dà origine a una funzione getFoo :: Text -> Maybe Foo
.
Ma ora mi piace anche per modificare la fonte delle informazioni Foo
, cioè fondamentalmente voglio implementare
changeFoo :: (Foo -> Foo) -> Text -> Text
con le proprietà
changeFoo id ≡ id
getFoo . changeFoo f ≡ fmap f . getFoo
E 'possibile farlo con cambiare il risultato del parser in qualcosa come un obiettivo
parseFoo :: Parsec Text (Foo, Foo -> Text)
parseFoo = ...
ma ciò rende la definizione molto più ingombrante – Non riesco a ignorare più informazioni irrilevanti, ma è necessario memorizzare la corrispondenza di ogni string
subparse e rimontarla manualmente.
Questo potrebbe essere un po 'automatizzato mantenendo la stringa-riassemblare in un livello StateT
attorno alla monade del parser, ma non potrei semplicemente usare i parser primitivi esistenti.
Esiste una soluzione esistente per questo problema?
Analisi librerie generalmente costruire un "Abstract Syntax Tree", che lascia fuori tutta la formattazione. Quello che stai cercando è un "Concrete Syntax Tree". Non conosco alcuna libreria che costruisca questo. – sapanoia