2010-04-05 7 views
8

Giả sử tôi có một ngôn ngữ mơ hồ được thể hiện trong trình phân tích cú pháp kết hợp. Có cách nào để làm cho một số biểu thức tham lam cục bộ? Đây là một ví dụ về ý tôi.Scala: Tôi có thể di chuyển một trình phân tích cú pháp để tham lam cục bộ không?

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))) 
    } 
} 

Sau khi biên dịch, tôi có thể chạy nó như sau:

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

Tôi muốn bằng cách nào đó hướng dẫn phần đầu của obj là tham lam địa phương và phù hợp với longchain. Nếu tôi đổi thứ tự, nó khớp với số longchain, nhưng đó không phải vì sự tham lam.

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

Khái niệm "tham lam" chỉ áp dụng cho việc đóng cửa ('rep' hoặc postifx' * 'điều hành) và ngữ pháp của bạn đó là chỉ áp dụng cho các phần sau '(chuỗi dài | shortchain)' hoặc '(shortchain | longchain)'. –

Trả lời

13

Sử dụng |||:

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)) 
+0

Cảm ơn câu trả lời của bạn! –