Создание тестов для парсера комбинаторов II в Scala - PullRequest
0 голосов
/ 23 сентября 2019

Рассмотрим этот исходный код, который реализует синтаксический анализатор для языка терминов в 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)
    }
  }

}

К сожалению, случаи успеха и сбоя не распознаются, даже если яmix-in StandardTokenParsers как в ссылке выше.Как я могу заставить его работать?

1 Ответ

1 голос
/ 23 сентября 2019

Вам нужно Arithmetic.Success и Arithmetic.Failure, как и у вас Arithmetic.lexical.Scanner.Кроме того, вы могли бы import Arithmetic._.

...