如何在单独的类中测试fastparse解析器?

问题描述 投票:0回答:1

我正在写一个解析器,比如,

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 implicit scala-3 fastparse given
1个回答
0
投票

尝试使用 Scala 2 语法

fastparse.parse("1234", implicit p => parseAll(MyParser.int(p)))

https://scastie.scala-lang.org/DmytroMitin/MrFZ0EhiSPeFDHd1IyBhrA

(我会尝试用 Scala 3 语法找到这样的问题)

© www.soinside.com 2019 - 2024. All rights reserved.