トークンとノードって

ゲームに簡単なプログラムを組み込むためにスクリプト言語とそれを実行するインタープリタをC++で作ってしまおうというコーナーです。
前回前々回で、多少の方針転換をしたので、今回はそれを踏まえて一部書き直します。

それで、実際プログラム書き始めて久しぶりにソースをじっくり見て気付いたのですが、スキャナで字句解析して得たデータはCMSToken型に入り、パーサで構文解析しようとするデータはCMSNode型に入っている前提だったんですね。
つまり、字句解析した結果をそのまま構文解析で使えないのが現状というわけです。
それに対する対応は次の二つが考えられます。

  1. 最初からCMSNodeを生成するようにスキャナを作る。>/li>
  2. 使うときにCMSTokenからCMSNodeに変換する。

ここでは、処理の速さや最終的なコードの読みやすさなどから考えて、1を選ぶことにします。
てなわけでスキャナを手直ししてみます。
でも実際のコードを掲載すると長いし、ほとんど単純な置き換え作業なので、見たい方は今回の分のソースをダウンロードして見てくださいね。

一応代表として数値のあたりだけ抜粋しておきます。

if ('0'<=*ptr && *ptr<='9') {
    // 数値だ!
    (中略)
    // 小数
    (中略)
    // 指数
    (中略)
    ptr--;
    m_TokenList.push_back(new CMSNodeN(value));
}

ノードのほうも若干変わってるので一応。

class CMSNodeN : public CMSNode
{
protected:
    CMSValue m_Value;
public:
    CMSNodeN(double dValue) { m_Value = CMSValue(dValue); }
    virtual ~CMSNodeN() {}
    EMSNodeType GetNodeType() { return eMSNodeN; }
};

今回までのソース(VC++6)