技術情報

skkIMのコードは、SKKのロジックとOS依存の表示系の部分などを分離して 実装してあります。この章では、skkIMを他の環境へ移植するための 最低限の実装の解説を行います。

クラス階層

アーカイブ中、"Skk"のプレフィクスがついているソースが、 OS非依存のコードです。 代表的なクラスに以下のような物があります。
skk_candidate
単一の候補をあらわす構造体です。
SkkEntry
辞書の検索結果をあらわすクラスです。
検索結果のマージ、展開などの操作をサポートします。
SkkDictionary
辞書をあらわす抽象クラスです。
候補の検索、挿入、削除などの操作をサポートします。
SkkAutomaton
決定性オートマトンのクラスです。
ローマ字かな変換などの変換操作をサポートします。
SkkControler
SKKのロジックとOS依存コードのインターフェースとなるクラスです。
このクラスを継承して、OS依存の適切な実装を行なった クラスを作り、そのクラスを通してインタラクションを行ないます。
SkkUtils
各種の文字列変換を行なうライブラリクラスです。

skk_candidate

struct skk_candidate
{
  string yomi_kana;
  string okuri_kana;
  string okuri_prefix;
  string gokan;
};

typedef vector<skk_candidate> skk_candidate_array;

単一の候補をあらわす構造体で、読み仮名、送り仮名、送りプレフィクス、語幹の 4つのフィールドを持ちます。
プログラム中で候補を表現するほとんどの場面で使わます。 状況によって、キーとして扱われたり、検索結果を格納する形で 扱われたりします。
また、skk_candidateのvectorが skk_candidate_arrayの名前でtypedefされています。

SkkEntry

struct SkkEntry
{
  void Merge(const SkkEntry &rhl);
  void Insert(const skk_candidate &candidate);
  void Remove(const skk_candidate &candidate);
  void Fill(const skk_candidate &key, skk_candidate_array &candidates);
};

辞書の「キー」に対する「値」です。
キーに対する複数の候補、送り仮名に対する優先度を格納しています。

void Merge(const SkkEntry &rhl);
2つのエントリーを順序を保ったままマージします。 右辺の要素は左辺の要素の後に配置され、右辺と左辺に 同じ要素がある場合は、左辺の要素のみが残されます。
void Insert(const skk_candidate &candidate);
候補をエントリに登録します。
void Remove(const skk_candidate &candidate);
候補をエントリから削除します。
void Fill(const skk_candidate &key, skk_candidate_array &candidates);
keyのokuri_kanaフィールドを参考に、エントリの内容を skk_candidate_arrayに展開します。展開された内容は、 候補の優先度順に並んでいます。

SkkDictionary

class SkkDictionary
{
  virtual void Read(istream &in);
  virtual void Write(ostream &out);
   
  virtual SkkEntry FindEntry(const skk_candidate &key);
  virtual void InsertCandidate(const skk_candidate &candidate);
  virtual void RemoveCandidate(const skk_candidate &candidate);
};

辞書操作を行なう抽象クラスです。
SkkDictionaryには、 候補の挿入/削除の行えないSkkStaticDictionaryと、 候補の挿入/削除が自由に行えるSkkDynamicDictionaryの 2つの継承クラスが用意されています。
自由度はSkkDynamciDictionaryの方が高いですが、 消費メモリはSkkStaticDictionaryの方が格段に 少ないです。

virtual void Read(istream &in);
streamから辞書の内容を読み込みます。
virtual void Write(ostream &out);
streamへ辞書の内容を書き出します。
virtual SkkEntry FindEntry(const skk_candidate &key);
keyのyomi_kanaフィールドとokuri_prefixフィールドに対応する エントリを返します。
virtual void InsertCandidate(const skk_candidate &candidate);
辞書に候補を追加します。
virtual void RemoveCandidate(const skk_candidate &candidate);
辞書から候補を削除します。

skk_input

struct skk_input
{
  int ascii;
  int key;
};

キー入力をあらわすクラスです。
asciiがキーのアスキーコード、keyがキーのキーコードをあらわします。 keyの値は機種固有の値なので、"Skk"コード内では参照していません。

SkkAutomaton

ソースの解説 構造体の解説 skk_candidate skk_candidate_array クラスの解説 SkkEntry SkkKey SkkDictionary SkkAutomaton SkkControler 入力の解説