Scalaでパーサーを作ってみる〜12:関数呼び出しのチェーン

Scalaの勉強をはじめたので、とりあえず簡単なパーサーを作ってみてます。
http://d.hatena.ne.jp/nowokay/20111109#1320815540


前回で関数リテラルまでできました。
http://d.hatena.ne.jp/nowokay/20111116#1321432559


ただ、

def high(x) ={y => x * y};

を呼び出すときに

high(3)(4)

などとするとエラーになっていたので、関数呼び出しのチェーンができるように構文を変えます。


funcCallのところをこう変えます。

  def funcCall: Parser[AST] = factor~rep("("~>repsep(expr, ",")<~")")^^{
    case fac~Nil => fac
    case fac~params =>{
        //関数
        var ret = fac
        for(param <- params){
          ret =  FuncCall(ret, param)
        }
        ret
    }
  }

この部分「(fac::params).reduceLeft(FuncCall(_,_))」のように書けるかと思ったけど、簡単には通らなかったのであとまわし(^^


処理とかは変わらず。
そうすると

println(high(3)(4))

が実行できるようになります。


そしたら、前回のforを

def forr(start, end)={proc =>
    def impl(i)={
      if(i < end + 1){
        proc(i);
        impl(i + 1)
      }else{
        0
      }
    };
    impl(start)
};

のように書けて

forr(2, 5)({ i=>
  println("forr:" + i);
});

と使えるようになるので、ちょっと構文っぽく書ける。
いい感じ。


ソースはこれ
https://gist.github.com/1345875/06d5586f21cad4c22c9ea9a2e34f91cf5f4996fd