1

2 つの Int といくつかの要素と末尾の入力を解析しようとしました。

import scala.util.parsing.combinator.JavaTokenParsers

class X extends JavaTokenParsers {
  lazy val elems = elem("wrong elem", "#WB-" contains _)
  lazy val lists = repsep(rep(elems), ",")
  lazy val p1 = int ~ int ~ lists
  lazy val p2 = int ~ int ~ (whiteSpace ~> lists)

  def go[A](p: Parser[A]) = parseAll(p, "1 2   WB#,---,BBB") match {
    case NoSuccess(msg, _) => sys.error(msg)
    case _ =>
  }

  lazy val int: Parser[Int] =
    wholeNumber ^^ {
      try _.toInt catch {
        case e: NumberFormatException => sys.error("invalid number")
      }
    }
}

メソッド に入力例を示しますgo。Int と末尾の要素は、スペースで区切る必要があります。ただし、これは Int に対してのみ機能し、要素に対しては機能しません。入力すると

val x = new X
x go x.p1

次のエラーが表示されます。

java.lang.RuntimeException: string matching regex `\z' expected but `W' found

しかし、私が入力すると

x go x.p1

私は得る:

java.lang.RuntimeException: string matching regex `\s+' expected but `W' found

最後に、私はParser[Int ~ Int ~ List[List[Char]]]. 前に空白を挿入しても機能しないのはなぜelemですか? そして、どうすればこのコードを機能させることができますか?

4

1 に答える 1

2

elems を RegEx Parser に置き換えるだけです:

import scala.util.parsing.combinator.JavaTokenParsers

class X extends JavaTokenParsers {

lazy val elems = "[#WB-]".r
lazy val lists = repsep(rep(elems), ",")
lazy val p1 = int ~ int ~ lists

def go[A](p: Parser[A]) = parseAll(p, "1 2   WB#,---,BBB") match {
case NoSuccess(msg, _) => sys.error(msg)
case _ =>
}

lazy val int: Parser[Int] =
wholeNumber ^^ {
try _.toInt catch {
    case e: NumberFormatException => sys.error("invalid number")
  }
}
}

今は役に立たないので、p2を削除しました

于 2012-03-23T10:18:58.183 に答える