の実装
とりあえず、CEXっていうC言語っぽいリストだか、ベクターだかわからんけど、まぁそういうデータフォーマットです。
それを使った言語を作ってみようということで、実装してみてます。
目先の目標はswf上で動く言語です。とにかく、小汚くてもいいので実装してみてます。
扱える構文は
var, if(){}[else if]{}[else]{}, label, while, break, continue, function, return
以上を目標に。
SICPとか読みつつ(といっても、1.1とかし見れてない)。とにかく、ツリーたどって、一番小さいところまで行って、計算して、上のレベルに戻って計算しての繰り返しで計算されます。
なんだか、とても、めんどくさいです。
しかも、動作速度はたぶん遅いです。
トランスレータなら速いし、作るのも楽なんだけどなぁ。
何で作ってんだろう?
ま、あと、今までツリー上で "aiueo"っ手書いてあったのを (id "aiueo" STRING 101)
みたいにしました。行番号とか持ち歩けて、再構築するときや、エラー出力をするときの行数を覚えててくれるというものに使いたいと思ってます。
なんか、めんどくさいので挫折しそうです。
src :var[a]; cex :var[a] ; list:[disable,[[id,var,ID,1],[array,[id,a,ID,1]]],[id,;,ID,1]] exec:0 -------------------------------------------------------------------------------- src :var[a=1+1]; cex :var[a = 1 + 1] ; list:[disable,[[id,var,ID,1],[array,[[id,=,ID,1],[id,a,ID,1],[[id,+,ID,1],[id,1,NUMBER,1],[id,1,NUMBER,1]]]]],[id,;,ID,1]] exec:0 -------------------------------------------------------------------------------- src :stdout.write("hello world\n"); cex :stdout.write("hello world\n") ; list:[disable,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"hello world\n",STRING,1]]]],[id,;,ID,1]] hello world exec:0 -------------------------------------------------------------------------------- src :var[a=2];stdout.write(a+"\n"); cex :var[a = 2] ; stdout.write(a + "\n") ; list:[disable,[[id,var,ID,1],[array,[[id,=,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]]],[id,;,ID,1],[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[[id,+,ID,1],[id,a,ID,1],[id,"\n",STRING,1]]]]],[id,;,ID,1]] 2 exec:0 -------------------------------------------------------------------------------- src :var[a=2];if(a!=2){stdout.write("a\n");}[else]{stdout.write("b\n");} cex :var[a = 2] ; if(a != 2) {stdout.write("a\n") ;} [else] {stdout.write("b\n") ;} list:[disable,[[id,var,ID,1],[array,[[id,=,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]]],[id,;,ID,1],[[id,if,ID,1],[paren,[[id,!=,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]],[block,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"a\n",STRING,1]]]],[id,;,ID,1]],[array,[id,else,ID,1]],[block,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"b\n",STRING,1]]]],[id,;,ID,1]]]] b exec:0 -------------------------------------------------------------------------------- src :var[a=2];if(a!=2){stdout.write("a\n");}[else if](a==2){stdout.write("b\n");} cex :var[a = 2] ; if(a != 2) {stdout.write("a\n") ;} [else if] (a == 2) {stdout.write("b\n") ;} list:[disable,[[id,var,ID,1],[array,[[id,=,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]]],[id,;,ID,1],[[id,if,ID,1],[paren,[[id,!=,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]],[block,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"a\n",STRING,1]]]],[id,;,ID,1]],[array,[id,else,ID,1],[id,if,ID,1]],[paren,[[id,==,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]],[block,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"b\n",STRING,1]]]],[id,;,ID,1]]]] b exec:0 -------------------------------------------------------------------------------- src :var[a=2];if(a!=2){stdout.write("a\n");}[else if](a==1){stdout.write("b\n");}[else]{stdout.write("c\n");} cex :var[a = 2] ; if(a != 2) {stdout.write("a\n") ;} [else if] (a == 1) {stdout.write("b\n") ;} [else] {stdout.write("c\n") ;} list:[disable,[[id,var,ID,1],[array,[[id,=,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]]],[id,;,ID,1],[[id,if,ID,1],[paren,[[id,!=,ID,1],[id,a,ID,1],[id,2,NUMBER,1]]],[block,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"a\n",STRING,1]]]],[id,;,ID,1]],[array,[id,else,ID,1],[id,if,ID,1]],[paren,[[id,==,ID,1],[id,a,ID,1],[id,1,NUMBER,1]]],[block,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"b\n",STRING,1]]]],[id,;,ID,1]],[array,[id,else,ID,1]],[block,[[id,.,ID,1],[id,stdout,ID,1],[[id,write,ID,1],[paren,[id,"c\n",STRING,1]]]],[id,;,ID,1]]]] c exec:0 --------------------------------------------------------------------------------