2 * ʸÀá¤Î¶³¦¤ò¸¡½Ð¤¹¤ë¡£
4 * metaword¤ÎÁªÂò¤Ë¤Ï¥Ó¥¿¥Ó¥¢¥ë¥´¥ê¥º¥à¤ò»È¤¦
6 * anthy_eval_border() ¤Ç»ØÄꤵ¤ì¤¿Îΰè¤òʸÀá¤Ëʬ³ä¤¹¤ë
8 * Funded by IPA̤Ƨ¥½¥Õ¥È¥¦¥§¥¢ÁϤ»ö¶È 2001 10/29
9 * Copyright (C) 2000-2003 TABATA Yusuke, UGAWA Tomoharu
14 #include <anthy/alloc.h>
15 #include <anthy/splitter.h>
16 #include "wordborder.h"
19 border_check(struct meta_word* mw,
23 if (mw->from < border) {
24 /* ÀèƬ¤ÎʸÀá¤ÎÃ椫¤é»Ï¤Þ¤ëmw¤ÏʸÀá¶èÀÚ¤ê¤Ë¤Ô¤Ã¤¿¤ê¤¢¤Ã¤Æ¤¤¤Ê¤¤¤È¥À¥á */
25 if (mw->from == from && mw->from + mw->len == border) {
31 /* ¸å¤í¤ÎʸÀá¤Ï̵¾ò·ï¤Ë»ÈÍѲÄǽ */
37 * ºÆµ¢Åª¤Ëmetaword¤¬»ÈÍѲÄǽ¤«¥Á¥§¥Ã¥¯¤¹¤ë
40 metaword_constraint_check(struct splitter_context *sc,
46 if (mw->can_use != unchecked) return;
48 switch(anthy_metaword_type_tab[mw->type].check){
50 mw->can_use = border_check(mw, from, border) ? ok : ng;
54 struct meta_word* mw1 = mw->mw1;
55 struct meta_word* mw2 = mw->mw2;
57 if (mw1&&mw2&&mw1->from + mw1->len == border) {
58 /* ¤Á¤ç¤¦¤É¶Ìܤ˥ޡ¼¥¯¤¬Æþ¤Ã¤Æ¤ë */
63 metaword_constraint_check(sc, mw1, from, border);
65 metaword_constraint_check(sc, mw2, mw2->from, border);
67 if ((!mw1 || mw1->can_use == ok) && (!mw2 || mw2->can_use == ok)) {
75 metaword_constraint_check(sc, mw->mw1, from, border);
76 mw->can_use = mw->mw1->can_use;
80 struct meta_word* itr = mw;
83 /* ¸Ä¡¹¤ÎʸÀá¤Î°ì¤Ä¤Ç¤âʸÀá¶èÀÚ¤ê¤ò¤Þ¤¿¤¬¤Ã¤Æ¤¤¤ì¤Ð¡¢¤³¤ÎÊ£¹ç¸ì¤Ï»È¤¨¤Ê¤¤ */
84 for (; itr && itr->type == MW_NUMBER; itr = itr->mw2) {
85 struct meta_word* mw1 = itr->mw1;
86 if (!border_check(mw1, from, border)) {
93 case MW_CHECK_COMPOUND:
95 struct meta_word* itr = mw;
98 /* ¸Ä¡¹¤ÎʸÀá¤Î°ì¤Ä¤Ç¤âʸÀá¶èÀÚ¤ê¤ò¤Þ¤¿¤¬¤Ã¤Æ¤¤¤ì¤Ð¡¢¤³¤ÎÊ£¹ç¸ì¤Ï»È¤¨¤Ê¤¤ */
99 for (; itr && (itr->type == MW_COMPOUND_HEAD || itr->type == MW_COMPOUND); itr = itr->mw2) {
100 struct meta_word* mw1 = itr->mw1;
101 if (!border_check(mw1, from, border)) {
108 case MW_CHECK_OCHAIRE:
110 struct meta_word* mw1;
111 if (border_check(mw, from, border)) {
112 for (mw1 = mw; mw1; mw1 = mw1->mw1) {
116 for (mw1 = mw; mw1; mw1 = mw1->mw1) {
125 printf("try to check unknown type of metaword (%d).\n", mw->type);
130 * Á´¤Æ¤Îmetaword¤Ë¤Ä¤¤¤Æ»ÈÍѤǤ¤ë¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë
133 metaword_constraint_check_all(struct splitter_context *sc,
138 struct word_split_info_cache *info;
139 info = sc->word_split_info;
141 /* ¤Þ¤ºunchecked¤Ë¤¹¤ë */
142 for (i = from; i < to; i ++) {
143 struct meta_word *mw;
144 for (mw = info->cnode[i].mw;
146 mw->can_use = unchecked;
150 /* ¼¡¤Ë¹çÀ®¤µ¤ì¤¿metaword¤Ë¤Ä¤¤¤Æ¥Á¥§¥Ã¥¯ */
151 for (i = from; i < to; i ++) {
152 struct meta_word *mw;
153 for (mw = info->cnode[i].mw; mw; mw = mw->next) {
154 metaword_constraint_check(sc, mw, from, border);
160 * ¤³¤³¤«¤éʸÀᶳ¦¤ò¥Þ¡¼¥¯¤¹¤ë
163 anthy_eval_border(struct splitter_context *sc, int from, int from2, int to)
165 struct meta_word *mw;
168 /* ʸÀá¸õÊä¤Î¤¦¤Á»È¤¨¤ë¤â¤Î¤Î¤ßÁªÂò */
169 metaword_constraint_check_all(sc, from, to, from2);
171 /* from¤Èfrom2¤Î´Ö¤ò¥«¥Ð¡¼¤¹¤ëmeta_word¤¬¤¢¤ë¤«¤É¤¦¤«¤òõ¤¹¡£
172 * ¤¢¤ì¤Ð¡¢from¤«¤é²òÀϤò¹Ô¤¤¡¢¤Ê¤±¤ì¤Ðfrom2¤«¤é²òÀϤò¤¹¤ë¡£
175 for (mw = sc->word_split_info->cnode[from].mw; mw; mw = mw->next) {
176 if (mw->can_use == ok) {
185 /* ʸÀá¤Î¶³¦¤òÀßÄꤹ¤ë */
186 anthy_mark_borders(sc, from, to);