我正在写一个解析器,比如,
object MyParser:
def int[$: P]: P[Int] = digit.rep(1).!.map(s => s.toInt)
def digit[$: P]: P[Unit] = CharIn("0-9")
现在我想在测试类中测试一下。但我希望能够单独测试每个解析器,所以即使在大解析器的上下文中,解析器不必匹配整个字符串,我想编写尝试的测试,所以部分匹配将会失败。
class MyParserTest extends AnyFunSuite with Matchers:
def parseAll[$: P, T](p: => P[T]): P[T] = Start ~ p ~ End
test("int parses correctly") {
fastparse.parse("1234", parseAll(MyParser.int)) shouldBe Success(1234, 4)
}
(参见Scastie中的代码)
这给出了错误
No given instance of type fastparse.ParsingRun[$] was found for an implicit parameter
of method int in object MyParser
where: $ is a type variable
只要我尝试,它就会消失
fastparse.parse("1234", MyParser.int)
我尝试在测试中导入
MyParser.given
,在 parseAll
而不是 MyParser
中定义 MyParserTest
,一般键盘都无济于事。
当我测试它们时,有没有办法将解析器包装在
Start
和 End
中,或者是否有一个隐式的地方我无法访问?
尝试使用 Scala 2 语法
fastparse.parse("1234", implicit p => parseAll(MyParser.int(p)))
https://scastie.scala-lang.org/DmytroMitin/MrFZ0EhiSPeFDHd1IyBhrA
(我会尝试用 Scala 3 语法找到这样的问题)