今回は例文を処理する様子を見てみます。
例文:「はっしゃ」
「はっしゃ」を入力するのに必要なパターンを洗い出します。
(実際はデータ構造に組み込まれていますが)
1.「はっしゃ」を最小の単位に分割します。
「は」、「っ」、「し」、「ゃ」
2.入力されうる文字の区切りで区切ったパターンを作成します。
3.1,2にアルファベットのパターンを割り当てます
「は」=
「ha」
+
「」
「っ」=
「ltu」、「xtu」、「ltsu」、「xtsu」
+
「」、 「」、 「」、 「」
「し」=
「si」、「shi」、「ci」
+
「」、 「」、 「」
「ゃ」=
「lya」、「xya」
+
「」、 「」
「っし」=
「ssi」、「sshi」、「cci」
+
「」、 「」、 「」
+
(上の定義済みパターンから自動生成するパターン)
・「っ」+「し」と考えて
「ltu」、「xtu」、「ltsu」、「xtsu」
+
「し」、 「し」、 「し」、 「し」
「しゃ」=
「sya」、「sha」
+
「」、 「」、 「」
(上の定義済みパターンから自動生成するパターン)
・「し」+「ゃ」と考えて
「si」、「shi」、「ci」
+
「ゃ」、「ゃ」、 「ゃ」
「っしゃ」=
「ssha」、「ssya」
+
「」、 「」
+
(上の定義済みパターンから自動生成するパターン)
・「っ」+「しゃ」と考えて
「ltu」、「xtu」、「ltsu」、「xtsu」
+
「しゃ」、「しゃ」、「しゃ」、「しゃ」
・ 「っし」+「ゃ」と考えて
「ssi」、「sshi」、「cci」
+
「ゃ」、 「ゃ」、 「ゃ」
※3分割にするパターンは考える必要はありません
(「っ」+「し」+「ゃ」)
3分割にするパターンは
「しゃ」のパターンに2分割するパターンが含まれるので、
「っ」+「しゃ」に暗黙的に含まれていることになります
パターン定義が長くなってしまいましたが、
処理する様子を見てみましょう。
まず、「はっしゃ」を先頭から分割します。
「は」
+
「っしゃ」
ここでは「は」だけに注目します。
残りの「っしゃ」は考えません。
「は」は「ha」しかパターンがありませんが
1タイプごとの動きを書いてみます。
初期パターン
Index | Alphabet | Remainder |
0 |
ha |
|
「h」をタイプ
Index | Alphabet | Remainder |
0 |
a |
|
「a」をタイプ
Index | Alphabet | Remainder |
0 |
|
動作としてはタイプしたキーに対応するアルファベットと
パターン一覧のAlphabetの先頭文字が同じものがあれば
タイプ成功となります。
先頭文字が一致しなかったパターンは
タイプ毎にパターンから除外していきます。
「は」では分からないと思うので、次の「っしゃ」で動きを確認してみてください。
普通に「ssya」とタイプした場合の動きを下に記します。
初期パターン
Index | Alphabet | Remainder |
0 |
ssha |
|
1 | ssya | |
2 | ltu | しゃ |
3 | xtu | しゃ |
4 | ltsu | しゃ |
5 | xtsu | しゃ |
6 | ssi | ゃ |
7 | sshi | ゃ |
8 | cci | ゃ |
「s」をタイプ
Index | Alphabet | Remainder |
0 |
sha |
|
1 | sya | |
6 | si | ゃ |
7 | shi | ゃ |
「s」をタイプしたことで
先頭文字が「s」でないパターンが除外されます。
また、各パターンの先頭文字(s)がAlphabetから削除されます。
「s」をタイプ
Index | Alphabet | Remainder |
0 |
ha |
|
1 | ya | |
6 | i | ゃ |
7 | hi | ゃ |
「h」をタイプ
Index | Alphabet | Remainder |
0 |
a |
|
6 | i | ゃ |
「a」をタイプ
Index | Alphabet | Remainder |
0 |
|
2010.10.05