2013-05-16 14 views
10

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ü

+1

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. –

+0

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

cevap

8

, 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.