2010-10-13 4 views
5

Üzgünüz - BenParsec'te isteğe bağlı ayrıştırıcıdan nasıl değer alınır? Bir acemi sorun buysa

Exp tarafından tanımlanan bir şey ayrıştırmak istiyor :: = Mandatory_Part Optional_Part0 Optional_Part1

Ben bunu yapabileceğimi düşündüm:

proc::Parser String 

proc = do { 

    ;str<-parserMandatoryPart 

    ;str0<-optional(parserOptionalPart0) --(1) 

    ;str1<-optional(parserOptionalPart1) --(2) 

    ;return str++str0++str1 

} 

İstiyorum İsteğe bağlı parçalar varsa str0/str1 olsun, aksi halde str0/str1 "" olacaktır. Ancak (1) ve (2), isteğe bağlı() parametresinden sonuç çıkarmaya izin vermediğinden çalışmaz, bu durumda, parserOptionalPart0/parserOptionalPart1.

Şimdi uygun yolu nasıl olurdu?

Çok teşekkürler!

Billy R

cevap

6

aradığınız işlevi optionMaybe olduğunu. Çözümleyici başarısız olursa Nothing değerini döndürür ve giriş tüketirse içeriği Just içinde döndürür. the docs itibaren

+1

Teşekkürler Paul. Bu benim için çalıştı. –

+1

Sadece çalışır. X7D – dmvianna

4

:

option x p ayrıştırıcı p uygulamak çalışır. p, girdi tüketmeden başarısız olursa, x değerini döndürür, aksi halde p tarafından döndürülen değer.

Yani yapabilirsiniz:

proc :: Parser String 
proc = do 
    str <- parserMandatoryPart 
    str0 <- option "" parserOptionalPart0 
    str1 <- option "" parserOptionalPart1 
    return (str++str0++str1) 

"girdi tüketmeden" kısmına dikkat edin. try ile isteğe bağlı ayrıştırıcıları ya da her ikisini de sarmanız gerekebilir.

Kod stilinizi daha standart olacak şekilde ayarladım ve son satırda bir hatayı düzelttim. return bir anahtar kelime değildir; Bu sıradan bir işlev. Yani return a ++ b, (return a) ++ b, yani neredeyse hiçbir zaman istediğin gibi değildir.

+0

Keegan, cevabım ve kodumu düzeltdiğiniz için teşekkürler. Çoğunlukla istediğim gibi çalıştı - orijinal yazılarda anlatılmayan vakalarla ilgili bazı sorunlar var. Hem Haskell hem de Parsec için yeniyim, daha fazla okuyacağım ve deneyeceğim. Teşekkürler. –

İlgili konular