2

我已经掌握了为中缀运算符构建左关联树的语法:

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)

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

4

1 回答 1

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))
      }
    }
  }
于 2013-05-16T07:32:09.670 回答