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

是否有必要重写它的一部分来创建新规则,或者是否只有一种方法(比如|vs. |||for first vs.longest rule matching)我目前缺少哪个做必要的事情?

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 回答