2012-12-08 10 views
6

私はScalaを初めて使い、優れたコンビネータパーサライブラリを使用しようとしています。パターンマッチングでのパーサーの成功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) 
} 
... 

をしかし、私はこれらのエラーを得続ける:私はこのコードをコンパイルするために取得しようとしてきた

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 

しかし、私はこれをコンパイルすることはできません。おそらく、私が紛失していることが明らかになっていると確信していますが、私はしばらくそれをしており、Googleはこれの良い例はないようです。

ありがとうございます!

答えて

12

Parsersインスタンスを含むParseResultのフルパスを指定する必要があります。予想通り

import parser.{ Error, Failure, Success } 

今すぐあなたの元のバージョンは動作します:あなたは少し余分な構文の利便性をしたい場合は、また、これらをインポートすることができ

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

注:たとえば。

+1

ああ、私は今参照してください。成功/失敗/エラーは、パーサーのインスタンスのメンバーになります。ありがとう! –