2010-04-05 3 views
8

combinator 파서에서 모호한 언어가 있다고 가정합니다. 특정 표현을 지역적으로 탐욕스럽게 만드는 방법이 있습니까? 다음은 내가 말하는 의미의 예입니다. 다음과 같이스칼라 : 로컬로 욕심이 많을 수 있습니다.

import scala.util.parsing.combinator._ 

object Example extends JavaTokenParsers { 
    def obj: Parser[Any] = (shortchain | longchain) ~ anyrep 

    def longchain: Parser[Any] = zero~zero~one~one 
    def shortchain: Parser[Any] = zero~zero 

    def anyrep: Parser[Any] = rep(any) 
    def any: Parser[Any] = zero | one 
    def zero: Parser[Any] = "0" 
    def one: Parser[Any] = "1" 
    def main(args: Array[String]) { 
    println(parseAll(obj, args(0))) 
    } 
} 

컴파일 후, 나는 그것을 실행할 수 있습니다

$ scala Example 001111 
[1.7] parsed: ((0~0)~List(1, 1, 1, 1)) 

어떻게 든 longchain와 로컬 욕심과 일치 할 obj의 첫 부분을 지시하고 싶습니다. 주문을 전환하면 longchain과 일치하지만 이는 탐욕 때문이 아닙니다.

def obj: Parser[Any] = (longchain | shortchain) ~ anyrep 
+1

'(longchain | shortchain)'또는'(shortchain | longchain)'을 사용합니다. –

답변

13

사용 ||| :

object Example extends JavaTokenParsers { 
    def obj: Parser[Any] = (shortchain ||| longchain) ~ anyrep 

    def longchain: Parser[Any] = zero~zero~one~one 
    def shortchain: Parser[Any] = zero~zero 

    def anyrep: Parser[Any] = rep(any) 
    def any: Parser[Any] = zero | one 
    def zero: Parser[Any] = "0" 
    def one: Parser[Any] = "1" 
    def main(args: Array[String]) { 
    println(parseAll(obj, args(0))) 
    } 
} 

scala> Example.main(Array("001111")) 
[1.7] parsed: ((((0~0)~1)~1)~List(1, 1)) 
"탐욕"의 개념은 단지 다음 부분에 적용된 문법 폐쇄 (`rep` 또는 postifx`*`운영자)과에 적용
+0

답변 해 주셔서 감사합니다. –