Scala解析左关联下标运算符

时间:2013-05-15 08:33:47

标签: scala parser-combinators

我已经掌握了这种语法,可以为中缀运算符构建左关联树:

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)

可以扩展高级“^^^”魔法以涵盖不是纯中缀运算符的情况吗?或者我自己必须实现某种折叠左逻辑?如果是这样,任何暗示它可能是什么样的?

1 个答案:

答案 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))
      }
    }
  }