int と float を決定する scala コンビネーター パーサー (具体的には JavaTokenParsers 経由の RegexParsers) を取得する際に問題が発生しました。この特定の問題についての言及がどこにも見つからないように見えるので、ここで本当に基本的な何かが欠けているに違いありません。問題のパーサー コードを含む仕様を含めました (もちろん、インクルードは除きます)。
@RunWith(classOf[JUnitRunner])
class SandboxSpec extends FlatSpec with ShouldMatchersForJUnit {
sealed trait PropertyValue
case class IntValue(value: Int) extends PropertyValue
case class RealValue(value: Float) extends PropertyValue
class Parser extends JavaTokenParsers {
def propertyLiteral : Parser[PropertyValue] = intValue | realValue
def realValue = floatingPointNumber ^^ {
s => RealValue(s.toFloat)
}
def intValue = wholeNumber ^^ {
s => IntValue(s.toInt)
}
}
"A java token parser" should "parse a float" in {
val p = new Parser()
val result = p.parseAll(p.propertyLiteral, "5.4") match {
case p.Success(x, _) => x
case p.NoSuccess(msg, _) => fail(msg)
}
result should be(RealValue(5.4f))
}
}
これは、次のエラー メッセージで失敗します。
string matching regex `\z' expected but `.' found
このスレッドに基づいて考えた 1 つ、wholeNumber の後に a を配置しまし<~ not(not('.'))
たが、これで問題が解決したようには見えませんでした。