당신은 "파서. ^?"를 사용할 수 있습니다 연산자를 사용하여 중복 구문 분석 요소 그룹을 검사합니다.여기
def tokens = tokenA | tokenB | tokenC
def uniqueTokens = (tokens*) ^? (
{ case t if (t == t.removeDuplicates) => t },
{ "duplicate tokens found: " + _ })
는 임의의 순서로 네 코미디 중 하나를 입력 할 수 있습니다 예를하지만, 중복이 발생했을 경우 구문 분석하는 데 실패
package blevins.example
import scala.util.parsing.combinator._
case class Stooge(name: String)
object StoogesParser extends RegexParsers {
def moe = "Moe".r
def larry = "Larry".r
def curly = "Curly".r
def shemp = "Shemp".r
def stooge = (moe | larry | curly | shemp) ^^ { case s => Stooge(s) }
def certifiedStooge = stooge | """\w+""".r ^? (
{ case s: Stooge => s },
{ "not a stooge: " + _ })
def stooges = (certifiedStooge*) ^? (
{ case x if (x == x.removeDuplicates) => x.toSet },
{ "duplicate stooge in: " + _ })
def parse(s: String): String = {
parseAll(stooges, new scala.util.parsing.input.CharSequenceReader(s)) match {
case Success(r,_) => r.mkString(" ")
case Failure(r,_) => "failure: " + r
case Error(r,_) => "error: " + r
}
}
}
그리고 일부 사용 예 :
package blevins.example
object App extends Application {
def printParse(s: String): Unit = println(StoogesParser.parse(s))
printParse("Moe Shemp Larry")
printParse("Moe Shemp Shemp")
printParse("Curly Beyonce")
/* Output:
Stooge(Moe) Stooge(Shemp) Stooge(Larry)
failure: duplicate stooge in: List(Stooge(Moe), Stooge(Shemp), Stooge(Shemp))
failure: not a stooge: Beyonce
*/
}
이 경우 각 토큰은 json 스타일의 개체 속성입니다. 따라서 명령은 "todo message : 데이터베이스에 Todo 클래스를 연결"due : next tuesday와 같이 보일 수 있습니다. 따라서 스칼라 스타일로 정의 된 일반 규칙은 "token = alphanum ~ ':'~ repsep (alphanum, '')과 유사합니다. 하지만 특정 속성을 다르게 처리해야합니다. –
그리고 같은 것을 두 번 이상 나오지 않도록해야합니까? – ziggystar
그 계획이 맞습니다. 일부 속성은 선택 사항이며 한 번만 발생해야합니다. –