シューティングゲーム作成用言語について考える。

ABAさんが弾幕XMLを作った。あれは素晴らしいシューティングゲーム作成用言語である。
一般に、言語を作る場合は言語を記述するための言語が使われる。BNFとかが有名だ。
ABAさんは言語定義言語としてRelaxerを使った。
RelaxerXMLで言語を定義する言語だ。
しかし、XMLを書くのはややめんどくさい。
そこで、Bullet¬MLが開発された。
Bullet¬MLは、c言語的な言語でBulletMLを書く言語で、BulletMLへのトランスレータが用意されている。
http://www.notava.org/notavacc/bullet/

以下がBulletMLである。

<?xml version="1.0" ?>
<!DOCTYPE bulletml SYSTEM "http://www.asahi-net.or.jp/~cs8k-cyu/bulletml/bulletml.dtd">
<bulletml>
  <action label="top">
    <repeat>
      <times>100</times>
      <action>
        <fire>
          <direction type="sequence">23</direction>
          <bulletRef label="straight" />
        </fire>
        <wait>1</wait>
      </action>
    </repeat>
  </action>
  <bullet label="straight">
    <action>
      <wait>20+$rand*50</wait>
      <changeDirection>
        <direction type="absolute">180</direction>
        <term>10</term>
      </changeDirection>
    </action>
  </bullet>
</bulletml>

Bullet¬MLでは以下のように書く。

action top
repeat 100 action {
    fire direction sequence 23 bulletRef straight;
    wait 1;
}

bullet straight action {
    wait 20+$rand*50;
    changeDirection direction absolute 180 term 10;
}

短くかけて素晴らしい。けど、やっぱり不満もある。
なんだか、長々書いてあってよくわからんのだ。

fire direction sequence 23 bulletRef straight;

であるけど、

        <fire>
          <direction type="sequence">23</direction>
          <bulletRef label="straight" />
        </fire>

こういう意味だ。
てことは、例えばこうかきたい。

    fire(direction(sequence,23), bulletRef(straight));

いやいや、bulletRefは要は関数なんだから、

    fire(directionSequence(23), straight());

のほうがいいんでないか?
等と考えて行くと、最終的に素晴らしい言語が出来上がるだろう。
リファレンスや、言語定義を見ると、、、。うーむ。ってなる。

さて、考えるに当たって問題が発生する。

言語定義の範囲が広すぎるのである。
俺はC言語が好きなのである。C言語みたく書きたいのである。
Haskellっぽいのは嫌なのだー。

言語の定義とサンプルがかけ離れているのである。
私はC言語の表記が好きだ。だから、できればC言語のような言語で定義したいのだ。
C言語的な言語で書けるBNFが欲しいってことだ。
なんか、BNFってHaskellとかの関数型言語に似てて嫌なのだ。

それが何なのか私は知らないけど、そういう言語があれば嬉しい。

MSが主導でDSL開発用のフレームワークみたいなのを容易したらしい。
それがもしかしたら、すばらしい言語を用意してくれるのかもしれない。
しかし、MS主導はつまらないし、なんかIDEとかでかいのがついて高く売られそうなので、
誰か、日本人の優秀な技術者がそういう環境を用意して欲しい。


私が去年考えていたCEXとかいう言語はまさに、そのような言語を目指していたのだ。
でも、XMLみたいな位置にいる言語だし、まだまだ定義は甘いのでSGMLみたいなもんか。
っていうか、XMLベースでReluxerが考えられたのだから、
C言語のような言語でReluxerが考えられてもいいよなぁと思うのだ。
で、すでに、javascriptで、lexジェネレータは作れているのだ。
てことは、えーと、C言語っぽい言語で、構文定義出来る言語作って、
yaccか何かで読めるトランスレータを作れればいいのかなと。

ごにょごにょ。


まとめ

要するに、C言語っぽい言語で言語定義言語を作って、BNFへのトランスレータ作ろうぜ。
boostのspritがいいね。
そいつ使って、BulletMLをC言語っぽい言語定義言語で再定義しようぜ。
さらに発展できたら、それ以外のシューティングゲーム作成用の言語まで定義していこうぜ。
ってことである。
で、やっぱり難しいのはC言語っぽい言語なんだわなぁ。1年かかってもちゃんとした文法も出来てない気がする。