2013-05-15 3 views
2

내가 중위 사업자 왼쪽 연관 트리를 구축하기위한 구문을 지배했습니다스칼라는 왼쪽 연관 구문 분석 첨자 연산자

term * (
     "+" ^^^ { (a:Expr, b:Expr) => new FunctionCall(plus, a::b::Nil) } | 
     "-" ^^^ { (a:Expr, b:Expr) => new FunctionCall(minus, a::b::Nil) }) 

나는 완전히 어떻게 작동하는지 이해하지 고백해야하지만. 내가 지금하고 싶은

sub(call(call(sub(a, b), c), d), e) 

이 높은 수준 "^^^"마법으로 확장 할 수있는 구문 분석해야

a[b](c)(d)[e] 

처럼 보일 수 있습니다 구문 비슷한 효과를 달성하는 것입니다 순수 중위 연산자가 아닌 경우를 포함합니까? 또는 어떤 종류의 fold-left 로직을 직접 구현해야합니까? 그렇다면 어떤 모습 일지에 대한 암시가 있습니까?

답변

0

다음과 같이이 문제를 해결했습니다. 솔루션에 만족하지만, 스칼라 전문가가 문제를 개선하는 데 도움을 줄 수 있다면 매우 환영합니다.

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)) 
     } 
    } 
    } 
관련 문제