Bazı özel türlerde ayrıştırma hatası almak mümkün mü? Örneğin, hatadan ayrıştırma hakkında daha fazla bilgi almak güzel olurdu. Ve sadece kısa mesaj biçiminde hata bilgisine sahip olmak çok kolay değil gibi görünüyor. Rhymoid gözlemlediği gibiParsec ve özel ayrıştırma hatası türü
cevap
, maalesef, doğrudan mümkün değildir.
de yardımcı olmayacaktır kendi Either
benzeri monad ile Parsec
birleştiren - bu olacak (üzerinde EitherT
) çok yakında (Either
üzerinde) ya da çok geç çıkın.
Eğer çok kötü istiyorsanız, bunu şu şekilde yapabilirsiniz: State (SourcePos, YourErrorType)
üzerinden kullanın. Geçerli konumu ile devlet içinde kayıt, yapılandırılmış bir hata değerini yayarlar istiyorum
Her zaman (Sonra hata geri gittikleri edilecektir çünkü. parsekten kullanıcı durumunu kullanamazsınız), ancak sadece eğer Mevcut konum zaten kayıtlı olandan daha uzakta. (Konumlar eşitse, hataları bir şekilde birleştirmek isteyebilirsiniz. Belki bunların bir listesini saklayabilirsiniz.)
Son olarak, monad kümenizi çalıştırdığınızda, son durumu ve bir ParseError
içeren bir ParseError
verilir. SourcePos
. Sadece iki noktanın çakıştığını kontrol edin. Yapmazlarsa (yani Parsec'in SourcePos
daha uzak), bu hata için bir hata değeriniz yoktur.
Bu mümkün görünmüyor. ['Text.Parsec.Error'] (http://hackage.haskell.org/packages/archive/parsec/3.1.1/doc/html/Text-Parsec-Error.html) her türlü hatayı ima ediyor gibi görünüyor. tepki, sonuçta bir 'String' ve hatta [ '(>)'] (http://hackage.haskell.org/packages/archive/parsec/3.1.1/doc/html/Text-Parsec-Prim.html olduğu #v: -60--63--62-) operatör yalnızca dizeleri alır. –
Sadece dikkat: Hata çıkışı "sadece bir metin mesajı" değildir. Bir kaynak konum ve ayrıştırıcının bir sonraki görmek için ne beklediği hakkında bazı bilgiler içerir. Ama evet, bazen daha fazla almak güzel olurdu ... – MathematicalOrchid