考虑这部分语法:
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
是否有必要重写部分内容以创建新规则,或者只有一种方法(如|
与|||
进行第一次与最长规则匹配)我目前缺少哪个做必要的事情吗?
答案 0 :(得分:5)
运算符优先级是编写规则的自然结果。例如,在这个语法中,SimpleExpression
由加法,减法和逻辑 - 或term
组成,而term
由乘法,除法,模数和逻辑 - 和{组成}组成。 {1}}。
所以如果你有这个:
factor
你会得到以下回报(粗略地说,为了清楚起见):
1 + 2 * 3
如果你有这个:
List(1, (2 ~ List(* ~ 3)))
你会得到这个(粗略地说):
1 * 2 + 3
由于List((1 ~ List(* ~ 2)), 3)
,您丢失了加法运算符 - 分隔符将被丢弃。