インタープリターを作る

ぼちぼち作成中。
インタープリターは作ったことがなかったんですが、
コンパイラより難しいですね。
コンパイラはある意味、整形するだけですけど、
インタープリターはメモリ管理とかがたいへん。

x=2;
print x+3*(2-x);
y="abc";
print y=="abc"
if(x==2) print "ok";

みたいな感じで、変数は小文字の一文字だけですが使えるようになりました。
あと文字列をサポートしていて、
文字列と文字列の比較をstr==strでできます。
C言語だとstrcmpを使うわけですが、値と文字列を変数に型を持たせて
文字列==文字列の場合は、ポインターではなくstrcmpで比較するようにしました。


文字列同士の加算もOK。

x="abc";
y="def";
z=x+y;

x+yのstrlenだけmallocして、memcpyでzにコピーしてます

x="abc";
x="def";

みたいな場合は、defを代入するときにabcを持っている領域をfreeしてます。
よく考えたらreallocしてmemcpyでdefを代入した方がメモリが断片化しないかな?
この場合長さが同じからreallocしないでもいいし。


まだ関数がないので変数のスコープという概念はないですが、
スコープが出来た場合は、関数から抜けた場合に、文字列変数を自動的にfreeしてやる必要があります。
ただ、厳密にフリーしていると、ループで関数が呼ばれる場合に
mallocとfreeを繰り返すことになって、効率が悪いので、
JavaとかのGC付き言語は、良く使う変数はスコープから抜けてもfreeせずに
時間差を持たすようです(要するにキャッシュと同じ考え方ですね)