4

私はScalaパーサーコンビネーターを使用して書かれたインタープリターに取り組んでいます。私の通訳者は、字句解析と構文解析を2つのフェーズに分けています。レクサーの単体テストを作成して、正しい出力が生成されることを確認したいと思います。

現在、私はヘルパーメソッドメソッドを使用してユニットテストを行っています。これは以下に含まれています。このメソッドは、プログラムのソースコードをパラメーターとして受け取り、トークンオブジェクトのリストを返します。単体テストフレームワーク(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 に答える