検索その2の続き。

今回は、キーワードの色付け。前回と同じ部分なので、ついでに実装しちゃう。
C++ の予約語をキーワードとして色付けしようと思ったけど、結構多いので外部ファイルから読み込むようにした。
読み込み自体は、そのパーサーが呼ばれる時(cpp_parser が実体化したら、その時にファイルを読み込む)。

読み込み方は、単純に一行ずつ読んで改行を捨て、空じゃなければ

static std::map<std::string, std::map<char32_t, std::vector< std::u32string > >* > g_keywords;

に格納する。ってなんじゃこりゃ 笑
パッと見、全然分からんな。。分解すると、

 

map<キーワード識別子, キーワード格納テーブル> g_keywords;

キーワード識別子は、指定のキーワード格納テーブルを呼び出す用。
なんでも良いんだけど、分かりやすい様に言語名にした。

map<"c", table> とか map<"cpp", table> みたいな感じ。

 

map<キーワード先頭文字, キーワード> キーワード格納テーブル;

キーワード格納テーブルは、キーワードの先頭一文字で頭出しできるために使用。

map<U'v', vector< U"void" > > みたいに。

 

vector< u32string > キーワード

キーワードは、vector の配列で、実際のキーワードを u32string に格納したものが定義分格納されてる。

 

実装した結果。

スクリーンショット 2019 03 19 19.34.57

検索1の続き。今回は構文解析の仕組みを入れてみた。

template <typename T, bsize_t S = 4>
class default_parser {
template <typename T, bsize_t S = 4>
class c_parser : public default_parser<T, S>{
template <typename T, bsize_t S = 4>
class cpp_parser : public c_parser<T, S>{

まずはこの 3つのクラスを作って(差し当たり C++ のみ)与えられた行の構文解析をし、
前回の『行修飾状態』を行クラスに追加する。
c_parser とか cpp_parser はまず表示などの具合も見たかったので埋め込み。
いずれは動的に設定を読み込むようにして default_parser を汎用的にすればいっかと思ってる。

このクラス自体は、テキスト管理クラスに

    default_parser<uint8_t, MBUFSIZE>* m_parser;

ぶら下げ、テキスト読み込み後に

    m_parser = new cpp_parser<uint8_t, MBUFSIZE>();
    if (m_parser != nullptr){
        m_parser->init(&m_edit, &m_line);
    }

動的に割り当て。入り口はdefault_parser に固定とする。

あとは全行分、一行ずつ解析を呼び出すだけ。
一行ずつにしたのは、後の編集で行の内容が変わった場合に対応するため。

解析自体は、IDE を作るつもりではないので単純な文字比較に近いノリ。
とりあえず、文字リテラル、文字列リテラル、行コメント、ブロックコメントに対応してみた。
結果はこんな感じ。

スクリーンショット 2019 03 19 1.00.02