パラメータ付き前置演算子
いつもの、文法をうだうだ考えるってのをやってたのを日記に書いてなかったので書いてみます。
C言語風の構文を式として構文解析しようってしてるわけですが
if(a)b; else c;
みたいな文法はif(a)をパラメータ付きの前置演算子とすると、式を取る、if,for,while等が出来ます。
パラメータ付き前置演算子ってのは自分が考えた演算子なのですが、、、。
例えば、ifが単項演算子であれば、if aと書いて、ifは aの前に結合されます。
それだと、演算子の結合だけでC言語のif(a)b; else c;を表現しきれませんので、
if(a)までが後ろに1つの式を取る演算子のようなものとして、aは場合によって変わるパラメータとすれば、
うまく行きます。コレは前置子のようなのだけど、パラメータを含むのでパラメータ付き前置演算子と呼ぶことにしたわけです。
さて、このパラメータ付き前置演算子を導入してif elseを表現しようとすると、
;を2項演算子かつ後置演算子としておくとうまくパースできません。
短文を許すとなると;は後置演算子とだけ定義すればうまく行きました。
だからまぁ、C言語のセミコロンはターミネータという意味合いが強いです。Cだとターミネータだけど。
そうすると、[a;b;c]みたいなのが、[(a;)(b;)(c)]という感じで構文解析されます。
これが、気に食わんというかなんというかです。
セミコロンは在ってもなくてもいいけど、2項演算子があった場合につながらないようにできます。
これを導入するとXtalの文法をうまくパースできなかったのが、パース出来るようになって嬉しかったりします。
function(a)a+b;
とか書けるので。ただ、try catch finallyあたりが、怪しいです。
try{a}というパラメータ付き演算子を定義したとして、catchを後ろに1つはつけられるけど、2つ以上無理になってしまうからです。
try{a}catch(e){}// これはつながる try{a}catch(e:Exception){}catch(e2:Error){}// これはつながらない
try a; catch (e:Exception){} catch (e2:Error){}
はまぁ、うまく行くけどなんか、うつくしくない。tryは只のキーワードでってのがいいのかなぁ。
ここだけ、括弧必要ってどうなのかなぁとか思うのでした。
catchを2パラメータ付き演算子とかっていうのにするとか。もはやわけわかりません。
実は、try&catch,finnalyって美しくないんじゃないかとか思ったりします。
try{ }else{ catch(e:Exception){} catch(e2:Error){} finally(e:Exception){} }
とかってなると嬉しいような、悲しいような。
ocamlはどうか?
try raise Not_found with Not_found -> "Not_found" | _ -> "Other Exception";;
haskellは?
f = catch g (\e -> if IO.isEOFError e then return [] else ioError e)
さてはて、、、。