我已经掌握了这种语法,可以为中缀运算符构建左关联树:
term * (
"+" ^^^ { (a:Expr, b:Expr) => new FunctionCall(plus, a::b::Nil) } |
"-" ^^^ { (a:Expr, b:Expr) => new FunctionCall(minus, a::b::Nil) } )
虽然我不得不承认我并不完全明白它是如何运作的。我现在要做的是为类似
的语法实现类似的效果a[b](c)(d)[e]
应解析为
sub(call(call(sub(a, b), c), d), e)
可以扩展高级“^^^”魔法以涵盖不是纯中缀运算符的情况吗?或者我自己必须实现某种折叠左逻辑?如果是这样,任何暗示它可能是什么样的?
答案 0 :(得分:0)
我已经解决了以下问题。我很满意这个解决方案,但如果有任何Scala专家可以帮助我改进它,那是非常受欢迎的。
def subscript: Parser[Expr => Expr] = {
"[" ~> expr <~ "]" ^^ {
case sub => {
{ (base: Expr) => new FunctionCall(subscriptFn, base :: sub :: Nil)}
}
}
}
def argumentList: Parser[Expr => Expr] = {
"(" ~> repsep(expr, ",") <~ ")" ^^ {
case args => {
{ (base: Expr) => new FunctionCall(base :: args)}
}
}
}
def postfixExpr: Parser[Expr] = {
primary ~ rep ( subscript | argumentList ) ^^ {
case base ~ suffixes => {
(base /: suffixes)((b:Expr, f:Expr=>Expr) => f(b))
}
}
}