Я написал следующий синтаксический анализатор с целью fail
-ing по пробелам:
import scala.util.parsing.combinator._
object Foo extends JavaTokenParsers {
val wsTest = not(whiteSpace) // uses whitespace inherited from `RegexParsers`
}
Почему парсинг кучи пробелов успешен?
scala> Foo.parseAll(Foo.wsTest, " ")
res5: Foo.ParseResult[Unit] = [1.11] parsed: ()
scala> res5.successful
res6: Boolean = true
Глядя на Parsers#not
из проекта, я ожидал Failure
для моего вышеприведенного теста.
/** Wrap a parser so that its failures and errors become success and
* vice versa -- it never consumes any input.
*/
def not[T](p: => Parser[T]): Parser[Unit] = Parser { in =>
p(in) match {
case Success(_, _) => Failure("Expected failure", in)
case _ => Success((), in)
}
}
not
работает правильно. Я предполагаю, что синтаксический анализатор по умолчанию пропускает пробелы, и вы должны отключить это. Возможно, это поможет: stackoverflow.com/questions/ 3564094/ - person Kigyo   schedule 01.09.2014My guess is that the parser skips white spaces by default
— я наблюдал такое поведение с классом, расширяющимJavaTokenParsers
. Однако я не ожидал, чтоFoo.parseAll(Foo.wsTest, " ")
преуспеет. - person Kevin Meredith   schedule 01.09.2014