8

文法のこの部分を考えてみましょう:

  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

新しいルールを作成するためにその一部を書き直す必要がありますか、それとも必要なことを行う方法 (最初のルールと最長のルールの一致の対など|)|||が現在不足していますか?

4

1 に答える 1

5

演算子の優先順位は、ルールの記述方法の自然な結果です。たとえば、この文法では、aSimpleExpressionは加算、減算、論理和で構成されterm、atermは乗算、除算、モジュラス、論理和で構成されfactorます。

だからあなたがこれを持っているなら:

1 + 2 * 3

次の情報が返されます(大まかに言えば、わかりやすくするため)。

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

そして、あなたがこれを持っているなら:

1 * 2 + 3

あなたはこれを取り戻すでしょう(大まかに言えば):

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

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

于 2011-07-03T16:22:40.717 に答える