Модульный тест Scala Lexer - PullRequest
4 голосов
/ 26 июня 2011

Я работаю над интерпретатором, написанным с использованием комбинаторов анализатора Scala.Мой интерпретатор разделяет лексирование и синтаксический анализ на две фазы.Я хотел бы написать модульные тесты для моего лексера, чтобы убедиться, что он выдает правильный вывод.

В данный момент я занимаюсь модульным тестированием методом вспомогательного метода, который я включил ниже.Метод принимает исходный код программы в качестве параметра и возвращает список объектов Token.Используя инфраструктуру модульного тестирования (ScalaTest), я могу затем сопоставить шаблон с полученным списком токенов.

Проблемы с текущим методом:

  1. Требуется вспомогательный метод внутри моеголексер просто для помощи модульному тестированию
  2. Используется цикл while
  3. Он прибегает к ручному построению и использованию сканера

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

Моя текущая рабочая версия (по крайней мере, соответствующие части):

class MyLexer extends StdLexical {
  def lex(input:String): List[Token] = {
    var scanner = new Scanner(input)
    val result = new mutable.ListBuffer[Token]()
    while (!scanner.atEnd) {
      result.append(scanner.first)
      scanner = scanner.rest
    }
    return result.toList
  }
}

1 Ответ

3 голосов
/ 27 июня 2011

Действительно, это не очень приятно.Тем не менее, не будет ли следующая работа?

// From the unit test
val lexer = new MyLexer
val scanner = new lexer.Scanner(input)
val result = Stream.iterate(scanner)(_.rest).takeWhile(!_.atEnd).map(_.first) // .toList optional
...