社内のDev会で発表しました

ちょっと前に、時間貰ったので、今作ってるコンパイラの話をしました。

最近はふと、flashのパーサの仕様を記述しておいて、パーサ自動生成だーっと思って、作りはじめて、優先順位地獄にはまって大変です。
普通のパーサのほうが楽なんじゃないかと思い始めてますけど、そうじゃなくて、この制限があるからいいんだっということで、
ちゃんと考えないと行けません。


やりたいことは山のようにあるんだけど、なかなか進まないんだけど、地道に進める今日この頃です。

で、何が困ったかというと、scalaのmatch構文っぽく

a match {
case a =>
case b =>
}

という構文をそのまま、演算子の優先順位だけで解決しようとするとどうも無理があるので困ってます。
絶対に式をかかないといけないってするか、

a match {
case a =>()
case b =>()
}

なかんじで、それとも、めんどくさ。
っていうことで、lispとかはやっぱめんどくさくなくていいなぁっと思う次第でした。
ではなくて、最終的にはガードとか入れて

a match {
case a if (a > 0) =>()
case b =>()
}

みたいなこともやりたい訳なのだけど、if文をこう書けるようにするには、そういう文法にしないといけないわけだけど、
そんなことは許されない訳なので、この辺をぐじぐじいじくり回していろいろ試してみて良さそうな構文を考えないと行けないんですけど、
どうしたものかなと思ってます。

ということで、考えてみました。非常に、幼稚臭くて恥ずかしいんですけど、

hoho match {
  case a if(a) {bbb }
  case a {         }
}

こんな感じなのだけど、

hoho match {
  case(A(a))[a <= 1]{
    a
  }
  case(A(a,b))[a < 1]{
    a
  }
}

無駄に括弧が多いと言われる

hoho match {
  case (a) if(a) {bbbbbbb}
  case (a) {bbbbb}
  case (a) bbbbbb; // ok
  case (a) bbbbbb; ccccc; // ng
  case (_) if(a) bbb // ok
}

caseは文演算子にする。これなんかいい名前考えないとな。
これで、ガードも書ける。これにする決定。