2012-12-08 56 views
6

我是新來的Scala,並且一直在嘗試使用它出色的combinator解析器庫。我一直試圖讓這個代碼編譯:解析器模式匹配在斯卡拉成功

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

但我不斷收到這些錯誤:

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) 

我已經嘗試了很多不同的東西,如:

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

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

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

但我似乎無法得到這個編譯。我確定可能有些明顯的我錯過了,但我已經看了一段時間了,谷歌似乎沒有任何好的例子。

謝謝!

回答

12

您需要指定ParseResult的完整路徑,其中包括您的Parsers實例。例如:

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

請注意,您還可以,如果你需要一點額外的語法上的方便導入這些:

import parser.{ Error, Failure, Success } 

現在按照預期的原始版本將正常工作。

+1

啊我現在看到了。成功/失敗/錯誤將成爲解析器實例的成員。謝謝! –