2012-12-08 15 views
6

Jestem nowy w Scali i próbowałem użyć jej doskonałej biblioteki parsera kombinator. Próbowałem dostać ten kod do kompilacji:Dopasowywanie wzorców na sukcesach parserów w Scali

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) 
} 
... 

ale wciąż otrzymuję te błędy:

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) 

Próbowałem wiele różnych rzeczy, takich jak:

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

i

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

i

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

Ale nie mogę tego zmusić do skompilowania. Jestem pewien, że prawdopodobnie brakuje czegoś oczywistego, ale byłem na tym przez jakiś czas, a Google nie ma na to dobrych przykładów.

Dzięki!

Odpowiedz

12

Należy podać pełną ścieżkę dla ParseResult, która obejmuje instancję Parsers. Na przykład:

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) 
} 

Należy pamiętać, że można również importować te, jeśli chcesz trochę więcej wygody składniowej:

import parser.{ Error, Failure, Success } 

Teraz oryginalna wersja będzie działać zgodnie z oczekiwaniami.

+1

Ah Widzę teraz. Sukces/Niepowodzenie/Błąd będzie członkiem instancji Parserów. Dzięki! –

Powiązane problemy