0
|
1 3.5 オートマトン(3J_T)
|
|
2
|
|
3 3.5.1 はじめに
|
|
4 オートマトンは、かな漢字変換フロントエンドプロセッサ uum など (以後、単に
|
|
5 uum と呼ぶ) のローマ字かな変換を実現している機能で、変換内容を設定した
|
|
6 表 (変換表と呼ぶ) を変えることで任意の変換にすることができる。また、当
|
|
7 システムには、これと同一の機能を持ったオートマトンライブラリ (日本語入力
|
|
8 ライブラリ (libwnn) の romkan_ で始まる関数) があり、多種多様な変換プログ
|
|
9 ラムに応用できる。
|
|
10
|
|
11
|
|
12 3.5.2 機能
|
|
13 オートマトンは、変換表に従って直列に結ばれた3つの変換 (順に、前処理、
|
|
14 本処理、後処理と呼ぶ) を行い、その最終結果を出力する。3つの処理操作は、
|
|
15 それぞれの変換表に基づいて変換が行われる。また、オートマトンは、モード機
|
|
16 能を持つ。モードを切り替えることにより、3つの処理で使用する表の組み合
|
|
17 わせを動的に変更できる。このモードの設定、切り替えコードの設定も変換表
|
|
18 で行う。
|
|
19
|
|
20 変換表が、テキストファイルであるため、表は容易に変更でき、しかも任意の変
|
|
21 換表に変更できる。また、1つの変換を行った後、次の変換を行うまでは、 BS
|
|
22 (バックスペース) により変換の1つ前の状態に戻すことができる。
|
|
23
|
|
24 uum のローマ字かな変換では、本処理で「英大文字→ひらがな」の変換しか
|
|
25 行えないが、前処理で「英大文字→英大文字」、「英小文字→英大文字」の切り
|
|
26 替え、また後処理では「ひらがな→ひらがな」、「ひらがな→カタカナ」、「ひら
|
|
27 がな→半角カタカナ」の切り替えを行うことにより、ローマ字かな変換の入力・
|
|
28 出力の数種のケースに対処している。
|
|
29
|
|
30 ┌───オートマトン───┐
|
|
31 │ │
|
|
32 ┌───┐ │ ┌───前処理───┐ │
|
|
33 │入 力│ ―→ │ 小文字は大文字に │ │
|
|
34 └───┘ │ │ 変換 │ │
|
|
35 英 (半角) │ └─────────┘ │
|
|
36 大・小文字 │ ↓ │
|
|
37 │ ┌───本処理───┐ │
|
|
38 │ │英大文字→ひらがな│ │
|
|
39 │ │の表に基づいて変換│ │
|
|
40 │ └─────────┘ │
|
|
41 │ ↓ │
|
|
42 │ ┌───後処理───┐ │
|
|
43 │ │ ひらがなを必要に │ │ ┌───┐
|
|
44 │ │ 応じてカタカナや │ ―→ │出 力│
|
|
45 │ │ 半角カナに変換 │ │ └───┘
|
|
46 │ └─────────┘ │
|
|
47 └────────────┘
|
|
48
|
|
49 3.5.3 変換表
|
|
50 オートマトンは、変換表として次の表を使用する。
|
|
51
|
|
52
|
|
53 ┌(1)モード定義表
|
|
54 │ モード宣言・使用する対応表を指定する表。
|
|
55 │ ファイル名は "mode" である。
|
|
56 │
|
|
57 │
|
|
58 変換表 ┤
|
|
59 │ ┌ 前処理表 ... 前処理で使用する対応表。
|
|
60 │ │ '1'で始まるファイル名。
|
|
61 │ │
|
|
62 │ │
|
|
63 └(2)対応表 ┤ 本処理表 ... 本処理で使用する対応表。
|
|
64 │ '2'で始まるファイル名。
|
|
65 │
|
|
66 │
|
|
67 └ 後処理表 ... 後処理で使用する対応表。
|
|
68 '3'で始まるファイル名。
|
|
69
|
|
70 前処理・本処理・後処理でそれぞれ
|
|
71 任意の数の対応表が使用できる。
|
|
72
|
|
73
|
|
74 モード定義表には、モードの宣言、各モードで使用する対応表の組み合わせ
|
|
75 とその決定規則を記述する。
|
|
76
|
|
77 対応表には、入力コードと出力コードとの対応が記述される。対応表は、前・
|
|
78 本・後処理の3つに分かれ、それぞれ、任意の数の表を使用ができる。
|
|
79
|
|
80 uum は、モード定義表を以下の順番で探す。
|
|
81
|
|
82 1. uum のオプション -r による指定。
|
|
83
|
|
84 2. uum 初期化ファイル uumrc の setrkfile エントリによる指定。
|
|
85
|
|
86 3. ファイル名 /usr/local/lib/wnn/rk/mode
|
|
87
|
|
88
|
|
89 表の記述方法のうち、
|
|
90
|
|
91 … は、0回以上の繰り返し、
|
|
92 … … は、1回以上の繰り返し、
|
|
93 [ ] は、省略可能
|
|
94
|
|
95 を、それぞれ表わす。
|
|
96
|
|
97 3.5.4 モード定義表
|
|
98 モード定義表には、モード宣言、各モードで使用する対応表の組み合わせと
|
|
99 その決定規則、モード表示文字列が記述される。
|
|
100 モード定義表は、次の (1),(2),(3),(4) で構成される。ただし、行の先頭
|
|
101 または空白文字 (タブを含む) に続き、しかもエスケープされていない;から
|
|
102 行末までの文は、注釈文として扱われる。
|
|
103
|
|
104 (1) 特殊文字
|
|
105
|
|
106 特殊文字としては、以下に示すものがある。
|
|
107
|
|
108 @HOME 環境変数 HOME を表わす。
|
|
109 @MODEDIR モード定義表の存在するディレクトリを表わす。
|
|
110 @LIBDIR 標準設定がしてある変換表が存在するディレクトリ
|
|
111 (/usr/local/lib/wnn/)
|
|
112
|
|
113 ~user user がユーザ名ならば、そのユーザのログインディ
|
|
114 レクトリ名を表わす。user の指定がなければ、自分
|
|
115 のログイン・ディレクトリ名を表わす。
|
|
116
|
|
117 (2) モード宣言
|
|
118
|
|
119 モード宣言の書式は、次のとおり。
|
|
120
|
|
121 (defmode モード名 [初期状態])
|
|
122
|
|
123 ・モード名は、英数字からなる文字である。
|
|
124 ・初期状態は、on または off を指定する。 省略時は、off である。
|
|
125 ・モード宣言は、そのモードを使用する前に行う。
|
|
126
|
|
127 (3) 対応表のサーチ指定
|
|
128
|
|
129 対応表のサーチ指定の書式は、次のとおり。
|
|
130
|
|
131 (search ディレクトリ名 … … )
|
|
132
|
|
133 ・モード定義表で指定された対応表がモード定義表と同じディレクトリに
|
|
134 ない場合、探しにいくディレクトリ名を指定する。
|
|
135
|
|
136 ・ディレクトリ名は、空白で区切って複数指定できる。
|
|
137
|
|
138 ・search は、対応表の指定より前に指定されていなければならない。
|
|
139
|
|
140 (path ディレクトリ名 … … )
|
|
141
|
|
142 ・対応表をサーチするために既に格納されているディレクトリ名を削除し、
|
|
143 引数に指定されたディレクトリ名を格納する。
|
|
144
|
|
145 ・ディレクトリ名は、空白で区切って複数指定できる。
|
|
146
|
|
147 ・search は、対応表の指定より前に指定されていなければならない。
|
|
148
|
|
149 (4) 対応表とモード表示文字列の指定
|
|
150
|
|
151 指定方法は、次の3つがある。
|
|
152
|
|
153 [1] 対応表のファイル名またはモード表示文字列 … …
|
|
154
|
|
155 [2] (if 条件式 対応表の指定またはモード表示文字列 … )
|
|
156
|
|
157 [3] (when 条件式 対応表の指定またはモード表示文字列 … )
|
|
158
|
|
159 対応表は '1'、'2'、'3' のどれかで始まるファイル名を指定する。
|
|
160 パスによる指定もできる。
|
|
161 モード表示文字列は、そのときのモードを表す " " で囲んだ文字列
|
|
162 である。
|
|
163
|
|
164 (a) " " 変換が ON のときのモード表示文字列を表わす。
|
|
165
|
|
166 (b) (on_dispmode " ") 変換が ON のときのモード表示文字列を表わす。
|
|
167
|
|
168 (c) (off_dispmode " ") 変換が OFF のときのモード表示文字列を表わす。
|
|
169
|
|
170 (d) (on_unchg) 変換が ON のときのモード表示文字列をモード
|
|
171 チェンジする前と同じモード表示文字列を表わす。
|
|
172
|
|
173 (e) (off_unchg) 変換が OFF のときのモード表示文字列をモード
|
|
174 チェンジする前と同じモード表示文字列を表わす。
|
|
175
|
|
176 uum では、この文字列がモード表示に使用される。
|
|
177
|
|
178 オートマトン・ライブラリは romkan_dispmode() によって、この文字列
|
|
179 を取り出すことができる。ただし、モード定義表にあるモード時のモード表
|
|
180 示文字列が複数あるように記述されている場合、最後のものだけが有効であ
|
|
181 る。
|
|
182
|
|
183 [2]、[3] は、条件によって選択する対応表を変えたいときに使用する。
|
|
184 [2] の if 文 は、その条件式の結果が真ならば、その if 文内の指定を参照
|
|
185 し、if 文の次の指定は参照しない。条件式が偽ならば、すぐ if 文を抜け出し
|
|
186 て if 文の次の指定を参照する。
|
|
187
|
|
188 [3] の when 文は、その条件式の結果が真ならば、その文内の指定を参照
|
|
189 し、偽ならば参照しない。しかし、if 文と異なり、条件式の真偽にかかわらず
|
|
190 when 文の次の指定を参照する。
|
|
191
|
|
192 なお、[2]、[3] の対応表を指定する場合には、[2] または [3] を再
|
|
193 帰的に定義できる。
|
|
194
|
|
195
|
|
196 条件式には次の内1つを記述する。
|
|
197
|
|
198 モード名 モードの状態が on のとき真
|
|
199 (and 条件式 条件式) 2つの条件式が真のとき真
|
|
200 (or 条件式 条件式) どちらかの条件式が真のとき真
|
|
201 (not 条件式) 条件式が偽のとき真
|
|
202 (false) 常に偽
|
|
203 (true) 常に真
|
|
204
|
|
205 例えば、( モード定義に (defmode kana) と (defmode romajikana) が
|
|
206 あるとき) (and kana romajikana)は、双方のモードが on のとき真になる。
|
|
207
|
|
208 また例えば、(ここでは、条件式を○◎●で表し、変換表の名前をABC…
|
|
209 で表すという規則のもとに)
|
|
210
|
|
211 (when ○ A (if ◎ B ) C ) (if ● D ) E
|
|
212
|
|
213 と書かれていたする。そして、条件式○◎●共に成り立っているとす
|
|
214 る。この並びを最初から見ていく。まず、(when ○ A (if ◎ B) C)と
|
|
215 ある 。ここでは○は成り立つので、「A (if ◎ B) C」という並びを見る。
|
|
216 はじめに、表Aを選択する。
|
|
217
|
|
218 次に、(if ◎ B )がきて、しかも◎が成り立つので、表Bを選択する。こ
|
|
219 の文はif文で、しかも条件式が成り立っているので、現在注目している並び
|
|
220 「A(if ◎ B)C」のうち残りの部分は見なくてよい。これで、「A(if ◎ B)
|
|
221 C」という並びを見終えたことになるが、この並びを含んでいたものは、when
|
|
222 文なので、さらに「(when ○ A (if ◎ B )C) (if ● D) E」という並び
|
|
223 の、残りの部分を見にいく。
|
|
224
|
|
225 次に書かれているのは、(if ● D)である。●が成り立つので、表Dを選択す
|
|
226 るが、if文なので、「(when ○ A (if ◎ B ) C ) (if ● D ) E」と
|
|
227 いう並びのうち、残りの部分は見なくてよい。こうして、表A、B、Dが選
|
|
228 択される。
|
|
229
|
|
230
|
|
231
|
|
232 次に、uum が使用するモード定義表を例として示す。
|
|
233
|
|
234 このモード定義表では、3のモードが定義されている。その後の 2A
|
|
235 _CTRL から最後までが使用する対応表とモード表示文字列の指定である。
|
|
236 モードが変わるごとに、この表を見て、上記のようにして使用する表の選択を
|
|
237 行う。
|
|
238
|
|
239 (defmode romkan)
|
|
240 (defmode katakana)
|
|
241 (defmode zenkaku)
|
|
242
|
|
243 2A_CTRL
|
|
244 (if romkan
|
|
245 1B_TOUPPER
|
|
246 2B_ROMKANA 2B_JIS
|
|
247 (if (not katakana) "[あr]")
|
|
248 (if zenkaku 3B_KATAKANA "[アr]")
|
|
249 3B_HANKATA "[アイr]")
|
|
250
|
|
251 2B_DAKUTEN
|
|
252 (if (not katakana)
|
|
253 1B_ZENHIRA
|
|
254 (if zenkaku 3B_ZENKAKU "[あ ]")
|
|
255 "[Aあ]")
|
|
256 (if zenkaku
|
|
257 1B_ZENKATA
|
|
258 3B_ZENKAKU
|
|
259 "[ア ]")
|
|
260 "[アイA]"
|
|
261
|
|
262 初期状態は、romkan、katakana、zenkaku のモード全てが off である。
|
|
263 このとき表は、始めに 2A_CTRL を選択する。romkan が off なので、次
|
|
264 の if文は参照しない。そして、2B_DAKUTEN を選択する。次の if文の条
|
|
265 件式 (not katakana) は、katakanaが off ので真となる。そこで if文内
|
|
266 を参照し、1B_ZENHIRA を選択する。次に if文内の if文を参照する。この
|
|
267 if文では zenkaku が off になっているため条件式が偽となる。したがって、
|
|
268 この if 文は参照しない。
|
|
269 次に、モード表示文字列 "[Aあ]" を選択する。そして、残りの変換表並び
|
|
270 は見ない。
|
|
271
|
|
272 3.5.5 対応表
|
|
273 対応表には、前・本・後処理のそれぞれが行う変換データ (入力コードと出
|
|
274 力コードとの対応) が記述される。
|
|
275
|
|
276 前・後処理は、本処理の補助という位置付けがなされている。このことから、
|
|
277 前・後処理の対応表には次の制限が課せられる。
|
|
278
|
|
279 前処理表 下記の (2) の記述ができない。
|
|
280 また、(1) の入力コード・出力コードには、それぞれ評価すると文
|
|
281 字になる式が1つだけ書ける。バッファ残りには書けない。
|
|
282
|
|
283 後処理表 上記の (2) の記述ができない。
|
|
284 また、(1) の入力コードには、評価すると文字になる式が1つだけ
|
|
285 書ける。バッファ残りには書けない。
|
|
286
|
|
287 対応表の行のうち、ある行は次の (1)−(3) のうち1つか、または空行である。
|
|
288 この繰り返しで対応表が構成される。
|
|
289
|
|
290 (1) 入力コード [出力コード [バッファ残り]]
|
|
291
|
|
292 (2) 入力コード 機能
|
|
293
|
|
294 (3) 変数宣言
|
|
295
|
|
296 これらを2行に渡って記述してはならない。また、改行または空白文字(タ
|
|
297 ブを含む) に続き、しかもエスケープされていない ; から行末までの文は、注
|
|
298 釈文として扱われる。
|
|
299 出力コードの省略、およびバッファ残りの省略はヌルストリングの文として
|
|
300 扱われる。
|
|
301 入力コード、出力コード、およびバッファ残りに記述できるのは、「評価する
|
|
302 と文字になる式」と「評価すると文字列になる式」を空白なしに並べたもので
|
|
303 ある。
|
|
304 ここで、評価すると文字式または文字列になる式とは、その式によって文字
|
|
305 あるいは文字列に置き換わる、そのような式のことである。
|
|
306
|
|
307
|
|
308
|
|
309 評価すると文字になる式には、次のものがある。
|
|
310
|
|
311 (1) 文字表記
|
|
312
|
|
313 文字表記を下記に示す(「評価すると文字列になる式」の文字表記とは異な
|
|
314 る)。
|
|
315
|
|
316 文字 「(」「)」「'」「"」「\」「;」「 」を除く。
|
|
317
|
|
318 '文字' この式でいう文字から「'」「\」「^」は除かれる。
|
|
319
|
|
320 '^文字' コントロール文字を表す。文字は ASCIIコード 32〜126 の文
|
|
321 字または英小文字。
|
|
322 「^?」は、DELコードを表わす。
|
|
323
|
|
324 '\文字' 「\」の次の文字を表す。この式でいう文字からは数字と
|
|
325 odx は除かれる。
|
|
326 '\n','\t','\b','\r','\f' はC言語のエスケープ符号列と同
|
|
327 じ。'\e','\E' は ESCコードを表わす。
|
|
328
|
|
329 '\8進コード … …' その8進コードを持つ文字を表す。
|
|
330
|
|
331 '\o8進コード … …' その8進コードを持つ文字を表す。
|
|
332
|
|
333 '\d10進コード … …' その10進コードを持つ文字を表す。
|
|
334
|
|
335 '\x16進コード … …' その16進コードを持つ文字を表す。
|
|
336
|
|
337 (2) (関数名 評価すると文字になる式)
|
|
338
|
|
339 関数名 機 能
|
|
340
|
|
341 toupper 引数が ASCII 英小文字ならば大文字に変える。
|
|
342 (toupper a) → A
|
|
343
|
|
344 tolower 引数が ASCII 英大文字ならば小文字に変える。
|
|
345 (tolower A) → a
|
|
346
|
|
347 toupdown 引数が ASCII 英小(大)文字ならば大(小)文字に変える。
|
|
348 (toupdown a) → A
|
|
349 (toupdown A) → a
|
|
350
|
|
351 tozenalpha 引数が ASCII 文字ならば対応する全角文字に変える。
|
|
352 (tozenalpha A) → A
|
|
353
|
|
354 tohira 引数が全角カタカナならばひらがなに変える。
|
|
355 (tohira ア) → あ
|
|
356
|
|
357 tokata 引数がひらがなならば全角カタカナに変える。
|
|
358 (tokata あ) → ア
|
|
359
|
|
360 tozenhira 引数が半角カタカナならばひらがなに変える。
|
|
361 (tozenhira ア) → あ
|
|
362
|
|
363 tozenkata 引数が半角カタカナならば全角カタカナに変える。
|
|
364 (tozenkata ア) → ア
|
|
365
|
|
366 value 引数の文字コードを実際の数値にする。
|
|
367 (value 0) → '\x0'
|
|
368 (value A) → '\xA'
|
|
369 (value F) → '\xf'
|
|
370
|
|
371 (3) (関数名 評価すると文字になる式 評価すると文字になる式)
|
|
372
|
|
373 関数名 機 能
|
|
374
|
|
375 + 引数の和を値にする。
|
|
376
|
|
377 - 引数の差を値にする。
|
|
378
|
|
379 * 引数の積を値にする。
|
|
380
|
|
381 / 引数の商を値にする。
|
|
382 (+ あ '\d256' ) → ア
|
|
383 (+ 0 (value 3)) → 3
|
|
384
|
|
385 (4) (変数名)
|
|
386
|
|
387 関数名、機能、宣言名 (defvar) といずれも一致しない英字で始まる英
|
|
388 数字からなる文字列。(変数の項参照。)
|
|
389 ただし、'_' も英字とみなす。
|
|
390
|
|
391
|
|
392 評価すると文字列になる式には、次のものがある。
|
|
393
|
|
394 (1) "文字表記 … "
|
|
395
|
|
396 文字表記を下記に示す(「評価すると文字になる式」の文字表記とは異な
|
|
397 る)。
|
|
398
|
|
399 文字 「"」「^」「\」を除く。
|
|
400
|
|
401 ^文字 コントロール文字を表す。文字は ASCII コード 32〜126 の文
|
|
402 字または英小文字。「^?」は、DELコードを表わす。
|
|
403
|
|
404 \文字 文字は数字と odx を除く。
|
|
405 '\n','\t','\b','\r','\f' はC言語のエスケープ符号列と同
|
|
406 じ。'\e','\E' は ESCコードを表わす。
|
|
407
|
|
408 \8進コード … …[;] その8進コードを持つ文字を表す。
|
|
409 後に数字が続く場合「;」が必要。
|
|
410
|
|
411 \o8進コード … …[;] その8進コードを持つ文字を表す。
|
|
412 後に数字が続く場合「;」が必要。
|
|
413
|
|
414 \d10進コード … …[;] その10進コードを持つ文字を表す。
|
|
415 後に数字が続く場合「;」が必要。
|
|
416
|
|
417 \x16進コード … …[;] その16進コードを持つ文字を表す。
|
|
418 後に数字が続く場合「;」が必要。
|
|
419
|
|
420 "" (文字表記の省略)はヌルストリングを表す。
|
|
421
|
|
422 (2) (関数名 評価すると文字列になる式)
|
|
423
|
|
424 関数名 機 能
|
|
425 tohankata 引数が全角ひらがな・全角カタカナならば半角カ
|
|
426 タカナに変える。
|
|
427 (tohankata が) → ガ
|
|
428
|
|
429 last= 最後にマッチした文字列の最後の文字と関数の引数
|
|
430 (評価すると文字になる式) が一致するか。一致す
|
|
431 るなら (last= 評価すると文字になる式) は空文字
|
|
432 列になる。
|
|
433 (last= A) 〜 あ
|
|
434
|
|
435 ただし、last= は、入力コードにのみ記述できる。
|
|
436
|
|
437 todigit 第一引数で与えられたコードを第二引数のコードの
|
|
438 進法の数に変換する。
|
|
439
|
|
440 dakuadd 引数の後ろに濁点を付ける。
|
|
441
|
|
442 handakuadd 引数の後ろに半濁点を付ける。
|
|
443
|
|
444
|
|
445 (3) (関数名 モード名)
|
|
446
|
|
447 モード名はモード定義表で宣言されたものではなくてはならない。
|
|
448
|
|
449 関数名 機 能
|
|
450
|
|
451 if 引数であるモードが on なら(if モード名)は空文字
|
|
452 列になる。
|
|
453 (if katakana)VU ヴ
|
|
454
|
|
455 unless 引数であるモードが off なら(unless モード名) は
|
|
456 空文字列になる。
|
|
457 (unless katakana)VU ぶ
|
|
458
|
|
459 on 引数であるモードを on にする。
|
|
460 (on katakana)
|
|
461
|
|
462 off 引数であるモードを off にする。
|
|
463 (off katakana)
|
|
464
|
|
465 switch 引数であるモードが on なら off に、 off なら on に
|
|
466 する。
|
|
467 (switch katakana)
|
|
468
|
|
469 ただし、if,unless は、入力コードにのみ記述できる。
|
|
470 また、on,off,switch は、本処理表の出力コードにのみ記述できる。
|
|
471
|
|
472
|
|
473 (4) (関数名)
|
|
474
|
|
475 本処理表の出力コードにのみ記述できる。
|
|
476
|
|
477 関数名 機 能
|
|
478
|
|
479 allon 全てのモードを on にする。
|
|
480
|
|
481 alloff 全てのモードを off にする。
|
|
482
|
|
483
|
|
484
|
|
485 機 能
|
|
486
|
|
487 機能には下記の2つがあり、それぞれ単独で用いられる。
|
|
488
|
|
489 (error) 入力コードの部分のコードが入力されたらエラーとみなす。
|
|
490
|
|
491 (restart) 前回のモード定義表を改めて読み込んで変換の再設定を行
|
|
492 う。
|
|
493 新しい変換表にエラーがあればエラーメッセージを表示し
|
|
494 た後、元の変換表の設定に戻す。
|
|
495
|
|
496
|
|
497
|
|
498 変数宣言
|
|
499
|
|
500 (defvar 変数表記 (list 文字表記 … … ))
|
|
501 (defvar 変数表記 (all))
|
|
502
|
|
503 評価すると文字になる式として使用する変数とその変域の定義を行う。
|
|
504 宣言は、上記の方法で行う。
|
|
505 変数表記は、変数名 または (変数名 … … ) である。
|
|
506 文字表記は、「評価すると文字になる式」の文字表記と同じ。
|
|
507 list は、その引数の文字を変域とする。
|
|
508 all は、全ての文字を変域とする。
|
|
509 変数の項参照。
|
|
510
|
|
511
|
|
512
|
|
513
|
|
514 関数の使用上の注意
|
|
515
|
|
516 関数は評価すると文字または文字列になる式であるため、
|
|
517 (toupper (tolower Y))
|
|
518 と書ける。しかし、次のように評価すると文字列になる関数は他の関数の引
|
|
519 数にできない。
|
|
520 (toupper (tohankata か))
|
|
521
|
|
522 3.5.6 変数
|
|
523 変数は同一パターンの変換が何通りもある場合に効果を発揮する。
|
|
524 例えば、
|
|
525
|
|
526 ┌─────────────────────────┐
|
|
527 │ (defvar a1 (list K S T H Y R W G Z D B P)) │
|
|
528 │ (a1)(a1) っ (a1) │
|
|
529 └─────────────────────────┘
|
|
530
|
|
531 上の2行は次の記述と同じ変換がされる。
|
|
532 これはローマ字かな変換における促音処理である。
|
|
533
|
|
534 ┌─────────┐
|
|
535 │ KK っ K │
|
|
536 │ SS っ S │
|
|
537 │ TT っ T │
|
|
538 │ ・ ・ ・ │
|
|
539 │ ・ ・ ・ │
|
|
540 │ ( 中 略 ) │
|
|
541 │ PP っ P │
|
|
542 └─────────┘
|
|
543
|
|
544 変数は、変数宣言 (defvar) で行った変域の文字を値とする。
|
|
545
|
|
546
|
|
547 変数使用上の注意事項
|
|
548
|
|
549 (1) 使用する変数はその表の中において defvar で定義しなければならな
|
|
550 い。
|
|
551
|
|
552 (2) 変数の定義はその表の中全体で有効である。
|
|
553 1つの表でa1という変数を定義し、別な表でa1という変数を別様に定義し
|
|
554 てもかまわない。
|
|
555 この2つのa1は別の変数として扱われる。
|
|
556 そのとき、逆に1つの表の中で同名の変数を2度 defvar することはできな
|
|
557 い。
|
|
558
|
|
559 (3) 対応表の1行の中では、同名の変数は常に同じ値をもつ。
|
|
560
|
|
561 (defvar a1 (list A B))
|
|
562 (a1)(tolower (a1)) 3
|
|
563
|
|
564 この場合、「Aa」,「Bb」という文字列が「3」に変換される。
|
|
565 「Ab」,「Ba」は変換されない。
|
|
566
|
|
567 (4) 入力コードと表の入力コード部とのマッチングは左から行われる。このため、
|
|
568 表の入力コード部を左から見ていったとき、ある変数が特定の文字にマッチ
|
|
569 される前に関数の引数として現れてはいけない。
|
|
570
|
|
571 (defvar a1 (list a b))
|
|
572 (toupper (a1))(a1) 3
|
|
573
|
|
574 この場合「Aa」と入力すると「3」に変換してくれそうに思えるが、実際に
|
|
575 は左からマッチさせようとして、「A」と (toupper (a1)) のマッチングを試
|
|
576 みても、まだ値を持たない変数a1が toupper の引数になっているので許さ
|
|
577 れない。
|
|
578 このような設定は、表読み込み時にチェックされる。
|
|
579
|
|
580 (5) 変数を出力コード部やバッファ残り部に書く場合も、入力コード部に現れる
|
|
581 (つまり、入力コードとのマッチングで何らかの値を代入される) 変数でな
|
|
582 ければならない。
|
|
583
|
|
584 (defvar a1 (list K S))
|
|
585 (defvar a2 (list a))
|
|
586 (a1)(a1) (a2) (a1)
|
|
587
|
|
588 この場合、入力コード部でマッチングが行われない変数 a2 が出力コード部
|
|
589 に現れているので規則違反である。
|
|
590
|
|
591 3.5.7 変換の方式
|
|
592 まず、入力されるコードを文字単位にまとめる (2バイトコードの文字も
|
|
593 1文字として扱う)。これを入力コードという。これは、前・本・後の3処理を経
|
|
594 て最終出力となる。前処理では、入力コード1つに対して出力コード1つが対
|
|
595 応付けられる。この出力コードが本処理コードの入力コードになる。
|
|
596
|
|
597 前処理表のうち現在使用されている表の入力コードの部分を上から順に見て
|
|
598 いく。最初に実際の入力コードと合致したところで、その行の出力コードの部
|
|
599 分に書かれてあるものが出力される。ただし、表が複数選択されているときは、
|
|
600 モード定義表で先に参照されたものから見ていく。また、実際の入力コードと
|
|
601 合致するものが表にないとき (表が1つも選択されない時も含む) は、入力コ
|
|
602 ードがそのまま出力される。これは、本処理、後処理においても同様である。
|
|
603
|
|
604 本処理では、入力コードが表の入力コードの部分と合致する可能性がある (入
|
|
605 力コードの部分の先頭から何文字かは一致している状態) 限り、入力コードは、
|
|
606 バッファに追加される。バッファに入力コードが追加されるごとに、本処理表
|
|
607 の入力コードの部分を上から順に見ていってバッファと比較される。ここで、
|
|
608 バッファの内容が表の入力コードの部分の最長のものと合致する可能性 (入力
|
|
609 コードに部分の先頭から何文字かは一致している状態) があれば、変換未確定
|
|
610 という判断のもとに、変換を行わずに次の入力コードを待つ。
|
|
611
|
|
612 ただし、画面処理などの都合上、バッファ内のコードは未確定文字として出
|
|
613 力される。他に入力エラー、モード変更などを知らせるコードも出力される。
|
|
614
|
|
615 これらの出力コードは本来の出力コードとは区別され、後処理は行われない。
|
|
616 (詳細は、ライブラリの romkan_getc(3J_T) を参照)
|
|
617
|
|
618 バッファの内容が表の入力コードの部分の最長のものと合致したら (同じ長
|
|
619 さのものがあれば先に見つかったものと合致する)、その出力コードが出力され
|
|
620 る。バッファ残りの部分がなければバッファ内の合致した部分が消され、あれ
|
|
621 ば、バッファ内の合致した部分と入れ替わり、以上の操作が繰り返される。
|
|
622
|
|
623 表に合致する可能性のあるものが見つからなかった場合、バッファの先頭の
|
|
624 1文字がそのまま出力される。合致したものの出力コードの部分がモードの状
|
|
625 態を変える関数 (on,off,switch など) である場合、使用される対応表がモー
|
|
626 ド定義表の記述にしたがって変更される。これらのモードを変える関数は、モ
|
|
627 ードの状態 (on, off) に関係なく、絶えず使用される表に記述しておく方が良
|
|
628 い。また、機能の (restart) の入力コードの部分に合致した場合は、モード定
|
|
629 義表そのものの再読み込みが行われる。ただし、そのモード定義表は前回と同
|
|
630 じファイルである。この機能を使うことで、オートマトンの使用中に修正した
|
|
631 変換表 (モード定義表を含む) を、オートマトンを終えずにその変換内容を変
|
|
632 えることができる。
|
|
633
|
|
634 後処理では、1つの入力コードに対して1つ以上の出力コードが最終出力と
|
|
635 して出力される。出力コードが1つ以上出力されることを除いて前処理と同じ
|
|
636 である。
|
|
637
|
|
638 下記の例では、「Ls」または「LS」が入力されたとき「ls -la 改行」が出力
|
|
639 される。
|
|
640
|
|
641
|
|
642 前処理表
|
|
643 ┌──────────────┐
|
|
644 │ (defvar a1 (list s)) │
|
|
645 │ (a1) (toupper (a1)) │
|
|
646 └──────────────┘
|
|
647
|
|
648 本処理表
|
|
649 ┌──────────────┐
|
|
650 │ LS "LS -la\n" │
|
|
651 └──────────────┘
|
|
652
|
|
653 後処理表
|
|
654 ┌──────────────┐
|
|
655 │ (defvar a1 (all)) │
|
|
656 │ (a1) (tolower (a1)) │
|
|
657 └──────────────┘
|