2013-05-31 3 views
0

재사용 및 가독성을 이유로 정규 표현식 정의를 분리해야하는 복잡한 텍스트를 구문 분석하는 동안이 일반 구조의 스칼라 코드 (pn - 정규식 패턴 , vn 변수는) 새로운 패턴 때문에 자리 표시 자들 (dummyn)에서 유용 일치 (vn)의 분리의 삽입해야하기파서 결합 자의 세련되지 않은 구조 반복

val cp1 = p1 ~ p2 ~ p3 ~ p4 ~ p5 ~ p6 ^^ 
      case { dummy1 ~ v2 ~ dummy3 ~ v4 ~ dummy5 ~ v6 => ACaseClass(v2, v4, v6) } 

명백한 문제는 가독성과 코드의 유지 보수성이다.

그래서 의도를 표현하는 더 좋은 방법이 있습니까? dummyn마다 대신 _을 사용할 수 있습니까?

SNOBOL 언어에서는 일치 결과를 변수에 할당하는 (pat . var) 또는 (pat $ var)을 쓸 수 있습니다. 마찬가지로, 최신 정규식 구문에서 우리는 캡쳐 그룹 (?P<name>pat)을 명명했습니다. 일치 캡처 변수를 패턴에 가깝게 유지하려는 의도가 분명합니다.

val cp1 = p1 ~ (p2 $$ v2) ~ p3 ~ (p4 $$ v4) ~ p5 ~ (p6 $$ v6) $=> 
      ACaseClass(v2, v4, v6) 

가 분명히 나는 ​​새로운 사업자 $$이 간단한 구문을 사용 $=> 일종의 가정입니다 :

그럼, 내가 쓰고 싶습니다의 일반 라인을 따라 뭔가입니다.

아마도 매크로가 도움이 될 수는 있지만, 현재 내 능력을 넘어서는 것입니다. 모든 입력 환영!

답변

2

_을 사용하지 않은 이유는 무엇입니까? 그것이 효과가 있다는 것이 밝혀졌습니다. 또한 ~><~을 사용하여 패턴의 일부를 버릴 수 있지만 내부 부품을 버리려면 괄호를 사용해야합니다.

object SimpleScala extends JavaTokenParsers { 

    def test = "(" ~> wholeNumber ~ ("," ~> wholeNumber <~ ",") ~ wholeNumber <~ ")" ^^ 
    { case i1 ~ i2 ~ i3 => (i1,i2,i3) } 

    def test2 = "(" ~ wholeNumber ~ "," ~ wholeNumber ~ ")" ^^ 
    { case _ ~ i1 ~ _ ~i2 ~ _ => (i1,i2) } 

    def main(args: Array[String]){ 
    println(parseAll(test,"(42,34,5)")) 
    println(parseAll(test2,"(42,345)")) 
    } 
} 
관련 문제