在 Scala 中为解析器组合器 II 创建测试
Create tests for parser combinators II in Scala
考虑 this 在 Scala 中为术语语言实现解析器的源代码。旨在测试其功能的主要功能定义为:
def main(args: Array[String]): Unit = {
val stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in))
val tokens = new lexical.Scanner(stdin.readLine())
phrase(term)(tokens) match {
case Success(trees, _) =>
for (t <- path(trees))
println(t)
try {
print("Big step: ")
println(eval(trees))
} catch {
case TermIsStuck(t) => println("Stuck term: " + t)
}
case e =>
println(e)
}
}
我写了下面的测试:
package fos
import org.scalatest.FunSuite
class ArithmeticTest extends FunSuite {
test("testTerm") {
Arithmetic.term(new Arithmetic.lexical.Scanner("if iszero pred pred 2 then if iszero 0 then true else false else false")) match {
case Success(res,next) => assert(res == If(IsZero(Pred(Pred(Succ(Succ(Zero))))),If(IsZero(Zero),True,False),False))
case Failure(msg,next) => assert(false)
}
}
}
不幸的是,即使我像上面的 link 那样混入 StandardTokenParsers
,也无法识别成功和失败的情况。我怎样才能让它工作?
您需要 Arithmetic.Success
和 Arithmetic.Failure
,就像您拥有 Arithmetic.lexical.Scanner
一样。或者,您可以 import Arithmetic._
.
考虑 this 在 Scala 中为术语语言实现解析器的源代码。旨在测试其功能的主要功能定义为:
def main(args: Array[String]): Unit = {
val stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in))
val tokens = new lexical.Scanner(stdin.readLine())
phrase(term)(tokens) match {
case Success(trees, _) =>
for (t <- path(trees))
println(t)
try {
print("Big step: ")
println(eval(trees))
} catch {
case TermIsStuck(t) => println("Stuck term: " + t)
}
case e =>
println(e)
}
}
我写了下面的测试:
package fos
import org.scalatest.FunSuite
class ArithmeticTest extends FunSuite {
test("testTerm") {
Arithmetic.term(new Arithmetic.lexical.Scanner("if iszero pred pred 2 then if iszero 0 then true else false else false")) match {
case Success(res,next) => assert(res == If(IsZero(Pred(Pred(Succ(Succ(Zero))))),If(IsZero(Zero),True,False),False))
case Failure(msg,next) => assert(false)
}
}
}
不幸的是,即使我像上面的 link 那样混入 StandardTokenParsers
,也无法识别成功和失败的情况。我怎样才能让它工作?
您需要 Arithmetic.Success
和 Arithmetic.Failure
,就像您拥有 Arithmetic.lexical.Scanner
一样。或者,您可以 import Arithmetic._
.