プログラムでプログラムを生成する

最近、RL78用のデバイス定義ファイル生成用のプログラムを実装している。

sed、grep、awk、perl、などなど、スクリプトを駆使しても良いが、C++ では、
文字列の処理もかなり、柔軟に書けるので、制限が多いスクリプトはあまり使わ
なくなった。

基本的な流れとしては、必要最低限の表現で記述された定義ファイルを読み込ん
で、それから、C++ のコードを生成するもの。
もう一つは、テキスト化されたファイル(元は PDF )から、フィルターを駆使し
て、必要な部分を抜き出して、定義ファイルを作成する事。

しかし、PDF をテキスト化する過程の制限や、キーワードを自動で「抜く」のは難
しい事が判った。
この部分は、しばらくは手作業で行う事になる・・・
また、RL78、M32C、RX のハードウェアーマニュアルの違いで、一律では出来ない。

-----

それでも、以前に比べれば、冗長な記述を長い時間をかけて、だらだら書くのに比べ
れば、非常に軽減され、ミスも少なくなった。
そして、構成を変えるのも苦にならない、単純に、プログラムを修正して作りなおす
だけなので。

定義ファイルは、JSON とか使えば良いだろうと思うかもしれないが、以前から、もっ
と軽量な物を模索していたので、一度、自分で書いてみる事にした。
もちろん、XML は、史上最悪なフォーマットである事は言うまでもない、これを有難が
る人がいる事に、驚くばかりである、疫病のように世間に広まってしまっているけど・・

実装してみると、以外と奥が深く、色々な書き方に柔軟に対応するのは難しい事が判っ
た。
以前に、自分のアプリ用にプリファレンスを読み書きするクラスを書いたけど、これは、
人間が編集する事を前提としていないのと、構造が今回とは違う物なので、採用しなか
った。

定義ファイルはこんな感じで書く:

base {
    .title     "RL78/G13 グループ・ポート・レジスター定義",
               "Copyright 2016 Kunihito Hiramatsu"
    .author    "平松邦仁 (hira@rvf-rc45.net)"
    .file      "common/io_utils.hpp"
    .space     "device"
}

reg {
    .title     "クロック動作モード制御レジスタ(CMC)",
               "リセット時:00H"
    .base      "rw8_t"
    .address   "0xFFFA0"
    .name      "CMC"

    bit {
        .title  "高速システム・クロック端子の動作モード"
        .def    7, 1
        .name   EXCLK
    }
}

変換すると、以下のように C++ コードを作る~

#pragma once
//=====================================================================//
/*! @file
    @brief  RL78/G13 グループ・ポート・レジスター定義 @n
            Copyright 2016 Kunihito Hiramatsu
    @author 平松邦仁 (hira@rvf-rc45.net)
*/
//=====================================================================//
#include "common/io_utils.hpp"

namespace device {

    /// @brief CMC レジスタ定義
    typedef rw8_t<0xFFFA0> cmc_rw;
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
    /*!
        @brief  クロック動作モード制御レジスタ(CMC) @n
                リセット時:00H
    */
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
    struct cmc_rw_t : public cmc_rw {
        using cmc_rw::operator =;
        using cmc_rw::operator ();
        using cmc_rw::operator |=;
        using cmc_rw::operator &=;

        bit_rw_t<cmc_rw, 7> EXCLK;    ///< 高速システム・クロック端子の動作モード
    };
    static cmc_rw_t CMC;
}

これらの処理を簡潔に行う為に、色々なユーティリティ-を実装したが、その一つが、
「text_edit」クラスで、この実装で、エディターで行うような操作をプログラムから
行う事が出来るようになった。
まだ、通常のエディターが備えている機能には程遠いので、これから、ボチボチ機能を
追加したい。
この実装、設計は、なかなか楽しい!

これらソースコード一式は、GitHub にある。
iod_make