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
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)'. –