2012-12-08 9 views
6

Sono nuovo in Scala e ho cercato di utilizzare la sua eccellente libreria di parser combinatori. Ho cercato di ottenere questo codice per compilare:Corrispondenza dei pattern su Parsers Success In Scala

import scala.util.parsing.combinator._ 
... 
val r:Parsers#ParseResult[Node] = parser.parseAll(parser.suite,reader) 
r match { 
    case Success(r, n) => println(r) 
    case Failure(msg, n) => println(msg) 
    case Error(msg, n) => println(msg) 
} 
... 

Ma continuo a ricevere questi errori: un sacco

TowelParser.scala:97: error: not found: value Success 
    case Success(r, n) => println(r) 
    ^
TowelParser.scala:98: error: not found: value Failure 
    case Failure(msg, n) => println(msg) 

TowelParser.scala:99: error: object Error is not a case class constructor, nor does it have an unapply/unapplySeq method 
    case Error(msg, n) => println(msg) 

che ho provato di cose diverse, come:

case Parsers#Success(r, n) => println(r) 

e

case Parsers.Success(r, n) => println(r) 

e

import scala.util.parsing.combinator.Parsers.Success 

Ma non riesco a ottenere questo da compilare. Sono sicuro che probabilmente c'è qualcosa di ovvio che mi manca, ma ci sono stato per un po ', e Google non sembra avere buoni esempi di questo.

Grazie!

risposta

12

È necessario specificare il percorso completo per ParseResult, che include l'istanza Parsers. Per esempio:

import scala.util.parsing.combinator._ 

object parser extends RegexParsers { def digits = "\\d+".r ^^ (_.toInt) } 

val res = parser.parseAll(parser.digits, "42") 

res match { 
    case parser.Success(r, n) => println(r) 
    case parser.Failure(msg, n) => println(msg) 
    case parser.Error(msg, n) => println(msg) 
} 

Nota che si potrebbe anche importare questi, se si vuole un po 'di convenienza sintattica in più:

import parser.{ Error, Failure, Success } 

Ora la versione originale funzionerà come previsto.

+1

Ah, ora vedo. Success/Failure/Error diventerà membro dell'istanza di Parser. Grazie! –

Problemi correlati