我正在研究一个简单的表达式解析器,但是鉴于下面的解析器组合器声明,我似乎无法通过我的测试并且右关联树不断弹出。
def EXPR:Parser[E] = FACTOR ~ rep(SUM|MINUS) ^^ {case a~b => (a /: b)((acc,f) => f(acc))}
def SUM:Parser[E => E] = "+" ~ EXPR ^^ {case "+" ~ b => Sum(_, b)}
def MINUS:Parser[E => E] = "-" ~ EXPR ^^ {case "-" ~ b => Diff(_, b)}
我一直在为此调试几个小时。我希望有人能帮我弄清楚它不正确。
"5-4-3" 将产生一个计算结果为 4 而不是预期的 -2 的树。
上面的语法有什么问题?