フォームの文字列の解析は、Value[,Value]+
を介して簡単に実行できますrep1sep(Value, ',')
。値パーサーが繰り返しで以前に解析された値に依存している場合に、rep1sep機能を実現する方法はありますか?たとえば、各値が一意である必要があるという要件を適用しますか?
依存パーサーの標準的な手法はflatMapですが、それを機能させるのに問題があります。そのような試みの1つを次に示します。
def Values(soFar: Set[Value]): Parser[Set[Value]] =
Value(soFar) flatMap { v => (',' ~> Values(soFar + v)).?.map { _ getOrElse soFar } }
def Value(soFar: Set[Value]): Parser[Value] =
Num+ flatMap { v => if (soFar.contains(v)) failure("%d already appears".format(v)) else success(v) }
Seq[A]
一般的に、パーサー引数がからParser[A]
:までの関数であるrep1sepの形式が必要です。
def rep1sepDependent(rep: Seq[A] => Parser[A], sep: Parser[Any]): Seq[A] = ???
注:ここではユースケースに疑問があり、一意性の検証は解析後に適切に処理されることを理解しています。タブ補完の目的でSBTパーサーコンビネーターを使用しているときにこの問題が発生しました。具体的には、ユーザーがまだ入力していないキーのみのキーと値のペアの補完オプションを提示したいと思います。完全な例とビルド可能なSBTプロジェクトについては、このパーサーを参照してください。