在Scala中使用JavaTokenParsers时,简单的stringLiteral匹配失败

时间:2011-07-27 17:03:43

标签: regex parsing scala parser-combinators

我刚刚开始研究外部DSL,但是我遇到了一个问题。我写了一个非常简单的测试,我使用Scala 2.9.0-1和scalatest 1.6.1:

class DSLTest extends FlatSpec with ShouldMatchers {

  object DSL extends JavaTokenParsers {

    def test = stringLiteral

    def apply(s: String): Either[String, String] = parseAll(test, s) match {
      case Success(tree, _) => Right(tree.toString)
      case NoSuccess(msg, _) => Left("Bad syntax: " + msg)
    }

  }

  "DSL" should "parse ABC" in {
    val input = "ABC"
    DSL(input) match {
      case Right(r) =>
        r should be === """(ABC)""""
      case Left(msg) =>
        fail(msg)
    }
  }

}

如果我运行它,它在解析期间失败并返回:

Bad syntax: string matching regex `"([^"\p{Cntrl}\\]|\\[\\/bfnrt]|\\u[a-fA-F0-9]{4})*"' expected but `A' found

任何想法我做错了什么?我基本上遵循了Dean Wampler的书(http://ofps.oreilly.com/titles/9780596155957/DomainSpecificLanguages.html)。

1 个答案:

答案 0 :(得分:2)

stringLiteral是这样的:

"I am a string literal because I'm between double quotes"

如果您声明如下所示的输入,它应该有效:

val input = "\"ABC\""

然后,在正确的情况下出现错误:

    r should be === """(ABC)""""

本应写的

    r should be === """"(ABC)""""