1

次の単純な Scala パーサーがあります。

object MainTest extends JavaTokenParsers {
  def line: Parser[String] = "A"
  def main(args: Array[String]): Unit = {
    println(parseAll(line, """AB""".stripMargin))
  }
}

これで 1 行 (この場合は "AB") を処理し、その行が "A" (または指定した他のパターン) と等しくない場合はエラーを返します。

残念ながら、これは失敗します:

[1.2] failure: string matching regex `\z' expected but `B' found

AB
 ^

問題は、行末に到達していなくても 'A' が一致することです。入力を行に分割すると、行全体が一致するかどうかのいずれかになるように、すべての「AB」行でパーサーが失敗するようにしたいと考えています。

出来ますか?

4

1 に答える 1

1

あなたのパーサーは動作します。結果をprintlnに送信する代わりに、結果をキャッチするだけです。'A' は一致しますが、'B' は一致しません ('\z'='入力の終わり' が予期されるため)。これにより、一致全体が失敗します。

import scala.util.parsing.combinator.JavaTokenParsers

object MainTest extends JavaTokenParsers {
  def line: Parser[String] = "A"                     
  def main: Unit = {
    val result = parseAll(line, """AB""".stripMargin)
    if(result.successful) println("OK")
    else println("NOT ok")
  }                                           
}

ノート:

def line = "A*B"「A*B」のみに一致

def line = "A*B".r'A' の後に 'B' が続く n>=0 回の繰り返しの正規表現です。

于 2014-02-15T15:05:43.923 に答える