4

我正在开发一个使用 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
  }
}
4

1 回答 1

3

确实,不是很讨人喜欢。但是,以下方法不起作用吗?

// 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
于 2011-06-27T00:33:24.553 回答