1

我有以下简单的 Scala 解析器:

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

我希望它处理一行(在本例中为“AB”)并在该行不等于“A”(或我给出的任何其他模式)时返回错误。

不幸的是,这失败了:

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

AB
 ^

问题是即使未到达行尾,也匹配“A”。我想让所有'AB'行的解析器都失败,这样如果我将输入分成几行,整行要么匹配要么不匹配。

可能吗?

4

1 回答 1

1

你的解析器工作。您只需要捕获结果而不是将其发送到 println。'A' 匹配,但 'B' 不匹配(因为 '\z'='end of input' 是预期的),这使得整个匹配不成功。

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是 n>=0 重复 'A' 后跟 'B' 的正则表达式

于 2014-02-15T15:05:43.923 回答