Как изменить код, используя Scala Parser Combinators, чтобы учесть приоритет оператора? - PullRequest
8 голосов
/ 03 июля 2011

Рассмотрим эту часть грамматики:

  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 Ответ

5 голосов
/ 03 июля 2011

Приоритет оператора является естественным результатом написания правил.Например, в этой грамматике SimpleExpression состоит из сложения, вычитания и логического или * из 1002 *, а term состоит из умножения, деления, модуля и логического и из factor.

Итак, если у вас есть это:

1 + 2 * 3

Вы получите обратно (грубо говоря, для ясности):

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

И если у вас есть это:

1 * 2 + 3

Вы получите это обратно (грубо говоря):

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

Вы потеряете операторы сложения из-за rep1sep - разделители отбрасываются.

...