8

文法のこの部分を考えてみましょう:オペレータの優先順位を考慮してScala Parser Combinatorsを使用してコードを変更する方法はありますか?

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 

はそれが必要な新しいルールを作成するために、その一部を書き換えるか、それとも単に方法がある(のような最初の対最長のルールマッチングのための||||)I現在欠けているものは必要なものはありますか?

+1

具体的な問題は何ですか? – ziggystar

答えて

5

オペレータの優先順位は、ルールの書き方の自然な結果です。例えば、この文法では、SimpleExpressionは、加算、減算、および論理和で構成され、termであり、termは、乗算、除算、モジュラスおよび論理で構成され、factorです。

ですから、持っている場合は、この:

1 + 2 * 3 

あなたは得るでしょう(大体わかりやすくするために、スピーキング)バック次

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

をそして、あなたは、この持っている場合:

1 * 2 + 3 

あなたはこれを返します(おおよその表現):

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

セパレータは破棄され、rep1sepのために加算演算子が失われます。

関連する問題