2014-10-24 2 views
0

목록 [문자열]과 여러 개의 파서를 사용하여 목록의 각 문자열을 파서에 일치 시키려고합니다. 그러면 다음과 같이 보일 것입니다 (경고, 의사 코드) :여러 조합 파서 결과와 일치하는 스칼라 패턴

myStringList.map{ 
    case MyParser.keyword => keyword match { 
    case KeywordParser.keyword1 => //it's special keyword1 
    case KeywordParser.keyword2 => //special treatment for keyword2 
    case NotSpecial => //it's a usual command 
    } 
    case MyParser.stringValue => //etc... 
} 

왜 그렇게하고 싶습니까?

"문자열"과 $ (키워드)가 포함 된 간단한 스크립트 행을 구문 분석합니다. 일부 키워드는 특별하며 별도로 취급해야합니다. 현재 특수 키워드가 하나 뿐이므로 체인 된 parseAll 및 match를 사용하고 있지만 맞지 않습니다.

그래서 어떻게 할 수 있습니까?

답변

0

베팅 나는 다음날 아침에 일어나서 실현 때문에, 내 뇌의 단락을했다 두 개의 파서, 일부 사례 클래스 및 한 쌍의 패턴 일치기를 포함합니다. 그래서 내 문제에 대한 해결책은 다음과 같습니다 (의사 코드) :

case class SpecialKeyword1(value: String) 
case class SpecialKeyword2(value: String) 
... 
case class SpecialKeywordN(value: String) 
case class SimpleKeyword(value: String) 

object MyParser extends JavaTokenParsers{ 
    def expression: Parser[Any] = ... 
    def keyword1: Parser[SpecialKeyword1] = ... 
    def keyword2: ... 
    ... 
    def simplekeyword: Parser[SimpleKeyword] = ... 
} 

object Main { 
    def parseScript(inputScript: String): String = { 
    MyParser.parseAll(MyParser.expression, inputScript) match { 
     case Success(result, _) => { 
     case SpecialKeyword1(val) => ... 
     case SpecialKeyword2(val) => ... 
     ... 
     case SimpleKeyword(val) => ... 
     case str: String => ... 
     } 
     case Failure(_, _) => "Parsing Failure" 
     case Error(_, _) => "Parsing Error" 
    } 
    } 
} 
0

정말 지원되지 않습니다,하지만 당신이 이런 식으로 작업을 수행 할 수 있습니다 내가 필요가 있음을,

val parseKeyword: PartialFunction[String, ... ] { 
    case KeywordParser.keyword1 => //it's special keyword1 
    case KeywordParser.keyword2 => //special treatment for keyword2 
    case NotSpecial => //it's a usual command  
    } 

    myStringList.map{ 
    case [email protected] if parseKeyword.isDefinedAt(x) => parseKeyword(x) 
    case MyParser.stringValue => //etc... 
    }