【问题标题】:Unit Test a Scala Lexer对 Scala Lexer 进行单元测试
【发布时间】:2011-09-22 18:30:07
【问题描述】:

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

【问题讨论】:

  • 为什么辅助方法应该存在于 MyLexer 类中?

标签: unit-testing parsing scala parser-combinators


【解决方案1】:

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

// 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

【讨论】:

  • 流的想法很有趣,但是在流上调用.toList 并不会终止。任何想法为什么?
  • @HRJ 它显然没有收到任何.atEnd 为真的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2011-02-28
  • 2013-05-23
  • 2015-10-25
  • 2012-01-08
  • 2012-05-14
  • 2023-03-21
相关资源
最近更新 更多