言語仕様を決めるのだ

ゲームに簡単なプログラムを組み込むためにスクリプト言語とそれを実行するインタープリタをC++で作ってしまおうというコーナーです。
前回どんなスクリプトにするかを大まかに考えたので今度はそれを満たすような言語仕様を考えていきます。

名称//値と型/変数/関数/制御構文/演算子

このスクリプトは基本的にPerlっぽい見た目になるように作ります。
もちろんPerlそのものを作るわけではないので作りやすさや用途に合わせて適宜変更はします。


名称

名前はこの場合あってもなくてもよさそうなものですが、やはりやっぱり呼ぶときに困りますしあるとないとでは多少意識も違うでしょうし、適当に名付けておきます。
ここは安直に私の名前を取って「MifuminScript」としておきましょう。
略称がMSでマイクロソフトと紛らわしいので……短い名前として「S323」でも付けておきます。


スクリプトはスクリプトなんですから、ある種のプログラムでもあるわけです。
手続き型のプログラムなので基本的には式が並んでいてそれを順番に実行していく形になるのです。
そして、「式」は必ず「値」をもつようにします。
別に難しいことではなく、「1 + 1」の値は「2」とか、「a = 5 * 6;」という式があれば、「5 * 6」の結果を「a」に代入し、その結果の「30」がこの代入式の値となるわけです。
じゃあ値を持たない式、「msg("ハローワールド!");」みたいに何か命令を実行するけど特に結果の値を必要としないものはどうするかというと、「値がないことを示す値」というものを考えて、その「値がないことを示す値」を持つようにします。
ifとかwhileなどの制御構文についてどうするかはあまり考えていませんが、これについては作りながら都合のいい方法を模索していくことにしましょう。

サンプルを見てわかるとおり、なんとなくPerlっぽくしているので式の終わりはセミコロン「;」ですが、入力が面倒なので改行コード「\r」と「\n」も式の終わりに使えるようにしましょう。
「式を複数行にまたがって書ける」という要件があるので実際にできるのか怪しいところですが…。


値と型

先ほど「値がないことを示す値」が出てきたのでこの際一緒に書いてしまいます。
MifuminScriptで扱う値は数値型・文字列型のように型というものを持つようにします。
それぞれの方は相互変換できるようにします(一部例外除く)。
具体的に、以下のような型を使います。

#例
123	;#数値型(整数)
3.14	;#数値型(小数)
9.4e15	;#数値型(指数)
9.1e-31	;#数値型(指数)
"(x_x)"	;#文字列型
(1, 2, 3, 4, 5)	;#配列型(普通の配列)
("a" => 1, "b" => 2)	#配列型(連想配列)

変数

変数名の最初にはPerlなどのごとく「$」をつけます。
しかし、普通の変数と配列は区別無しで使う(変数の型の一つに配列型がある)ので、配列名の前にも「$」です。
配列の添え字は「[」と「]」で囲みます。
大文字と小文字は区別します。

#例
$abc = 1;	#普通の変数
$def[0] = 2;	#配列
$g["h"] = 3;	#連想配列
$i[j][k] = 4;	#配列の配列

関数

関数定義は、「sub」、関数名、「{」、関数の中身、「}」、を並べる形でできるようにしましょう。
「sub」の代わりに「function」も使えるようにしてもよいでしょうね。
定義した関数を呼び出すときは「&」の後に関数名をつけて呼び出します。
例によって大文字と小文字は区別します。
引数についてはあまり考えてないのですが、Perlのように「_」という名前の配列に入れてしまおうかと考えています。
難しくなさそうだったら他のまともなプログラム言語のように関数名の後に引数を括弧に入れてずらっと並べる方式にしようと思います。
関数から戻るときは「return」で。
値省略時及びreturnなしの場合は未定義値を返すようにしましょう。
関数は先に定義しても後で定義しても使えたほうがいいですね。

#例
sub myFunc {
	return $_[0] + $_[1];
}

$a = &myFunc(1, 2);

制御構文

ifとgotoとwhileぐらいは最低限欲しいところですね。
forは方言が激しすぎて作る気起きねーわ。
Perlのような後置きifなどはサポートせずifの後に直接式を書くのはサポートするようにしましょう。

#ifも値を持つならこんなことも可能!?(本当は未定)
$a = if ($b) $c;

演算子

加減乗除などの算術演算子については説明不要でしょう。
文字列の連結にはPerlと同じく「.」を使用します。
論理演算はビット単位ではなく0か非0で計算することにします。
&&や||のような条件付で後ろを評価するようなものも作れそうなので対応することにします。

06/10/01短い名前を追加。演算子について修正
06/07/22書いてみた