2010-10-21 12 views
6

Dil, bir ölçekleme birleştiricisi ayrıştırıcısı için dilbilgisine uymadığında bir istisna atmak istiyorum. o biter çünkü parçası, bunlar kazara Bu geçerli değil buScala kombinasyon çözümleyici ile anlamlı mesajlar içeren istisnaları nasıl ekleyebilirim?

a, b, c, d, 

gibi bir dize olun ("" sütun)

def record: Parser[Record] = "-" ~ opt(recordLabel) ~ repsep(column, ",") ^^ { 
    case "-" ~ label ~ columns => new Record(label, columns) 
} 

en repsep içinde diyelim: Burada bir kural bir örnek orada olmayacağını varsayan bir ",". ParseAll() işlevini çağırdığınızda ayrıştırıcıyı durdurabilmekten ziyade, bu adımı insan tarafından okunabilir hale getiren anlamlı bir istisna nasıl yaparsınız? (Vb Özel metin, satır numarası,)

DÜZENLEME: Tamam, bir şey buldum ama customizability var olan ben memnun değilim:

def loadFrom(filename: String) { 
    val source = 
     Source.fromFile(filename).getLines.mkString("\n") 
    val parseResult = parseAll(tables, source) 
    if(!parseResult.successful) { 
     throw new TestDataParseException(parseResult.toString) 
    } 
} 

toString iyi bir mesaj yazdırır, ancak yazdırır Bunun yerine bir alan bulduğunda "\ z" gibi garip şeyler (bazen IDE'mde bir blok/kare gibi görünüyor). "Hey, sen bir virgül unuttun" demeyi tercih ederim.

Satır numaraları/sütunları [x.y] biçiminde yazdırılır. Aslında [Line: x, Column: y] 'i göstermek isterim çünkü insanlar bunun ne kadar sezgisel olduğunu bilirler.

Teşekkür

cevap

7
parseAll(tables, source) match { 
    case Success(ast, _) => //do something 
    case NoSuccess(msg, next) => { 
     println("Failed at line %s, column %s: %s".format(
        next.pos.line, next.pos.column, msg)) 
    } 
} 
+0

Booya! Tam olarak öyle. Çok teşekkürler! – egervari

İlgili konular