私はスカラ座でのパーサコンビネータを理解しようとしていて、次のことを書かれている:この単純なregex-parserをブール式をキャッチする方法を教えてください。
import scala.util.parsing.combinator._
class SimpleParser extends RegexParsers {
def operand: Parser[String] = "[A-Za-z]+".r ^^ {_.toString}
def operator: Parser[String] = "OR|AND".r ^^ {_.toString}
def term: Parser[String] = (("(" ~> (operand ~ operator ~ operand) <~ ")")) ^^ {
case o1 ~ operator ~ o2 => o1 + " " + operator + " " + o2
case _ => " "
}
def expression: Parser[String] = (operand | term | (operand ~ operator ~ term))^^ {
case str:String => str
case operand ~ operator ~ term => operand + " " + operator + " " + term
}
}
object ParserTest extends SimpleParser{
def main(args: Array[String]): Unit = {
println(parseAll(expression, "A").get)
println(parseAll(expression, "(A OR C)").get)
println(parseAll(expression, "A AND (A OR C)").get)
}
}
最後のものが原因としながら、最初の二つのプリントの作品は、見つける:
Exception in thread "main" java.lang.RuntimeException: No result when parsing failed at scala.sys.package$.error(package.scala:27)
at scala.util.parsing.combinator.Parsers$NoSuccess.get(Parsers.scala:181)
at scala.util.parsing.combinator.Parsers$NoSuccess.get(Parsers.scala:167)
at ParserTest$.main(ParserTest.scala:31)
at ParserTest.main(ParserTest.scala)
私は最後の文を考えました"expression"の(operand〜operator〜term)パターンと一致します。誰かが私のパターンが間違っている理由を私に説明することができますか?
ありがとうございます。私はそれを問題として考えなかった。 – stian