Revision | 49e6db19fe256d3f6308693d3cc1700914055b24 (tree) |
---|---|
Time | 2017-03-07 23:28:54 |
Author | dhrname <dhrname@user...> |
Commiter | dhrname |
Modify the hiragana2token function
@@ -92,24 +92,37 @@ ST_UTF8_Char_Code ST_Hiragana_Code = { | ||
92 | 92 | u8"っ", u8"ゃ", u8"ゅ", u8"ょ", |
93 | 93 | u8"ぱ", u8"ぴ", u8"ぷ", u8"ぺ", u8"ぽ", |
94 | 94 | u8"ゐ", u8"ゑ", u8"ゔ", u8"ゕ", u8"ゖ", |
95 | - u8"゛", u8"゜", u8"ゝ", u8"ゞ" | |
95 | + u8"゛", u8"゜", u8"ゝ", u8"ゞ", | |
96 | + u8"、", u8"。" | |
96 | 97 | }, |
97 | - 89 | |
98 | + 91 | |
98 | 99 | }; |
99 | 100 | |
100 | 101 | /*hiragana2token 関数 |
101 | - * ひらがなをトークン化する。 | |
102 | + * ひらがなや句読点をトークン化して、スキップする。 | |
102 | 103 | * posはtextの現在位置。listposはarrayの現在位置*/ |
103 | -static inline uint_fast32_t hiragana2token(ST_Text_Code tc, uint_fast32_t listpos) | |
104 | +static inline uint_fast32_t hiragana2token(ST_Text_Code tc, uint_fast32_t listpos, size_t length) | |
104 | 105 | { |
105 | 106 | uint_fast32_t local_length = 0; |
106 | 107 | uint_fast32_t cache = 0; |
107 | - for (uint_fast16_t i = 0; i < ST_Hiragana_Code.length; i++) | |
108 | + /*resultは文字列が一致したかどうかのチェック。0ならば、不一致。それ以外の数値は一致したとみなす*/ | |
109 | + size_t result = 0; | |
110 | + while (local_length <= length) | |
108 | 111 | { |
112 | + result = 0; | |
109 | 113 | cache = tc.pos; |
110 | 114 | tc.pos += local_length; |
111 | - local_length += text2token(ST_HIRAGANA_TOKEN, tc, listpos, ST_Hiragana_Code.map[i], ST_Hiragana_Code.cache_length[i]); | |
115 | + for (uint_fast16_t i = 0; i < ST_Hiragana_Code.length; i++) | |
116 | + { | |
117 | + result += text2token(ST_FUNCTION_APPLY_TOKEN, tc, listpos, ST_Hiragana_Code.map[i], ST_Hiragana_Code.cache_length[i]); | |
118 | + } | |
119 | + local_length += result; | |
112 | 120 | tc.pos = cache; |
121 | + if (!result) | |
122 | + { | |
123 | + /*一致する文字列がなくなるまで続ける*/ | |
124 | + return local_length; | |
125 | + } | |
113 | 126 | } |
114 | 127 | return local_length; |
115 | 128 | } |
@@ -148,13 +161,18 @@ uint16_t *ST_tokenize(const int_least8_t *text, ST_Token_Mode *array) | ||
148 | 161 | ST_Text_Code tc = {text, array, pos}; |
149 | 162 | for (uint_fast32_t i = 0; i < length; i++) |
150 | 163 | { |
151 | - /*文字がマッチングした分だけ、posメンバが増える*/ | |
164 | + /*文字がマッチングした分だけ、textの現在位置を示すposメンバが増える*/ | |
152 | 165 | tc.pos += text2token(ST_KAGIKAKKO_BEGIN_TOKEN, tc, i, u8"「", strlength[0]) |
153 | 166 | + text2token(ST_KAGIKAKKO_END_TOKEN, tc, i, u8"」", strlength[1]) |
154 | 167 | + text2token(ST_PARENTHESES_BEGIN_TOKEN, tc, i, u8"(", strlength[2]) |
155 | 168 | + text2token(ST_PARENTHESES_END_TOKEN, tc, i, u8")", strlength[3]) |
156 | - + hiragana2token(tc, i) | |
169 | + + hiragana2token(tc, i, length) | |
157 | 170 | + text2token(ST_VARIABLE_TOKEN, tc, i, u8"愛", strlen(u8"愛")); |
171 | + if (tc.pos >= length) | |
172 | + { | |
173 | + /*現在位置がテキストの容量を超えた場合*/ | |
174 | + return array; | |
175 | + } | |
158 | 176 | } |
159 | 177 | return array; |
160 | 178 | } |
@@ -55,7 +55,7 @@ void eprint_log (uint8_t*); | ||
55 | 55 | /*トークン化したときの識別用のマジックナンバー*/ |
56 | 56 | typedef enum { |
57 | 57 | ST_UNKNOWN_TOKEN = 0, |
58 | - ST_HIRAGANA_TOKEN, | |
58 | + ST_FUNCTION_APPLY_TOKEN, | |
59 | 59 | ST_VARIABLE_TOKEN, |
60 | 60 | ST_PARENTHESES_BEGIN_TOKEN, |
61 | 61 | ST_PARENTHESES_END_TOKEN, |
@@ -67,7 +67,7 @@ typedef enum { | ||
67 | 67 | * 文字列をトークン化処理して、入力した配列にトークン番号を割り当てる。入力値はトークン化したい文章と配列*/ |
68 | 68 | uint16_t* ST_tokenize(const int_least8_t*, ST_Token_Mode*); |
69 | 69 | |
70 | -#define ST_CHAR_CODE_MAP_MAX 90 | |
70 | +#define ST_CHAR_CODE_MAP_MAX 92 | |
71 | 71 | |
72 | 72 | /*UTF8用のマップ |
73 | 73 | * このマップをもとに、文字列のパターンを照合する*/ |
@@ -121,11 +121,25 @@ int main(int argc, char **argv) | ||
121 | 121 | tokens1[3] = 0; |
122 | 122 | ST_tokenize(u8"ああああ", tokens1); |
123 | 123 | assert(tokens1[0] == 1); |
124 | - assert(tokens1[1] == 1); | |
125 | - assert(tokens1[2] == 1); | |
126 | - assert(tokens1[3] == 1); | |
124 | + assert(tokens1[1] == 0); | |
125 | + assert(tokens1[2] == 0); | |
126 | + assert(tokens1[3] == 0); | |
127 | + init_token(tokens1); | |
128 | + tokens1[3] = 0; | |
129 | + ST_tokenize(u8"、。。、", tokens1); | |
130 | + assert(tokens1[0] == 1); | |
131 | + assert(tokens1[1] == 0); | |
132 | + assert(tokens1[2] == 0); | |
133 | + assert(tokens1[3] == 0); | |
134 | + init_token(tokens1); | |
135 | + tokens1[3] = 0; | |
136 | + ST_tokenize(u8"、あ。愛", tokens1); | |
137 | + assert(tokens1[0] == 1); | |
138 | + assert(tokens1[1] == 2); | |
139 | + assert(tokens1[2] == 0); | |
140 | + assert(tokens1[3] == 0); | |
127 | 141 | |
128 | - ST_Token_Mode tokenmode = ST_HIRAGANA_TOKEN; | |
142 | + ST_Token_Mode tokenmode = ST_FUNCTION_APPLY_TOKEN; | |
129 | 143 | assert(tokenmode == 1); |
130 | 144 | tokenmode = ST_UNKNOWN_TOKEN; |
131 | 145 | assert(tokenmode == 0); |