792 lines
34 KiB
C++
792 lines
34 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
//
|
|
// CThaiTrigramTrieIter
|
|
//
|
|
// History:
|
|
// created 8/99 aarayas
|
|
//
|
|
// ©1999 Microsoft Corporation
|
|
//----------------------------------------------------------------------------
|
|
#include "CThaiTrigramTrieIter.hpp"
|
|
|
|
|
|
bool IsTagEqual(WCHAR pos1, WCHAR pos2)
|
|
{
|
|
// if unambigious tags.
|
|
if (pos1 < 48)
|
|
return (pos1 == pos2);
|
|
else
|
|
{
|
|
switch (pos1)
|
|
{
|
|
case 48: // 48. ADVI ADVN
|
|
return ((pos2 == 29) || (pos2 == 28));
|
|
case 49: // 49. ADVI ADVN NCMN
|
|
return ((pos2 == 29) || (pos2 == 28) || (pos2 == 5));
|
|
case 50: // 50. ADVI ADVN VSTA
|
|
return ((pos2 == 29) || (pos2 == 28) || (pos2 == 12));
|
|
case 51: // 51. ADVI VATT
|
|
return ((pos2 == 29) || (pos2 == 13));
|
|
case 52: // 52. ADVN ADVP
|
|
return ((pos2 == 28) || (pos2 == 30));
|
|
case 53: // 53. ADVN ADVP ADVS
|
|
return ((pos2 == 28) || (pos2 == 30) || (pos2 == 31));
|
|
case 54: // 54. ADVN ADVP DIAQ DIBQ JCMP JSBR RPRE *
|
|
return ((pos2 == 28) || (pos2 == 30) || (pos2 == 25));
|
|
case 55: // 55. ADVN ADVP NCMN VATT
|
|
return ((pos2 == 28) || (pos2 == 30) || (pos2 == 5) || (pos2 == 13));
|
|
case 56: // 56. ADVN ADVP VSTA
|
|
return ((pos2 == 28) || (pos2 == 30) || (pos2 == 12));
|
|
case 57: // 57. ADVN ADVS DDAC DDAN DIAC VATT XVAE *
|
|
return ((pos2 == 28) || (pos2 == 31) || (pos2 == 20));
|
|
case 58: // 58. ADVN ADVS DDAN NCMN VATT VSTA *
|
|
return ((pos2 == 28) || (pos2 == 31) || (pos2 == 19));
|
|
case 59: // 59. ADVN ADVS NCMN
|
|
return ((pos2 == 28) || (pos2 == 31) || (pos2 == 5));
|
|
case 60: // 60. ADVN ADVS NCMN VATT
|
|
return ((pos2 == 28) || (pos2 == 31) || (pos2 == 5) || (pos2 == 13));
|
|
case 61: // 61. ADVN ADVS VACT
|
|
return ((pos2 == 28) || (pos2 == 31) || (pos2 == 11));
|
|
case 62: // 62. ADVN ADVS VATT
|
|
return ((pos2 == 28) || (pos2 == 31) || (pos2 == 13));
|
|
case 63: // 63. ADVN CFQC NCMN RPRE VSTA *
|
|
return ((pos2 == 28) || (pos2 == 35) || (pos2 == 5));
|
|
case 64: // 64. ADVN CLTV CNIT NCMN RPRE
|
|
return ((pos2 == 28) || (pos2 == 33) || (pos2 == 32) || (pos2 == 5) || (pos2 == 40));
|
|
case 65: // 65. ADVN DCNM
|
|
return ((pos2 == 28) || (pos2 == 26));
|
|
case 66: // 66. ADVN DDAC DDAN
|
|
return ((pos2 == 28) || (pos2 == 20) || (pos2 == 19));
|
|
case 67: // 67. ADVN DDAC DDAN NCMN PDMN
|
|
return ((pos2 == 28) || (pos2 == 20) || (pos2 == 19) || (pos2 == 5) || (pos2 == 8));
|
|
case 68: // 68. ADVN DDAC DDAN PDMN
|
|
return ((pos2 == 28) || (pos2 == 20) || (pos2 == 19) || (pos2 == 8));
|
|
case 69: // 69. ADVN DDAN DDBQ
|
|
return ((pos2 == 28) || (pos2 == 19) || (pos2 == 21));
|
|
case 70: // 70. ADVN DDAN DIAC PDMN VSTA
|
|
return ((pos2 == 28) || (pos2 == 19) || (pos2 == 23) || (pos2 == 8) || (pos2 == 12));
|
|
case 71: // 71. ADVN DDAN FIXN PDMN
|
|
return ((pos2 == 28) || (pos2 == 19) || (pos2 == 42) || (pos2 == 8));
|
|
case 72: // 72. ADVN DDAN NCMN
|
|
return ((pos2 == 28) || (pos2 == 19) || (pos2 == 5));
|
|
case 73: // 73. ADVN DDAQ
|
|
return ((pos2 == 28) || (pos2 == 22));
|
|
case 74: // 74. ADVN DDBQ
|
|
return ((pos2 == 28) || (pos2 == 21));
|
|
case 75: // 75. ADVN DDBQ RPRE VATT
|
|
return ((pos2 == 28) || (pos2 == 21) || (pos2 == 40) || (pos2 == 13));
|
|
case 76: // 76. ADVN DDBQ VATT VSTA XVAE *
|
|
return ((pos2 == 28) || (pos2 == 21) || (pos2 == 13) || (pos2 == 12));
|
|
case 77: // 77. ADVN DIAC
|
|
return ((pos2 == 28) || (pos2 == 21));
|
|
case 78: // 78. ADVN DIAC PDMN
|
|
return ((pos2 == 28) || (pos2 == 21) || (pos2 == 8));
|
|
case 79: // 79. ADVN DIBQ
|
|
return ((pos2 == 28) || (pos2 == 24));
|
|
case 80: // 80. ADVN DIBQ NCMN
|
|
return ((pos2 == 28) || (pos2 == 24) || (pos2 == 5));
|
|
case 81: // 81. ADVN DIBQ VACT VSTA
|
|
return ((pos2 == 28) || (pos2 == 24) || (pos2 == 11) || (pos2 == 12));
|
|
case 82: // 82. ADVN DIBQ VATT
|
|
return ((pos2 == 28) || (pos2 == 24) || (pos2 == 13));
|
|
case 83: // 83. ADVN DONM JCMP
|
|
return ((pos2 == 28) || (pos2 == 27) || (pos2 == 38));
|
|
case 84: // 84. ADVN DONM JSBR NCMN RPRE VATT XVAE *
|
|
return ((pos2 == 28) || (pos2 == 27) || (pos2 == 39) || (pos2 == 5));
|
|
case 85: // 85. ADVN EITT PNTR
|
|
return ((pos2 == 28) || (pos2 == 45) || (pos2 == 9));
|
|
case 86: // 86. ADVN FIXN
|
|
return ((pos2 == 28) || (pos2 == 42));
|
|
case 87: // 87. ADVN JCMP
|
|
return ((pos2 == 28) || (pos2 == 38));
|
|
case 88: // 88. ADVN JCRG
|
|
return ((pos2 == 28) || (pos2 == 37));
|
|
case 89: // 89. ADVN JCRG JSBR
|
|
return ((pos2 == 28) || (pos2 == 37) || (pos2 == 39));
|
|
case 90: // 90. ADVN JCRG JSBR XVBM XVMM
|
|
return ((pos2 == 28) || (pos2 == 37) || (pos2 == 39) || (pos2 == 14) || (pos2 == 16));
|
|
case 91: // 91. ADVN JCRG RPRE VACT VSTA XVAE *
|
|
return ((pos2 == 28) || (pos2 == 37) || (pos2 == 40) || (pos2 == 11));
|
|
case 92: // 92. ADVN JSBR
|
|
return ((pos2 == 28) || (pos2 == 39));
|
|
case 93: // 93. ADVN JSBR NCMN
|
|
return ((pos2 == 28) || (pos2 == 39) || (pos2 == 5));
|
|
case 94: // 94. ADVN JSBR RPRE VATT
|
|
return ((pos2 == 28) || (pos2 == 39) || (pos2 == 40) || (pos2 == 13));
|
|
case 95: // 95. ADVN JSBR RPRE XVAE
|
|
return ((pos2 == 28) || (pos2 == 39) || (pos2 == 40) || (pos2 == 18));
|
|
case 96: // 96. ADVN JSBR VSTA
|
|
return ((pos2 == 28) || (pos2 == 39) || (pos2 == 12));
|
|
case 97: // 97. ADVN JSBR XVAE XVBM
|
|
return ((pos2 == 28) || (pos2 == 39) || (pos2 == 18) || (pos2 == 14));
|
|
case 98: // 98. ADVN NCMN
|
|
return ((pos2 == 28) || (pos2 == 5));
|
|
case 99: // 99. ADVN NCMN RPRE VACT VATT VSTA
|
|
return ((pos2 == 28) || (pos2 == 5) || (pos2 == 40) || (pos2 == 11) || (pos2 == 12));
|
|
case 100: // 100. ADVN NCMN RPRE VACT XVAE
|
|
return ((pos2 == 28) || (pos2 == 5) || (pos2 == 40) || (pos2 == 18));
|
|
case 101: // 101. ADVN NCMN RPRE VATT
|
|
return ((pos2 == 28) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
|
|
case 102: // 102. ADVN NCMN VACT VATT VSTA
|
|
return ((pos2 == 28) || (pos2 == 5) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12));
|
|
case 103: // 103. ADVN NCMN VACT VSTA",
|
|
return ((pos2 == 28) || (pos2 == 5) || (pos2 == 11) || (pos2 == 12));
|
|
case 104: // 104. ADVN NCMN VATT
|
|
return ((pos2 == 28) || (pos2 == 5) || (pos2 == 13));
|
|
case 105: // 105. ADVN NCMN VATT VSTA
|
|
return ((pos2 == 28) || (pos2 == 5) || (pos2 == 13) || (pos2 == 12));
|
|
case 106: // 106. ADVN NEG
|
|
return ((pos2 == 28) || (pos2 == 46));
|
|
case 107: // 107. ADVN NPRP VATT
|
|
return ((pos2 == 28) || (pos2 == 1) || (pos2 == 13));
|
|
case 108: // 108. ADVN PDMN VACT
|
|
return ((pos2 == 28) || (pos2 == 8) || (pos2 == 11));
|
|
case 109: // 109. ADVN PNTR",
|
|
return ((pos2 == 28) || (pos2 == 9));
|
|
case 110: // 110. ADVN RPRE",
|
|
return ((pos2 == 28) || (pos2 == 40));
|
|
case 111: // 111. ADVN RPRE VACT VATT XVAE",
|
|
return ((pos2 == 28) || (pos2 == 40) || (pos2 == 11) || (pos2 == 13));
|
|
case 112: // 112. ADVN RPRE VACT XVAM XVBM
|
|
return ((pos2 == 28) || (pos2 == 40) || (pos2 == 11) || (pos2 == 15) || (pos2 == 14));
|
|
case 113: // 113. ADVN RPRE VATT VSTA
|
|
return ((pos2 == 28) || (pos2 == 40) || (pos2 == 13) || (pos2 == 12));
|
|
case 114: // 114. ADVN RPRE VSTA
|
|
return ((pos2 == 28) || (pos2 == 40) || (pos2 == 12));
|
|
case 115: // 115. ADVN VACT
|
|
return ((pos2 == 28) || (pos2 == 11));
|
|
case 116: // 116. ADVN VACT VATT
|
|
return ((pos2 == 28) || (pos2 == 11) || (pos2 == 13));
|
|
case 117: // 117. ADVN VACT VATT VSTA
|
|
return ((pos2 == 28) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12));
|
|
case 118: // 118. ADVN VACT VATT VSTA XVAM XVBM
|
|
return ((pos2 == 28) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12) || (pos2 == 15) || (pos2 == 14));
|
|
case 119: // 119. ADVN VACT VSTA
|
|
return ((pos2 == 28) || (pos2 == 11) || (pos2 == 12));
|
|
case 120: // 120. ADVN VACT VSTA XVAE
|
|
return ((pos2 == 28) || (pos2 == 11) || (pos2 == 12) || (pos2 == 18));
|
|
case 121: // 121. ADVN VACT XVAE
|
|
return ((pos2 == 28) || (pos2 == 11) || (pos2 == 18));
|
|
case 122: // 122. ADVN VATT
|
|
return ((pos2 == 28) || (pos2 == 13));
|
|
case 123: // 123. ADVN VATT VSTA
|
|
return ((pos2 == 28) || (pos2 == 13) || (pos2 == 12));
|
|
case 124: // 124. ADVN VATT VSTA XVAM XVBM XVMM
|
|
return ((pos2 == 28) || (pos2 == 13) || (pos2 == 12) || (pos2 == 15) || (pos2 == 14));
|
|
case 125: // 125. ADVN VATT XVBM
|
|
return ((pos2 == 28) || (pos2 == 13) || (pos2 == 14));
|
|
case 126: // 126. ADVN VSTA
|
|
return ((pos2 == 28) || (pos2 == 12));
|
|
case 127: // 127. ADVN VSTA XVAE
|
|
return ((pos2 == 28) || (pos2 == 12) || (pos2 == 18));
|
|
case 128: // 128. ADVN VSTA XVBM",
|
|
return ((pos2 == 28) || (pos2 == 12) || (pos2 == 14));
|
|
case 129: // 129. ADVN XVAE
|
|
return ((pos2 == 28) || (pos2 == 18));
|
|
case 130: // 130. ADVN XVAM
|
|
return ((pos2 == 28) || (pos2 == 15));
|
|
case 131: // 131. ADVN XVBM XVMM
|
|
return ((pos2 == 28) || (pos2 == 14) || (pos2 == 16));
|
|
case 132: // 132. ADVP JSBR RPRE VATT
|
|
return ((pos2 == 30) || (pos2 == 39) || (pos2 == 40) || (pos2 == 13));
|
|
case 133: // 133. ADVP VATT
|
|
return ((pos2 == 30) || (pos2 == 13));
|
|
case 134: // 134. ADVS DDAC JCRG
|
|
return ((pos2 == 31) || (pos2 == 20) || (pos2 == 37));
|
|
case 135: // 135. ADVS DDAC JSBR
|
|
return ((pos2 == 31) || (pos2 == 20) || (pos2 == 39));
|
|
case 136: // 136. ADVS DDAN VSTA
|
|
return ((pos2 == 31) || (pos2 == 19) || (pos2 == 12));
|
|
case 137: // 137. ADVS DIAC
|
|
return ((pos2 == 31) || (pos2 == 23));
|
|
case 138: // 138. ADVS DONM
|
|
return ((pos2 == 31) || (pos2 == 27));
|
|
case 139: // 139. ADVS JCRG JSBR
|
|
return ((pos2 == 31) || (pos2 == 37) || (pos2 == 39));
|
|
case 140: // 140. ADVS JCRG JSBR RPRE
|
|
return ((pos2 == 31) || (pos2 == 37) || (pos2 == 39) || (pos2 == 40));
|
|
case 141: // 141. ADVS JSBR
|
|
return ((pos2 == 31) || (pos2 == 39));
|
|
case 142: // 142. ADVS JSBR RPRE
|
|
return ((pos2 == 31) || (pos2 == 39) || (pos2 == 40));
|
|
case 143: // 143. ADVS NCMN
|
|
return ((pos2 == 31) || (pos2 == 5));
|
|
case 144: // 144. ADVS VATT
|
|
return ((pos2 == 31) || (pos2 == 13));
|
|
case 145: // 145. CFQC CLTV CNIT DCNM JCRG JSBR NCMN RPRE XVBM
|
|
return ((pos2 == 35) || (pos2 == 33) || (pos2 == 32));
|
|
case 146: // 146. CFQC CNIT PREL
|
|
return ((pos2 == 35) || (pos2 == 32) || (pos2 == 10));
|
|
case 147: // 147. CFQC NCMN
|
|
return ((pos2 == 35) || (pos2 == 5));
|
|
case 148: // 148. CLTV CNIT NCMN
|
|
return ((pos2 == 33) || (pos2 == 32) || (pos2 == 5));
|
|
case 149: // 149. CLTV CNIT NCMN RPRE
|
|
return ((pos2 == 33) || (pos2 == 32) || (pos2 == 5) || (pos2 == 40));
|
|
case 150: // 150. CLTV CNIT NCMN VSTA
|
|
return ((pos2 == 33) || (pos2 == 32) || (pos2 == 5) || (pos2 == 12));
|
|
case 151: // 151. CLTV NCMN
|
|
return ((pos2 == 33) || (pos2 == 5));
|
|
case 152: // 152. CLTV NCMN VACT VATT
|
|
return ((pos2 == 33) || (pos2 == 5) || (pos2 == 11) || (pos2 == 13));
|
|
case 153: // 153. CLTV NCMN VATT
|
|
return ((pos2 == 33) || (pos2 == 5) || (pos2 == 13));
|
|
case 154: // 154. CMTR CNIT NCMN
|
|
return ((pos2 == 34) || (pos2 == 32) || (pos2 == 5));
|
|
case 155: // 155. CMTR NCMN
|
|
return ((pos2 == 34) || (pos2 == 5));
|
|
case 156: // 156. CMTR NCMN VATT VSTA
|
|
return ((pos2 == 34) || (pos2 == 5) || (pos2 == 13) || (pos2 == 12));
|
|
case 157: // 157. CNIT DDAC NCMN VATT
|
|
return ((pos2 == 32) || (pos2 == 20) || (pos2 == 5) || (pos2 == 13));
|
|
case 158: // 158. CNIT DONM NCMN RPRE VATT
|
|
return ((pos2 == 32) || (pos2 == 27) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
|
|
case 159: // 159. CNIT FIXN FIXV JSBR NCMN
|
|
return ((pos2 == 32) || (pos2 == 42) || (pos2 == 43) || (pos2 == 39) || (pos2 == 5));
|
|
case 160: // 160. CNIT JCRG JSBR NCMN PREL RPRE VATT
|
|
return ((pos2 == 32) || (pos2 == 37) || (pos2 == 39) || (pos2 == 5) || (pos2 == 40));
|
|
case 161: // 161. CNIT JSBR RPRE
|
|
return ((pos2 == 32) || (pos2 == 39) || (pos2 == 40));
|
|
case 162: // 162. CNIT NCMN
|
|
return ((pos2 == 32) || (pos2 == 5));
|
|
case 163: // 163. CNIT NCMN RPRE
|
|
return ((pos2 == 32) || (pos2 == 5) || (pos2 == 40));
|
|
case 164: // 164. CNIT NCMN RPRE VATT
|
|
return ((pos2 == 32) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
|
|
case 165: // 165. CNIT NCMN VACT
|
|
return ((pos2 == 32) || (pos2 == 5) || (pos2 == 11));
|
|
case 166: // 166. CNIT NCMN VSTA
|
|
return ((pos2 == 32) || (pos2 == 5) || (pos2 == 12));
|
|
case 167: // 167. CNIT NCNM
|
|
return ((pos2 == 32) || (pos2 == 5));
|
|
case 168: // 168. CNIT PPRS
|
|
return ((pos2 == 32) || (pos2 == 7));
|
|
case 169: // 169. DCNM DDAC DIAC DONM VATT VSTA *
|
|
return ((pos2 == 26) || (pos2 == 20) || (pos2 == 23));
|
|
case 170: // 170. DCNM DDAN DIAC
|
|
return ((pos2 == 26) || (pos2 == 19) || (pos2 == 23));
|
|
case 171: // 171. DCNM DIAC NCMN NCNM
|
|
return ((pos2 == 26) || (pos2 == 23) || (pos2 == 5) || (pos2 == 2));
|
|
case 172: // 172. DCNM DIBQ NCMN
|
|
return ((pos2 == 26) || (pos2 == 24) || (pos2 == 5));
|
|
case 173: // 173. DCNM DONM
|
|
return ((pos2 == 26) || (pos2 == 27));
|
|
case 174: // 174. DCNM NCMN
|
|
return ((pos2 == 26) || (pos2 == 2));
|
|
case 175: // 175. DCNM NCNM
|
|
return ((pos2 == 26) || (pos2 == 5));
|
|
case 176: // 176. DCNM NCNM VACT
|
|
return ((pos2 == 26) || (pos2 == 5) || (pos2 == 11));
|
|
case 177: // 177. DCNM VATT
|
|
return ((pos2 == 26) || (pos2 == 13));
|
|
case 178: // 178. DDAC DDAN
|
|
return ((pos2 == 20) || (pos2 == 19));
|
|
case 179: // 179. DDAC DDAN DIAC NCMN
|
|
return ((pos2 == 20) || (pos2 == 19) || (pos2 ==23) || (pos2 ==5));
|
|
case 180: // 180. DDAC DDAN DIAC VATT
|
|
return ((pos2 == 20) || (pos2 == 19) || (pos2 ==23) || (pos2 ==13));
|
|
case 181: // 181. DDAC DDAN EAFF PDMN
|
|
return ((pos2 == 20) || (pos2 == 19) || (pos2 ==44) || (pos2 ==8));
|
|
case 182: // 182. DDAC DDAN PDMN
|
|
return ((pos2 == 20) || (pos2 == 19) || (pos2 ==8));
|
|
case 183: // 183. DDAC DIAC VSTA
|
|
return ((pos2 == 20) || (pos2 == 23) || (pos2 ==12));
|
|
case 184: // 184. DDAC NCMN
|
|
return ((pos2 == 20) || (pos2 == 5));
|
|
case 185: // 185. DDAN DDBQ
|
|
return ((pos2 == 20) || (pos2 == 21));
|
|
case 186: // 186. DDAN DIAC PNTR
|
|
return ((pos2 == 20) || (pos2 == 23) || (pos2 == 9));
|
|
case 187: // 187. DDAN NCMN
|
|
return ((pos2 == 20) || (pos2 == 5));
|
|
case 188: // 188. DDAN NCMN RPRE VATT
|
|
return ((pos2 == 20) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
|
|
case 189: // 189. DDAN PDMN
|
|
return ((pos2 == 20) || (pos2 == 8));
|
|
case 190: // 190. DDAN RPRE
|
|
return ((pos2 == 20) || (pos2 == 40));
|
|
case 191: // 191. VATT
|
|
return (pos2 == 13);
|
|
case 192: // 192. DDAQ VATT
|
|
return ((pos2 == 22) || (pos2 == 13));
|
|
case 193: // 193. DDBQ DIBQ
|
|
return ((pos2 == 21) || (pos2 == 24));
|
|
case 194: // 194. DDBQ JCRG JSBR
|
|
return ((pos2 == 21) || (pos2 == 37) || (pos2 == 39));
|
|
case 195: // 195. DDBQ JCRG NCMN
|
|
return ((pos2 == 21) || (pos2 == 37) || (pos2 == 5));
|
|
case 196: // 196. DIAC PDMN
|
|
return ((pos2 == 23) || (pos2 == 8));
|
|
case 197: // 197. DIBQ JSBR RPRE VSTA
|
|
return ((pos2 == 24) || (pos2 == 39) || (pos2 == 40) || (pos2 == 12));
|
|
case 198: // 198. DIBQ NCMN
|
|
return ((pos2 == 24) || (pos2 == 5));
|
|
case 199: // 199. DIBQ VATT
|
|
return ((pos2 == 24) || (pos2 == 13));
|
|
case 200: // 200. DIBQ VATT VSTA
|
|
return ((pos2 == 24) || (pos2 == 13) || (pos2 == 12));
|
|
case 201: // 201. DIBQ XVBM
|
|
return ((pos2 == 24) || (pos2 == 14));
|
|
case 202: // 202. DONM NCMN RPRE
|
|
return ((pos2 == 27) || (pos2 == 5) || (pos2 == 40));
|
|
case 203: // 203. DONM VACT VATT VSTA
|
|
return ((pos2 == 27) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12));
|
|
case 204: // 204. DONM VATT
|
|
return ((pos2 == 27) || (pos2 == 13));
|
|
case 205: // 205. EAFF XVAE XVAM XVBM
|
|
return ((pos2 == 44) || (pos2 == 18) || (pos2 == 15) || (pos2 == 14));
|
|
case 206: // 206. EITT JCRG
|
|
return ((pos2 == 45) || (pos2 == 37));
|
|
case 207: // 207. FIXN FIXV NCMN
|
|
return ((pos2 == 42) || (pos2 == 43) || (pos2 == 5));
|
|
case 208: // 208. FIXN FIXV RPRE VSTA
|
|
return ((pos2 == 42) || (pos2 == 43) || (pos2 == 40) || (pos2 == 12));
|
|
case 209: // 209. FIXN JSBR NCMN PREL RPRE VSTA XVBM *
|
|
return ((pos2 == 42) || (pos2 == 39) || (pos2 == 5) || (pos2 == 10));
|
|
case 210: // 210. FIXN NCMN
|
|
return ((pos2 == 42) || (pos2 == 5));
|
|
case 211: // 211. FIXN VACT",
|
|
return ((pos2 == 42) || (pos2 == 11));
|
|
case 212: // 212. FIXN VACT VSTA",
|
|
return ((pos2 == 42) || (pos2 == 11) || (pos2 == 12));
|
|
case 213: // 213. FIXV JSBR RPRE",
|
|
return ((pos2 == 42) || (pos2 == 39) || (pos2 == 40));
|
|
case 214: // 214. JCMP JSBR",
|
|
return ((pos2 == 38) || (pos2 == 39));
|
|
case 215: // 215. JCMP RPRE VSTA",
|
|
return ((pos2 == 38) || (pos2 == 40) || (pos2 == 12));
|
|
case 216: // 216. JCMP VATT VSTA",
|
|
return ((pos2 == 38) || (pos2 == 13) || (pos2 == 12));
|
|
case 217: // 217. JCMP VSTA",
|
|
return ((pos2 == 38) || (pos2 == 12));
|
|
case 218: // 218. JCRG JSBR",
|
|
return ((pos2 == 37) || (pos2 == 39));
|
|
case 219: // 219. JCRG JSBR NCMN RPRE
|
|
return ((pos2 == 37) || (pos2 == 39) || (pos2 == 5) || (pos2 == 40));
|
|
case 220: // 220. JCRG JSBR RPRE",
|
|
return ((pos2 == 37) || (pos2 == 39) || (pos2 == 40));
|
|
case 221: // 221. JCRG RPRE
|
|
return ((pos2 == 37) || (pos2 == 40));
|
|
case 222: // 222. JCRG RPRE VATT VSTA
|
|
return ((pos2 == 37) || (pos2 == 40)|| (pos2 == 13)|| (pos2 == 12));
|
|
case 223: // 223. JCRG VSTA
|
|
return ((pos2 == 37) || (pos2 == 12));
|
|
case 224: // 224. JSBR NCMN
|
|
return ((pos2 == 39) || (pos2 == 5));
|
|
case 225: // 225. JSBR NCMN XVAE
|
|
return ((pos2 == 39) || (pos2 == 5) || (pos2 == 18));
|
|
case 226: // 226. JSBR NCMN XVAM XVBM XVMM
|
|
return ((pos2 == 39) || (pos2 == 5) || (pos2 == 15) || (pos2 == 14) || (pos2 ==16));
|
|
case 227: // 227. JSBR PREL
|
|
return ((pos2 == 39) || (pos2 == 10));
|
|
case 228: // 228. JSBR PREL RPRE
|
|
return ((pos2 == 39) || (pos2 == 10) || (pos2 == 40));
|
|
case 229: // 229. JSBR PREL XVBM
|
|
return ((pos2 == 39) || (pos2 == 10) || (pos2 == 14));
|
|
case 230: // 230. JSBR RPRE
|
|
return ((pos2 == 39) || (pos2 == 40));
|
|
case 231: // 231. JSBR RPRE VACT
|
|
return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 11));
|
|
case 232: // 232. JSBR RPRE VACT VSTA
|
|
return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 11)|| (pos2 == 12));
|
|
case 233: // 233. JSBR RPRE VACT XVAE XVAM
|
|
return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 11)|| (pos2 == 18)|| (pos2 == 15));
|
|
case 234: // 234. JSBR RPRE VATT
|
|
return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 13));
|
|
case 235: // 235. JSBR RPRE VSTA
|
|
return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 12));
|
|
case 236: // 236. JSBR RPRE XVAM
|
|
return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 15));
|
|
case 237: // 237. JSBR VACT
|
|
return ((pos2 == 39) || (pos2 == 11));
|
|
case 238: // 238. JSBR VACT VSTA
|
|
return ((pos2 == 39) || (pos2 == 11) || (pos2 == 12));
|
|
case 239: // 239. JSBR VATT XVBM XVMM
|
|
return ((pos2 == 39) || (pos2 == 13) || (pos2 == 14) || (pos2 == 16));
|
|
case 240: // 240. JSBR VSTA
|
|
return ((pos2 == 39) || (pos2 == 12));
|
|
case 241: // 241. JSBR XVBM
|
|
return ((pos2 == 39) || (pos2 == 14));
|
|
case 242: // 242. NCMN NCNM
|
|
return ((pos2 == 5) || (pos2 == 2));
|
|
case 243: // 243. NCMN NCNM NPRP
|
|
return ((pos2 == 5) || (pos2 == 2) || (pos2 == 1));
|
|
case 244: // 244. NCMN NLBL NPRP
|
|
return ((pos2 == 5) || (pos2 == 4) || (pos2 == 1));
|
|
case 245: // 245. NCMN NPRP
|
|
return ((pos2 == 5) || (pos2 == 1));
|
|
case 246: // 246. NCMN NPRP RPRE
|
|
return ((pos2 == 5) || (pos2 == 1) || (pos2 == 40));
|
|
case 247: // 247. NCMN NTTL
|
|
return ((pos2 == 5) || (pos2 == 6));
|
|
case 248: // 248. NCMN PDMN PPRS
|
|
return ((pos2 == 5) || (pos2 == 8) || (pos2 == 7));
|
|
case 249: // 249. NCMN PDMN VATT
|
|
return ((pos2 == 5) || (pos2 == 8) || (pos2 == 13));
|
|
case 250: // 250. NCMN PNTR
|
|
return ((pos2 == 5) || (pos2 == 9));
|
|
case 251: // 251. NCMN PPRS PREL VACT
|
|
return ((pos2 == 5) || (pos2 == 7) || (pos2 == 10) || (pos2 == 11));
|
|
case 252: // 252. NCMN RPRE
|
|
return ((pos2 == 5) || (pos2 == 40));
|
|
case 253: // 253. NCMN RPRE VACT VATT
|
|
return ((pos2 == 5) || (pos2 == 40) || (pos2 == 11) || (pos2 == 13));
|
|
case 254: // 254. NCMN RPRE VATT
|
|
return ((pos2 == 5) || (pos2 == 40) || (pos2 == 13));
|
|
case 255: // 255. NCMN VACT
|
|
return ((pos2 == 5) || (pos2 == 11));
|
|
case 256: // 256. NCMN VACT VATT
|
|
return ((pos2 == 5) || (pos2 == 11) || (pos2 == 13));
|
|
case 257: // 257. NCMN VACT VATT VSTA XVAE
|
|
return ((pos2 == 5) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12) || (pos2 == 18));
|
|
case 258: // 258. NCMN VACT VSTA
|
|
return ((pos2 == 5) || (pos2 == 11) || (pos2 == 12));
|
|
case 259: // 259. NCMN VACT VSTA XVAM
|
|
return ((pos2 == 5) || (pos2 == 11) || (pos2 == 12) || (pos2 == 15));
|
|
case 260: // 260. NCMN VACT VSTA XVBB
|
|
return ((pos2 == 5) || (pos2 == 11) || (pos2 == 12) || (pos2 == 17));
|
|
case 261: // 261. NCMN VATT
|
|
return ((pos2 == 5) || (pos2 == 13));
|
|
case 262: // 262. NCMN VATT VSTA
|
|
return ((pos2 == 5) || (pos2 == 13) || (pos2 == 12));
|
|
case 263: // 263. NCMN VATT XVAM
|
|
return ((pos2 == 5) || (pos2 == 13) || (pos2 == 15));
|
|
case 264: // 264. NCMN VSTA
|
|
return ((pos2 == 5) || (pos2 == 12));
|
|
case 265: // 265. NCMN XVBM
|
|
return ((pos2 == 5) || (pos2 == 14));
|
|
case 266: // 266. NPRP RPRE
|
|
return ((pos2 == 1) || (pos2 == 40));
|
|
case 267: // 267. NPRP VATT
|
|
return ((pos2 == 1) || (pos2 == 13));
|
|
case 268: // 268. NTTL PPRS
|
|
return ((pos2 == 6) || (pos2 == 7));
|
|
case 269: // 269. PDMN PPRS
|
|
return ((pos2 == 8) || (pos2 == 7));
|
|
case 270: // 270. PDMN VATT
|
|
return ((pos2 == 8) || (pos2 == 13));
|
|
case 271: // 271. PDMN VATT VSTA
|
|
return ((pos2 == 8) || (pos2 == 13) || (pos2 == 12));
|
|
case 272: // 272. PPRS PREL
|
|
return ((pos2 == 7) || (pos2 == 10));
|
|
case 273: // 273. PPRS VATT
|
|
return ((pos2 == 7) || (pos2 == 13));
|
|
case 274: // 274. RPRE VACT
|
|
return ((pos2 == 40) || (pos2 == 11));
|
|
case 275: // 275. RPRE VACT VATT
|
|
return ((pos2 == 40) || (pos2 == 11) || (pos2 == 13));
|
|
case 276: // 276. RPRE VACT VSTA
|
|
return ((pos2 == 40) || (pos2 == 11) || (pos2 == 12));
|
|
case 277: // 277. RPRE VACT VSTA XVAE
|
|
return ((pos2 == 40) || (pos2 == 11) || (pos2 == 12) || (pos2 == 18));
|
|
case 278: // 278. RPRE VACT XVAE
|
|
return ((pos2 == 40) || (pos2 == 11) || (pos2 == 18));
|
|
case 279: // 279. RPRE VATT
|
|
return ((pos2 == 40) || (pos2 == 13));
|
|
case 280: // 280. RPRE VATT VSTA
|
|
return ((pos2 == 40) || (pos2 == 13) || (pos2 == 12));
|
|
case 281: // 281. RPRE VSTA
|
|
return ((pos2 == 40) || (pos2 == 12));
|
|
case 282: // 282. VACT VATT
|
|
return ((pos2 == 11) || (pos2 == 13));
|
|
case 283: // 283. VACT VATT VSTA
|
|
return ((pos2 == 11) || (pos2 == 13) || (pos2 == 12));
|
|
case 284: // 284. VACT VATT XVAE XVAM XVBM
|
|
return ((pos2 == 11) || (pos2 == 13) || (pos2 == 18) || (pos2 == 15) || (pos2 == 14));
|
|
case 285: // 285. VACT VSTA
|
|
return ((pos2 == 11) || (pos2 == 12));
|
|
case 286: // 286. VACT VSTA XVAE
|
|
return ((pos2 == 11) || (pos2 == 12) || (pos2 == 18));
|
|
case 287: // 287. VACT VSTA XVAE XVAM
|
|
return ((pos2 == 11) || (pos2 == 12) || (pos2 == 18) || (pos2 == 15));
|
|
case 288: // 288. VACT VSTA XVAE XVAM XVMM",
|
|
return ((pos2 == 11) || (pos2 == 12) || (pos2 == 18) || (pos2 == 15) || (pos2 == 16));
|
|
case 289: // 289. VACT VSTA XVAM",
|
|
return ((pos2 == 11) || (pos2 == 12) || (pos2 == 15));
|
|
case 290: // 290. VACT VSTA XVAM XVMM",
|
|
return ((pos2 == 11) || (pos2 == 12) || (pos2 == 15) || (pos2 == 16));
|
|
case 291: // 291. VACT XVAE",
|
|
return ((pos2 == 11) || (pos2 == 18));
|
|
case 292: // 292. VACT XVAM",
|
|
return ((pos2 == 11) || (pos2 == 15));
|
|
case 293: // 293. VACT XVAM XVMM",
|
|
return ((pos2 == 11) || (pos2 == 15) || (pos2 == 16));
|
|
case 294: // 294. VACT XVMM",
|
|
return ((pos2 == 11) || (pos2 == 16));
|
|
case 295: // 295. VATT VSTA",
|
|
return ((pos2 == 13) || (pos2 == 12));
|
|
case 296: // 296. VSTA XVAE",
|
|
return ((pos2 == 12) || (pos2 == 18));
|
|
case 297: // 297. VSTA XVAM",
|
|
return ((pos2 == 12) || (pos2 == 15));
|
|
case 298: // 298. VSTA XVAM XVMM",
|
|
return ((pos2 == 12) || (pos2 == 15) || (pos2 == 16));
|
|
case 299: // 299. VSTA XVBM",
|
|
return ((pos2 == 12) || (pos2 ==14));
|
|
case 300: // 300. XVAM XVBM",
|
|
return ((pos2 == 15) || (pos2 == 14));
|
|
case 301: // 301. XVAM XVBM XVMM",
|
|
return ((pos2 == 15) || (pos2 == 14) || (pos2 == 16));
|
|
case 302: // 302. XVAM XVMM",
|
|
return ((pos2 == 15) || (pos2 == 16));
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CThaiTrigramTrieIter
|
|
//
|
|
// Synoposis: Constructor:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: created 8/99 aarayas
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CThaiTrigramTrieIter::CThaiTrigramTrieIter() : pTrieScanArray(NULL)
|
|
{
|
|
pTrieScanArray = new TRIESCAN[50];
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CThaiTrigramTrieIter
|
|
//
|
|
// Synoposis: Destructor
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: created 8/99 aarayas
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CThaiTrigramTrieIter::~CThaiTrigramTrieIter()
|
|
{
|
|
if (pTrieScanArray)
|
|
delete pTrieScanArray;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CThaiTrigramTrieIter
|
|
//
|
|
// Synopsis: Initialize variables.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: created 8/99 aarayas
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void CThaiTrigramTrieIter::Init(CTrie* ctrie)
|
|
{
|
|
// Declare varialbes.
|
|
WCHAR pos;
|
|
|
|
// Initialize parent.
|
|
CTrieIter::Init(ctrie);
|
|
|
|
pos1Cache = 0;
|
|
pos2Cache = 0;
|
|
|
|
// Initialize Hash table.
|
|
for (pos = 1; pos <= 47; pos++)
|
|
GetScanFirstChar(pos,&pTrieScanArray[pos]);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CThaiTrigramTrieIter
|
|
//
|
|
// Synopsis: Initialize variables.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: created 8/99 aarayas
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
bool CThaiTrigramTrieIter::GetScanFirstChar(WCHAR wc, TRIESCAN* pTrieScan)
|
|
{
|
|
// Reset the trie scan.
|
|
memset(&trieScan, 0, sizeof(TRIESCAN));
|
|
|
|
// Encrypt
|
|
wc += 0x0100;
|
|
|
|
if (!TrieGetNextState(pTrieCtrl, &trieScan))
|
|
return false;
|
|
|
|
while (wc != trieScan.wch)
|
|
{
|
|
// Keep moving the the right of the trie.
|
|
if (!TrieGetNextNode(pTrieCtrl, &trieScan))
|
|
{
|
|
memset(pTrieScan, 0, sizeof(TRIESCAN));
|
|
return false;
|
|
}
|
|
}
|
|
memcpy(pTrieScan, &trieScan, sizeof(TRIESCAN));
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CThaiTrigramTrieIter
|
|
//
|
|
// Synopsis: Bring interation index to the first node.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: created 8/99 aarayas
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
void CThaiTrigramTrieIter::GetNode()
|
|
{
|
|
pos = (WCHAR) trieScan.wch - 0x0100;
|
|
/*
|
|
fWordEnd = (trieScan.wFlags & TRIE_NODE_VALID) &&
|
|
(!(trieScan.wFlags & TRIE_NODE_TAGGED) ||
|
|
(trieScan.aTags[0].dwData & iDialectMask));
|
|
*/
|
|
fWordEnd = (trieScan.wFlags & TRIE_NODE_VALID);
|
|
|
|
if (fWordEnd)
|
|
{
|
|
dwTag = (DWORD) (trieScan.wFlags & TRIE_NODE_TAGGED ?
|
|
trieScan.aTags[0].dwData :
|
|
0);
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CThaiTrigramTrieIter
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: created 8/99 aarayas
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
DWORD CThaiTrigramTrieIter::GetProb(WCHAR pos1, WCHAR pos2, WCHAR pos3)
|
|
{
|
|
// Declare and initialize all local variables.
|
|
int i = 0;
|
|
|
|
if (pos1 == pos1Cache && pos2 == pos2Cache)
|
|
{
|
|
memcpy(&trieScan,&trieScanCache, sizeof(TRIESCAN));
|
|
|
|
if (!Down()) return 0;
|
|
while (true)
|
|
{
|
|
GetNode();
|
|
if (IsTagEqual(pos3,pos) && fWordEnd)
|
|
{
|
|
return dwTag;
|
|
}
|
|
else if (!Right()) break;
|
|
}
|
|
return 0;
|
|
}
|
|
if (pos1 >= 1 && pos1 <= 47)
|
|
memcpy(&trieScan,&pTrieScanArray[pos1], sizeof(TRIESCAN));
|
|
Reset();
|
|
|
|
if (!Down())
|
|
return false;
|
|
|
|
while (true)
|
|
{
|
|
GetNode();
|
|
if (IsTagEqual(pos1,pos))
|
|
{
|
|
if (!Down()) break;
|
|
while (true)
|
|
{
|
|
GetNode();
|
|
if (IsTagEqual(pos2,pos))
|
|
{
|
|
pos1Cache = pos1;
|
|
pos2Cache = pos2;
|
|
memcpy(&trieScanCache,&trieScan, sizeof(TRIESCAN));
|
|
|
|
if (!Down()) break;
|
|
while (true)
|
|
{
|
|
GetNode();
|
|
if (IsTagEqual(pos3,pos) && fWordEnd)
|
|
{
|
|
return dwTag;
|
|
}
|
|
else if (!Right()) break;
|
|
}
|
|
return 0;
|
|
}
|
|
else if (!Right()) break;
|
|
}
|
|
return 0;
|
|
}
|
|
// Move right of the Trie Branch
|
|
else if (!Right()) break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
DWORD CThaiTrigramTrieIter::GetProb(WCHAR* posArray)
|
|
{
|
|
// Declare and initialize all local variables.
|
|
int i = 0;
|
|
|
|
Reset();
|
|
|
|
if (!Down())
|
|
return 0;
|
|
|
|
while (TRUE)
|
|
{
|
|
GetNode();
|
|
if (pos == posArray[i])
|
|
{
|
|
i++;
|
|
if (fWordEnd && posArray[i] == '\0')
|
|
{
|
|
return dwTag;
|
|
}
|
|
// Move down the Trie Branch.
|
|
else if (!Down()) break;
|
|
}
|
|
// Move right of the Trie Branch
|
|
else if (!Right()) break;
|
|
}
|
|
return 0;
|
|
}
|