8

考慮語法這部分:如何使用Scala Parser Combinator更改代碼以將運算符優先級考慮在內?

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 

是否需要重寫它的部分來創建新的規則,或者是有隻是一個方法(如||||的第一對最長的規則匹配)我目前缺少哪些必要的東西?

+1

您的具體問題是什麼? – ziggystar

回答

5

運算符優先級是規則寫入方式的自然結果。例如,在該語法中,SimpleExpression由加法,減法和邏輯或由term組成,並且term由乘法,除法,模數和邏輯和組成,factor

所以,如果你有這樣的:

1 + 2 * 3 

你會得到下面的背部(粗略地講,爲了清晰起見):

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

如果你有這樣的:

1 * 2 + 3 

你會回來(粗略地說):

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

由於rep1sep - 分隔符被丟棄,您將失去添加運算符。