3

を使用してレクサーとパーサーを作成しscala.util.parsing.combinators.Parsersました。私のプロダクションの少なくとも 1 つにバグがあります。

私が必要としているのは、パーサーが入力を任意のプロダクションと一致させるために行ったすべての試行のログです。インスタンス化されたときにすべての成功オブジェクトと失敗オブジェクトをログに記録するのは素晴らしいことです。残念ながら、これを行う唯一の方法は、ライブラリが提供する多くの基本クラスを拡張し、大規模なパーサーを書き直して新しいクラスを拡張することです。

このロギング動作を取得する簡単な方法はありますか?

4

1 に答える 1

2

コンビネータを使用してlog、文法のプロダクションをラップできます。の定義は次のParsers.scalaとおりです。

def log[T](p: => Parser[T])(name: String): Parser[T] = Parser{ in =>
  println("trying "+ name +" at "+ in)
  val r = p(in)
  println(name +" --> "+ r)
  r
}

successそれ以外の場合は、 andをオーバーライドできるはずだと思いますがfailure、どのプロダクションがそれらを呼び出したかわからないため、非常に有益ではありません。

于 2012-12-05T08:38:32.993 に答える