Простое сопоставление stringLiteral не удается при использовании JavaTokenParsers в Scala - PullRequest
0 голосов
/ 27 июля 2011

Я только начал работать над внешним 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

Есть идеи, что я сделал не так? Я в основном следовал за книгой Дина Вамплера (http://ofps.oreilly.com/titles/9780596155957/DomainSpecificLanguages.html).

1 Ответ

2 голосов
/ 27 июля 2011

A stringLiteral выглядит примерно так:

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

Если вы объявите ввод, как показано ниже, он должен работать:

val input = "\"ABC\""

Опять же, ошибка в правильном случае:

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

должно было быть написано

    r should be === """"(ABC)""""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...