Simple stringLiteral matching fails when using JavaTokenParsers in Scala
I've just started working on an external DSL, however I've run into an issue. I've written a very simple test, I use Scala 2.9.0-1 and 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, _) => Ri开发者_如何学JAVAght(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)
}
}
}
If I run it, it fails during parsing and returns:
Bad syntax: string matching regex `"([^"\p{Cntrl}\\]|\\[\\/bfnrt]|\\u[a-fA-F0-9]{4})*"' expected but `A' found
Any ideas what I did wrong? I basically followed Dean Wampler's book (http://ofps.oreilly.com/titles/9780596155957/DomainSpecificLanguages.html).
A stringLiteral
is something like this:
"I am a string literal because I'm between double quotes"
If you declare input like below, it should work:
val input = "\"ABC\""
Then again, there's an error in the right case:
r should be === """(ABC)""""
should have been written
r should be === """"(ABC)""""
精彩评论