解析表單Value[,Value]+
的字符串可以通過rep1sep(Value, ',')
輕鬆完成。當值解析器依賴於重複中先前解析的值時,是否有辦法實現rep1sep功能?例如,強制要求每個值必須是唯一的?使用Scala/SBT解析器組合器重複依賴解析器
依賴分析器的標準技術是flatMap,但我無法正常工作。這裏有一個這樣的嘗試:
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) }
一般地,我需要rep1sep的形式,其中解析器的說法是從Seq[A]
到Parser[A]
功能:
def rep1sepDependent(rep: Seq[A] => Parser[A], sep: Parser[Any]): Seq[A] = ???
注:我知道的使用情況是有問題的在這裏和驗證唯一性在解析後更好地處理。在使用SBT解析組合器來實現製表符完成時,我遇到了這個問題 - 具體來說,我想僅爲那些用戶尚未輸入的鍵提供鍵/值對的完成選項。見this parser for a full example和可建立的SBT項目。
謝謝!我推廣到rep1sepDep,但我留下了我目前的實現有相同的選項卡完成問題。我現在想知道在使用flatMap時這是否是SBT完成支持中的一個怪癖。 – mpilquist
Scratch - 錯誤是由於在解析器的早期部分中過度接受生產。詳情請見:https://github.com/mpilquist/cjmx/commit/6f146c8c74fd45252e1fba6b665a4f9909565f79 – mpilquist
'scala.util.parsing'和SBT解析器是否兼容? –