8

Hãy xem xét phần này của ngữ pháp:Làm thế nào để thay đổi mã bằng cách sử dụng Comalaators Scala Parser để có quyền ưu tiên của nhà điều hành?

def expression = SimpleExpression ~ opt(relation ~ SimpleExpression) 
    def relation = "=" | "#" | "<=" | "<" | ">=" | ">" | "IN" | "IS" 
    def SimpleExpression = opt("+" | "-") ~ rep1sep (term, AddOperator) 
    def AddOperator = "+" | "-" | "OR" 
    def term = factor ~ rep(MulOperator ~ factor) 
    def MulOperator = "*" | "/" | "DIV" | "MOD" | "&" 
    def factor: Parser[Any] = number | "(" ~ expression ~ ")" | "~" ~ factor 

Có cần phải viết lại các bộ phận của nó để tạo ra những quy định mới, hoặc là chỉ có một phương pháp (như | vs ||| cho vs phù hợp quy tắc dài nhất đầu tiên) Tôi 'hiện đang thiếu mà điều cần thiết?

+1

Vấn đề cụ thể của bạn là gì? – ziggystar

Trả lời

5

Ưu tiên toán tử là kết quả tự nhiên của các quy tắc được viết. Ví dụ, trong ngữ pháp này, SimpleExpression bao gồm phép cộng, trừ và lô-gic hoặc termterm bao gồm phép nhân, phép chia, mô-đun và lô-gic và của factor.

Vì vậy, nếu bạn có điều này:

1 + 2 * 3 

Bạn sẽ nhận được sau trở lại (khoảng nói, cho rõ ràng):

List(1, (2 ~ List(* ~ 3))) 

Và nếu bạn có điều này:

1 * 2 + 3 

Bạn sẽ nhận được thông báo này (nói gần):

List((1 ~ List(* ~ 2)), 3) 

Bạn mất các toán tử bổ sung vì rep1sep - dấu phân cách bị hủy.