Ale*_*eal 6 parsing scala pattern-matching
我是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)
}
...
Run Code Online (Sandbox Code Playgroud)
但我不断收到这些错误:
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)
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的东西,比如:
case Parsers#Success(r, n) => println(r)
Run Code Online (Sandbox Code Playgroud)
和
case Parsers.Success(r, n) => println(r)
Run Code Online (Sandbox Code Playgroud)
和
import scala.util.parsing.combinator.Parsers.Success
Run Code Online (Sandbox Code Playgroud)
但我似乎无法将其编译.我确信可能有一些明显的东西我不见了,但我已经有一段时间了,谷歌似乎没有任何好的例子.
谢谢!
Tra*_*own 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)
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您想要一些额外的语法便利,您也可以导入它们:
import parser.{ Error, Failure, Success }
Run Code Online (Sandbox Code Playgroud)
现在您的原始版本将按预期工作.