Scala词法分析器的单元测试

4
我正在使用Scala解析器组合编写一个解释器。我的解释器将词法分析和语法分析分为两个阶段。我想为我的词法分析器编写单元测试,以确保它能够生成正确的输出。
目前,我正在使用下面的帮助方法进行单元测试。该方法将程序源代码作为参数,并返回Token对象的列表。使用单元测试框架(ScalaTest),我可以对生成的Token列表进行模式匹配。
当前方法存在的问题:
  1. 它需要在我的词法分析器中使用帮助方法来辅助单元测试
  2. 它使用了while循环
  3. 它采用手动构造并使用Scanner的方式
似乎应该有更好的方法将程序的源代码转换为Token列表。
我的当前工作版本(至少是相关部分):
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
  }
}

为什么辅助方法应该存在于MyLexer类中? - paradigmatic
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

流(Stream)的概念很有趣,但在流上调用.toList不会终止。有什么想法为什么会这样? - HRJ
@HRJ 显然它没有接收到任何.atEnd为真的东西。 - Daniel C. Sobral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接