- 「コンパイラ・スクリプトエンジン」相談室16
270 :261[sage]:2015/09/19(土) 12:48:32.00 ID:YlOPp2hb - >>268
今考えてる言語では、演算子の扱いが関数を引数の場所に関して一般化した第一級オブジェクトなので 前置引数の個数や後置引数の個数は実行してみるまで分からないので コンパイル時の識別子を用いた構文解析は無理です。 前置演算子と一引数関数が別物って変だと思ったのでそうしました。 c++風に書くと、こんな感じのが通るイメージです。 g = [](a,b){return a - b;}; if (複雑な式) { f = [](a|b,c){return a + b + c;}; // (a|b)で前置引数としてa、後置引数としてbと示すものとする。 } else { f = [](a,b|c){return a + b + c;}; } // gは2引数演算子、fは3引数演算子。 // ここではgの優先順位はfより低いものとする(c++での表現方法が無いので)。 // カッコやカンマを省いてある場合、上の条件のどちらが走っても構文上は受理される。 // 複雑な式の結果によって、これはg(1, f(2, 3, 4))及びg(f(1, 2, 3), 4)のどちらにもなりうる。 cout << (g 1 2 f 3 4) << endl; >>269 そういうわけで一度に全部読み込んでコンパイルしてから実行するという事が出来ないので、 折角だからVMも設計しようと思った次第です。 ASTから中間言語に落とすとcontinuationの実装が楽になるので。
|