Inputer.h
上传用户:bingyunhe
上传日期:2013-07-06
资源大小:723k
文件大小:28k
源码类别:

词法分析

开发平台:

Visual C++

  1. //
  2. // Inputer.h
  3. // 汉字输入法
  4. // Author : zhanlc
  5. // Date : 2003/9/5
  6. //
  7. #ifndef __ChineseInputer_H__
  8. #define __ChineseInputer_H__
  9. #include <list>
  10. #include <vector>
  11. #include <map>
  12. #include <algorithm>
  13. using namespace std;
  14. namespace Chinese 
  15. {
  16. /**
  17. * 字
  18. */
  19. class Word
  20. {
  21. public :
  22. /**
  23. * 构造函数
  24. */
  25. Word() 
  26. {
  27. Init( TCHAR(''), TCHAR('') );
  28. };
  29. /**
  30. * 根据字符串初始化
  31. */
  32. Word( const TCHAR* szWord ) 
  33. {
  34. Init( szWord[0], szWord[1] );
  35. }
  36. /**
  37. * 根据字符串初始化
  38. */
  39. Word( const CString& strWord ) 
  40. {
  41. Init( strWord [0], strWord [1] );
  42. }
  43. /**
  44. * 根据字节直接初始化
  45. */
  46. Word( TCHAR cLow, TCHAR cHigh ) 
  47. {
  48. Init( cLow, cHigh );
  49. };
  50. /**
  51. * 转换成字符串
  52. */
  53. operator CString() 
  54. {
  55. CString strWord( TCHAR(''), 3 );
  56. strWord.SetAt( 0, m_Word[0] );
  57. strWord.SetAt( 1, m_Word[1] );
  58. return strWord;
  59. }
  60. /**
  61. * 判断是否和字符串相等
  62. */
  63. BOOL operator==( const TCHAR* szWord ) const
  64. {
  65. return szWord[0] == m_Word[0] && szWord[1] == m_Word[1];
  66. }
  67. /**
  68. * 判断是否和字符串相等
  69. */ 
  70. BOOL operator==( const CString& szWord ) const
  71. {
  72. return szWord[0] == m_Word[0] && szWord[1] == m_Word[1];
  73. }
  74. /**
  75. * 判断是否相等
  76. */
  77. BOOL operator==( const Word& wd ) const
  78. {
  79. return wd.m_Word[0] == m_Word[0] && wd.m_Word[1] == m_Word[1];
  80. }
  81. /**
  82. * 比较运算符
  83. */
  84. BOOL operator<( const Word& wd ) const
  85. {
  86. //return m_Word[1] < wd.m_Word[1]  &&  m_Word[0] < wd.m_Word[0];
  87. return *( (unsigned short*)&m_Word[0]) < *( (unsigned short*)&wd.m_Word[0]);
  88. }
  89. /**
  90. * 获得低字节
  91. */
  92. TCHAR GetLow() const
  93. {
  94. return m_Word[0];
  95. }
  96. /**
  97. * 获得高字节
  98. */
  99. TCHAR GetHigh() const
  100. {
  101. return m_Word[1];
  102. }
  103. // I/O
  104. public :
  105. /**
  106. * 保存到文件流
  107. */
  108. template <class TStream>
  109. void operator >> ( TStream& os ) const
  110. {
  111. os << m_Word[0] << m_Word[1];
  112. };
  113. /**
  114. * 从流中读入
  115. */
  116. template <class TStream>
  117. void operator<<( TStream& os )
  118. {
  119. os >> m_Word[0] >> m_Word[1] ;
  120. }
  121. protected :
  122. /**
  123. * 初始化
  124. */
  125. void Init( TCHAR cLow, TCHAR cHigh )
  126. {
  127. m_Word[0] = cLow;
  128. m_Word[1] = cHigh;
  129. };
  130. protected :
  131. /**
  132. * 汉字
  133. */
  134. TCHAR m_Word[2];
  135. };
  136. /**
  137. * 笔顺类
  138. * "12345" --- "一丨丿丶乙"  
  139. */
  140. class StrokesOrder
  141. {
  142. public :
  143. /**
  144. * 构造函数
  145. */
  146. StrokesOrder( const TCHAR* sz=_T(""));
  147. /**
  148. * 将笔顺转换成数字字符形式
  149. */
  150. const CString& GetAsDigits() const
  151. {
  152. return m_DigitStroks;
  153. };
  154. /**
  155. * 重载字符转换, 数字字符形式
  156. */
  157. operator const CString&() const
  158. {
  159. return m_DigitStroks;
  160. };
  161. /**
  162. * 将笔顺转换成笔画形式
  163. */
  164. CString GetAsStroks() const;
  165. /**
  166. * 获得笔画长度
  167. */
  168. int GetLength() const
  169. {
  170. return m_DigitStroks.GetLength();
  171. };
  172. /**
  173. * 比较操作符
  174. */
  175. BOOL operator==( const StrokesOrder& odr ) const
  176. {
  177. return m_DigitStroks == odr.m_DigitStroks;
  178. }
  179. /**
  180. * 比较操作符
  181. */
  182. BOOL operator==( const TCHAR* szOdr ) const
  183. {
  184. return operator==( StrokesOrder(szOdr) );
  185. }
  186. /**
  187. * 比较操作符
  188. */
  189. BOOL operator==( const CString& szOdr ) const
  190. {
  191. return operator==( StrokesOrder(szOdr) );
  192. }
  193. /**
  194. * 设置笔顺
  195. */
  196. BOOL Set( const TCHAR* szStrokesOrder );
  197. /**
  198. * 赋值函数
  199. */
  200. BOOL operator=( const TCHAR* szStrokesOrder )
  201. {
  202. return Set( szStrokesOrder );
  203. }
  204. public :
  205. /**
  206. * 横
  207. */
  208. static Word s_Heng;
  209. /**
  210. * 竖
  211. */
  212. static Word s_Shu;
  213. /**
  214. * 撇
  215. */
  216. static Word s_Pie;
  217. /**
  218. * 捺
  219. */
  220. static Word s_Na;
  221. /**
  222. * 折
  223. */
  224. static Word s_Zhe;
  225. /**
  226. * 横
  227. */
  228. static TCHAR s_cHeng;
  229. /**
  230. * 竖
  231. */
  232. static TCHAR s_cShu;
  233. /**
  234. * 撇
  235. */
  236. static TCHAR s_cPie;
  237. /**
  238. * 捺
  239. */
  240. static TCHAR s_cNa;
  241. /**
  242. * 折
  243. */
  244. static TCHAR s_cZhe;
  245. protected :
  246. /**
  247. * 以数字形式表示得笔顺
  248. */
  249. CString m_DigitStroks;
  250. };
  251. /**
  252. * 拼音组, 用于将多个拼音组合一个字符串拼音,可以用于多音字
  253. */
  254. class SpellGroup
  255. {
  256. public :
  257. typedef /*list*/vector<CString> StringList;
  258. typedef StringList::const_iterator const_iterator;
  259. typedef StringList::iterator iterator;
  260. /**
  261. * 构造函数
  262. */
  263. SpellGroup();
  264. /**
  265. * 构造函数
  266. */
  267. SpellGroup( const TCHAR* szGroup );
  268. /**
  269. * 获得拼音个数
  270. */
  271. int GetCount() const;
  272. /**
  273. * 获得第i个拼音
  274. */
  275. const CString& operator[]( int i );
  276. /**
  277. * 将所有拼音转换成一个字符串
  278. */
  279. CString GetAsString() const;
  280. /**
  281. * 操作符重载
  282. */
  283. operator CString() const;
  284. /**
  285. * 加入拼音
  286. */
  287. void Add( const TCHAR* szSpell );
  288. /**
  289. * 加入组
  290. */
  291. void AddGroup( const TCHAR* szSpell );
  292. /**
  293. * 删除拼音
  294. */
  295. void Remove( const TCHAR* szSpell );
  296. /**
  297. * 删除所有拼音
  298. */
  299. void RemoveAll();
  300. /**
  301. * 开始迭代器
  302. */
  303. iterator begin() 
  304. {
  305. return m_vSpell.begin();
  306. }
  307. /**
  308. * 开始迭代器
  309. */
  310. iterator end() 
  311. {
  312. return m_vSpell.end();
  313. }
  314. /**
  315. * 开始迭代器
  316. */
  317. const_iterator begin() const
  318. {
  319. return m_vSpell.begin();
  320. }
  321. /**
  322. * 开始迭代器
  323. */
  324. const_iterator end() const
  325. {
  326. return m_vSpell.end();
  327. }
  328. /**
  329. * 包含某个注音
  330. */
  331. BOOL HaveSpell( const TCHAR* szSpell ) const
  332. {
  333. return find( m_vSpell.begin(), m_vSpell.end(), szSpell) != m_vSpell.end();
  334. }
  335. /**
  336. * 将多个拼音组相加
  337. */
  338. static CString Add( const CString& strOne, const CString& strTwo )
  339. {
  340. CString strNew;
  341. if ( strOne == _T("") )
  342. {
  343. strNew = strTwo;
  344. }
  345. else
  346. {
  347. strNew = strOne;
  348. if ( strTwo != _T("") )
  349. strNew += _T(":") + strTwo;
  350. }
  351. return strNew;
  352. }
  353. // I/O
  354. public :
  355. /**
  356. * 保存到文件流
  357. */
  358. template <class TStream>
  359. void operator >> ( TStream& os ) const
  360. {
  361. int nLen = m_vSpell.size();
  362. os << nLen;
  363. for ( int i=0; i<nLen; i++ )
  364. os << m_vSpell[i];
  365. };
  366. /**
  367. * 从流中读入
  368. */
  369. template <class TStream>
  370. void operator<<( TStream& os )
  371. {
  372. int nLen;
  373. os >> nLen ;
  374. /*
  375. ASSERT( nLen > 0 );
  376. m_vSpell.resize(nLen);
  377. for ( int i=0; i<nLen; i++ )
  378. os >> m_vSpell[i];
  379. */
  380. if ( nLen > 0 )
  381. {
  382. m_vSpell.resize(nLen);
  383. for ( int i=0; i<nLen; i++ )
  384. os >> m_vSpell[i];
  385. }
  386. else
  387. m_vSpell.clear();
  388. }
  389. protected :
  390. /**
  391. * 拼音集合
  392. */
  393. StringList m_vSpell;
  394. };
  395. /**
  396. * 中文字典
  397. */
  398. class ChineseDictionary
  399. {
  400. public :
  401. /**
  402. * 部首
  403. */
  404. class BSWord : public Word
  405. {
  406. public :
  407. BSWord() {}
  408. /**
  409. * 根据字符串初始化
  410. */
  411. BSWord( const TCHAR* szWord, 
  412.     int nStrokes, 
  413. const TCHAR* szDscr )  : Word(szWord)
  414. {
  415. }
  416. /**
  417. * 根据字符串初始化
  418. */
  419. BSWord( const CString& strWord,
  420. int nStrokes, 
  421. const TCHAR* szDscr) : Word(strWord)
  422. {
  423. }
  424. /**
  425. * 根据字节直接初始化
  426. */
  427. BSWord( TCHAR cLow, TCHAR cHigh,
  428. int nStrokes, 
  429. const TCHAR* szDscr ) : Word(cLow, cHigh )
  430. {
  431. };
  432. /**
  433. * 获得描述
  434. */
  435. const CString& GetDescrib() const
  436. {
  437. return m_strDscr;
  438. }
  439. /**
  440. * 获得笔画
  441. */
  442. int GetStrokes( ) const
  443. {
  444. return m_nStrokes;
  445. }
  446. protected :
  447. /**
  448. * 初始化
  449. */
  450. BOOL Init( int nStrokes, const TCHAR* szDscr )
  451. {
  452. m_nStrokes = nStrokes;
  453. m_strDscr = szDscr;
  454. return TRUE;
  455. }
  456. protected :
  457. /**
  458. * 描述
  459. */
  460. CString m_strDscr;
  461. /**
  462. * 笔画
  463. */
  464. int m_nStrokes;
  465. };
  466. /**
  467. * 部首容器
  468. */
  469. class BSWords
  470. {
  471. public :
  472. /**
  473. * 部首枚举器
  474. */
  475. typedef const BSWord* iterator;
  476. /**
  477. * 获得起始部首
  478. */
  479. iterator begin() const;
  480. /**
  481. * 结束
  482. */
  483. iterator end() const;
  484. /**
  485. * 部首数目
  486. */
  487. int size() const;
  488. };
  489. /**
  490. * 字解释
  491. */
  492. class WordComment
  493. {
  494. friend class ChineseDictionary;
  495. public :
  496. /**
  497. * 构造函数
  498. */
  499. WordComment() /*: m_strSpell(_T(""))*/ {};
  500. /**
  501. * 构造函数
  502. */
  503. WordComment( Word wBS, unsigned short nStrokes, 
  504.  const SpellGroup& sgSpell, 
  505.  const StrokesOrder& sOrder )  : 
  506. m_BS(wBS), m_nStroks(nStrokes), m_StroksOrder(sOrder),
  507. m_SpellGroup(sgSpell)
  508. {
  509. //m_strSpell = sgSpell.GetAsString();
  510. };
  511. /**
  512. * 获得笔画数
  513. */
  514. int GetStrokes() const
  515. {
  516. return m_nStroks;
  517. };
  518. /**
  519. * 设置笔画数
  520. */
  521. void SetStrokes( unsigned short nStrokes ) 
  522. {
  523. m_nStroks = nStrokes;
  524. };
  525. /**
  526. * 获得部首
  527. */
  528. Word GetBS() const
  529. {
  530. return m_BS;
  531. };
  532. /**
  533. * 设置部首
  534. */
  535. void SetBS( Word wdBS ) 
  536. {
  537. m_BS = wdBS;
  538. };
  539. /**
  540. * 获得笔顺
  541. */
  542. const StrokesOrder& GetStrokesOrder() const
  543. {
  544. return m_StroksOrder;
  545. };
  546. /**
  547. * 设置笔顺
  548. */
  549. void SetStrokesOrder( const StrokesOrder& sodr ) 
  550. {
  551. m_StroksOrder = sodr;
  552. };
  553. /**
  554. * 获得拼音组
  555. */
  556. const SpellGroup& GetSpellGroup( ) const
  557. {
  558. return m_SpellGroup;//SpellGroup(m_strSpell);
  559. }
  560. /**
  561. * 设置新的拼音组
  562. */
  563. void SetSpellGroup( const SpellGroup& sg )
  564. {
  565. //m_strSpell = sg.GetAsString( );
  566. m_SpellGroup = sg;
  567. }
  568. /**
  569. * 判断是否有某个注音
  570. */
  571. BOOL HaveSpell( const TCHAR* szSpell ) const
  572. {
  573. return /*SpellGroup(m_strSpell).*/m_SpellGroup.HaveSpell(szSpell);
  574. }
  575. // I/O 
  576. public :
  577. /**
  578. * 保存到文件流
  579. */
  580. template <class TStream>
  581. void operator >> ( TStream& os ) const
  582. {
  583. // 部首
  584. m_BS >> os;
  585. os << m_nStroks;
  586. //os << /*m_strSpell*/m_SpellGroup << m_StroksOrder.GetAsDigits();
  587. m_SpellGroup >> os;
  588. os << m_StroksOrder.GetAsDigits( );
  589. }
  590. /**
  591. * 从流中读入
  592. */
  593. template <class TStream>
  594. void operator<< ( TStream& os )
  595. {
  596. // 部首
  597. m_BS << os;
  598. CString strStrokesOrder;
  599. os >> m_nStroks;
  600. //os >> /*m_strSpell*/m_SpellGroup >> strStrokesOrder;
  601. m_SpellGroup << os;
  602. os >> strStrokesOrder;
  603. m_StroksOrder = strStrokesOrder;
  604. }
  605. protected :
  606. /**
  607. * 部首
  608. */
  609. Word m_BS;
  610. /**
  611. * 笔画数
  612. */
  613. unsigned short m_nStroks;
  614. /**
  615. * 拼音, 多音字用:分割
  616. */
  617. //CString m_strSpell;
  618. SpellGroup m_SpellGroup;
  619. /**
  620. * 笔顺
  621. */
  622. StrokesOrder m_StroksOrder;
  623. };
  624. /**
  625. * 字典条目
  626. */
  627. class WordItem
  628. {
  629. friend class ChineseDictionary;
  630. /**
  631. * 构造函数
  632. */
  633. WordItem( Word wd, const WordComment* wdcm )  
  634. : m_Word(wd), m_pComment(wdcm)
  635. {
  636. };
  637. public :
  638. /**
  639. * 构造函数
  640. */
  641. WordItem() : m_Word( TCHAR('0'), TCHAR('0') ), m_pComment(NULL)
  642. {
  643. };
  644. /**
  645. * 获得字
  646. */
  647. Word GetWord() const
  648. {
  649. return m_Word;
  650. }
  651. /**
  652. * 获得字注解
  653. */
  654. const WordComment& GetComment() const
  655. {
  656. ASSERT( m_pComment );
  657. return *m_pComment;
  658. }
  659. /**
  660. * 比较运算
  661. */
  662. BOOL operator==( const WordItem& witm ) const
  663. {
  664. return m_Word == witm.m_Word && 
  665. m_pComment == witm.m_pComment;
  666. }
  667. /**
  668. * 比较运算
  669. */
  670. BOOL operator!=( const WordItem& witm ) const
  671. {
  672. return !operator==( witm );
  673. }
  674. /**
  675. * 判断是否是合法的词条
  676. */
  677. operator BOOL() const;
  678. protected :
  679. /**
  680. * 字
  681. */
  682. Word    m_Word;
  683. /**
  684. * 字注解
  685. */
  686. const WordComment*    m_pComment;
  687. }; // end of word item
  688. /**
  689. * 定义字典条目得引用
  690. */
  691. typedef const WordItem WordItemRef;
  692. /**
  693. * 非法词条
  694. */
  695. static WordItem NullWordItemRef;
  696. /**
  697. * 查某个字的解释
  698. */
  699. static WordItemRef Get( Word wdLookup );
  700. /**
  701. * 加入词条
  702. */
  703. static void AddWord( Word wd, const WordComment& wdcm );
  704. /**
  705. * 清空所有词条
  706. */
  707. static void Clear(  );
  708. /**
  709. * 从文件中装入字典
  710. */
  711. static BOOL Load( const TCHAR* szFile );
  712. /**
  713. * 将字典保存到文件中
  714. */
  715. static BOOL Save( const TCHAR* szFile );
  716. //=======================================================================================
  717. //
  718. // 查询器
  719. //
  720. //=======================================================================================
  721. public :
  722. /**
  723. * 汉字枚举器
  724. */
  725. typedef list<Word> WordEnumerator;
  726. /**
  727. * 汉字表
  728. */
  729. typedef map<Word, WordComment> WordTable;
  730. /**
  731. * 查询器基类
  732. */
  733. class QueryBase
  734. {
  735. protected :
  736. /**
  737. * 初始化查询器
  738. */
  739. virtual BOOL Initialize( WordTable* pWordTable);
  740. /**
  741. * 销毁
  742. */
  743. virtual void Uninitialize( );
  744. protected :
  745. /**
  746. * 汉字表
  747. */
  748. WordTable* m_pWordTbl;
  749. };
  750. /**
  751. * 部首查询器
  752. */
  753. class BSQuery : public QueryBase
  754. {
  755. friend class ChineseDictionary;
  756. public :
  757. /**
  758. * 根据输入部首, 查询汉字
  759. */
  760. BOOL QueryWords( const TCHAR* szBuShou, WordEnumerator& enumer );
  761. };
  762. /**
  763. * 笔画查询器
  764. */
  765. class StrokesQuery : public QueryBase
  766. {
  767. friend class ChineseDictionary;
  768. public :
  769. /**
  770. * 根据输入笔画, 查询汉字
  771. */
  772. BOOL QueryWords( int nStroks, WordEnumerator& enumer );
  773. /**
  774. * 根据输入笔画, 查询汉字
  775. */
  776. BOOL QueryWords( const TCHAR* szStrokes, WordEnumerator& enumer );
  777. };
  778. /**
  779. * 字符索引基类
  780. */
  781. class StringQueryBase : public QueryBase
  782. {
  783. protected :
  784. //typedef vector<Word> Words;
  785. typedef list<Word> Words;
  786. typedef map<CString, Words> String2Words;
  787. public :  //!by zqp edit 205.06.17  protected edit public
  788.   /*
  789. * 初始化查询器
  790. */
  791. BOOL Initialize( WordTable* pWordTable);
  792. /**
  793. * 销毁
  794. */
  795. void Uninitialize( );
  796. /**
  797. * 初始化字条目
  798. */
  799. virtual void InitWord( Word wd, const WordComment& wc ) { };
  800. /**
  801. * 访问迭代器
  802. */
  803. class iterator : public String2Words::iterator
  804. {
  805. typedef String2Words::iterator base_class;
  806. public :
  807. iterator( base_class it )  : base_class (it) 
  808. {
  809. }
  810. /**
  811. * 重载指针操作
  812. */
  813. Words& operator*( )
  814. {
  815. base_class& it = *this;
  816. Words& words = it->second;
  817. return words;
  818. }
  819. }; 
  820. /**
  821. * 返回起始迭代位置
  822. */
  823. iterator begin( )
  824. {
  825. return iterator( m_String2Words.begin() );
  826. }
  827. iterator end()
  828. {
  829. return iterator( m_String2Words.end() );
  830. }
  831. protected :
  832. /**
  833. * 加入字符到字得映射
  834. */
  835. void AddMap( const TCHAR* szString, Word wd );
  836. /**
  837. * 获得映射表
  838. */
  839. String2Words& GetMapTable( );
  840. public :
  841. /**
  842. * 根据字符串查询
  843. */
  844. BOOL QueryWords( const TCHAR* szSpell, WordEnumerator& enumer );
  845. protected :
  846. /**
  847. * 字符串到字得映射
  848. */
  849. String2Words m_String2Words;
  850. };
  851. /**
  852. * 拼音查询器
  853. */
  854. class SpellQuery  : public StringQueryBase//QueryBase
  855. {
  856. friend class ChineseDictionary;
  857. protected :
  858. /*
  859. * 初始化查询器
  860. */
  861. BOOL Initialize( WordTable* pWordTable);
  862. /**
  863. * 初始化字
  864. */
  865. void InitWord( Word wd, const WordComment& wc );
  866. };
  867. /**
  868. * 笔顺查询器
  869. */
  870. class StrokesOrderQuery : public SpellQuery
  871. {
  872. friend class ChineseDictionary;
  873. protected :
  874. /**
  875. * 初始化字
  876. */
  877. void InitWord( Word wd, const WordComment& wc );
  878. };
  879. public :
  880. /**
  881. * 获的部首查询器
  882. */
  883. static BSQuery* GetBSQuery();
  884. /**
  885. * 获的笔画查询器
  886. */
  887. static StrokesQuery* GetStrokesQuery();
  888. /**
  889. * 获的拼音查询器
  890. */
  891. static SpellQuery* GetSpellQuery();
  892. /**
  893. * 获的拼写查询器
  894. */
  895. static StrokesOrderQuery* GetStrokesOrderQuery();
  896. protected :
  897. /**
  898. * 型别转换
  899. */
  900. template <class TQuery>
  901. struct TypeTraits
  902. {
  903. };
  904. /**
  905. * 获得特定的查询器
  906. */
  907. template <class TQuery>
  908. static TQuery* GetQuery( TypeTraits<TQuery> )
  909. {
  910. static TQuery s_Query;
  911. static BOOL bInit = FALSE;
  912. // 首次使用初始化
  913. if ( !bInit )
  914. {
  915. if ( !s_Query.Initialize( &s_WordTable ) )
  916. return NULL;
  917. else
  918. bInit = TRUE;
  919. }
  920. return &s_Query;
  921. }
  922. protected :
  923. /**
  924. * 所有汉字表
  925. */
  926. static WordTable s_WordTable;
  927. /**
  928. * 部首表
  929. */
  930. static BSWord s_BSWordTable[];
  931. friend class BSWords;
  932. };
  933. /**
  934. * 字典生成器
  935. */
  936. class ChineseDictionaryMaker
  937. {
  938. public :
  939. /**
  940. * 制作字典
  941. */
  942. static BOOL Make( const TCHAR* szSpell, 
  943.   const TCHAR* szBS,
  944.   const TCHAR* szStrokes );
  945. protected :
  946. typedef map<Word, ChineseDictionary::WordComment> WordTable;
  947. /**
  948. * 处理拼音
  949. */
  950. static BOOL ProcessSpell( const TCHAR* szSpell, WordTable& wtbl );
  951. /**
  952. * 处理部首
  953. */
  954. static BOOL ProcessBS( const TCHAR* szBS, WordTable& wtbl );
  955. /**
  956. * 处理笔画
  957. */
  958. static BOOL ProcessStrokes( const TCHAR* szStrokes, WordTable& wtbl );
  959. }; // end of DictionaryMaker
  960. /**
  961. * 部首比较器
  962. */
  963. struct BSLess
  964. {
  965. /**
  966. * 比较wd1和wd2大小
  967. * @param 如果wd1>wd2返回true, 否则为false
  968. */
  969. BOOL operator()( Word wd1, Word wd2 )
  970. {
  971. return wd1<wd2;
  972. }
  973. };
  974. /**
  975. * 字符串比较器
  976. */
  977. struct StringLess
  978. {
  979. /**
  980. * 比较str1和str2大小
  981. * @param 如果str1>str2返回true, 否则为false
  982. */
  983. BOOL operator()( const CString& str1, const CString& str2 ) const
  984. {
  985. return str1<str2;
  986. }
  987. };
  988. /**
  989. * 笔顺比较器
  990. */
  991. struct StrokesOrderLess : public StringLess
  992. {
  993. };
  994. /**
  995. * 拼音比较器
  996. */
  997. struct SpellLess : public StringLess
  998. {
  999. };
  1000. /**
  1001. * 笔画比较器
  1002. */
  1003. struct StrokesLess
  1004. {
  1005. BOOL operator( )( int n1, int n2 ) const
  1006. {
  1007. return n1 < n2;
  1008. };
  1009. /**
  1010. * 字符串包含测试器
  1011. */
  1012. struct StringContainTester
  1013. {
  1014. /**
  1015. *  判断strTest前半部分是否包含strPrefix
  1016. */
  1017. static BOOL Contain( const TCHAR* strTest, 
  1018. const TCHAR* strPrefix )
  1019. {
  1020. int index = 0;
  1021. while ( strTest[index] && strPrefix[index] )
  1022. {
  1023. if ( strTest[index] != strPrefix[index] )
  1024. return FALSE;
  1025. index++;
  1026. }
  1027. return strTest[index] ||
  1028. strTest[index] == strPrefix[index] ? TRUE : FALSE;
  1029. }
  1030. };
  1031. /**
  1032. * 拼音包含测试器
  1033. */
  1034. struct SpellContainTester : public StringContainTester
  1035. {
  1036. };
  1037. /**
  1038. * 笔顺包含测试器
  1039. */
  1040. struct StrokesOrderContainTester : public StringContainTester
  1041. {
  1042. };
  1043. /**
  1044. * 中文输入法
  1045. */
  1046. class ChineseInputer
  1047. {
  1048. public :
  1049. /**
  1050. * 汉字枚举器
  1051. */
  1052. typedef list<Word> WordEnumerator;
  1053. /**
  1054. * 输入器
  1055. */
  1056. class Inputer
  1057. {
  1058. public :
  1059. /**
  1060. * 输入模式
  1061. */
  1062. enum
  1063. {
  1064. /**
  1065. * 输入拼音
  1066. */
  1067. Input_Spell = 0, 
  1068. /** 
  1069. * 输入部首 
  1070. */
  1071. Input_BS,
  1072. /**
  1073. * 输入笔画
  1074. */
  1075. Input_Strokes,
  1076. /**
  1077. * 输入笔顺
  1078. */
  1079. Input_StrokesOrder
  1080. };  // end of input state 
  1081. /**
  1082. * 构造函数
  1083. */
  1084. Inputer();
  1085. /**
  1086. * 设置输入模式
  1087. */
  1088. void SetMode( int nMode );
  1089. /**
  1090. * 获得输入模式
  1091. */
  1092. int GetMode() const;
  1093. /**
  1094. * 获得所有输入
  1095. */
  1096. CString GetInputs() const;
  1097. /**
  1098. * 输入字符
  1099. */
  1100. void Put( TCHAR c );
  1101. /**
  1102. * 输入字符串
  1103. */
  1104. void Put( const TCHAR* szChars );
  1105.       /**
  1106. * 输入法重置
  1107. */
  1108. void Reset();
  1109. /**
  1110. * 获得输入的拼音
  1111. */
  1112. CString GetSpell() const;
  1113. /**
  1114. * 获得输入的部首
  1115. */
  1116. CString GetBS() const;
  1117. /**
  1118. * 获得输入的笔顺
  1119. */
  1120. CString GetStrokesOrder() const;
  1121. /**
  1122. * 获得输入的笔画
  1123. */
  1124. CString GetStrokes() const;
  1125. protected :
  1126. /**
  1127. * 获得原始串
  1128. */
  1129. CString GetUnparse() const;
  1130. protected :
  1131. /**
  1132. * 输入解析器
  1133. */
  1134. class InputParser
  1135. {
  1136. public :
  1137. /**
  1138. * 构造函数
  1139. */
  1140. InputParser( const CString& str );
  1141. /**
  1142. * 获得输入的拼音
  1143. */
  1144. const CString& GetSpell() const
  1145. {
  1146. return m_strSpell;
  1147. };
  1148. /**
  1149. * 获得输入的部首
  1150. */
  1151. const CString& GetBS() const
  1152. {
  1153. return m_strBS;
  1154. };
  1155. /**
  1156. * 获得输入的笔顺
  1157. */
  1158. const CString& GetStrokesOrder() const
  1159. {
  1160. return m_strStrokesOrder;
  1161. };
  1162. /**
  1163. * 获得输入的笔画
  1164. */
  1165. const CString& GetStrokes() const
  1166. {
  1167. return m_strStrokes;
  1168. };
  1169. protected :
  1170. /**
  1171. * 解析函数
  1172. */
  1173. BOOL Parse( const CString& str );
  1174. protected :
  1175. /**
  1176. * 需要解析得字符串
  1177. */
  1178. CString m_strForParse;
  1179. /**
  1180. * 拼音
  1181. */
  1182. CString m_strSpell;
  1183. /**
  1184. * 笔顺
  1185. */
  1186. CString m_strStrokesOrder;
  1187. /**
  1188. * 笔画
  1189. */
  1190. CString m_strStrokes;
  1191. /**
  1192. * 部首
  1193. */
  1194. CString m_strBS;
  1195. };
  1196. public :
  1197. /**
  1198. * 拼音输入码分隔符
  1199. */
  1200. static const TCHAR s_cSpellLeft, s_cSpellRight;
  1201. /**
  1202. * 部首输入码分隔符
  1203. */
  1204. static const TCHAR s_cBSLeft, s_cBSRight;
  1205. /**
  1206. * 笔画输入码分隔符
  1207. */
  1208. static const TCHAR s_cStrokesLeft, s_cStrokesRight;
  1209. /**
  1210. * 笔顺输入码分隔符
  1211. */
  1212. static const TCHAR s_cStrokesOrderLeft, s_cStrokesOrderRight;
  1213. /**
  1214. * 分割字符
  1215. */
  1216. static TCHAR s_cDividTable[4][2];
  1217. /**
  1218. * 分别指左右分隔符
  1219. */
  1220. enum
  1221. {
  1222. begin = 0,
  1223. end = 1
  1224. };
  1225. protected :
  1226. /**
  1227. * 当前输入模式
  1228. */
  1229. int m_uMode;
  1230. /**
  1231. * 已经输入的所有码
  1232. */
  1233. CString m_strInputs;
  1234. };
  1235. /**
  1236. * 构造函数
  1237. */
  1238. ChineseInputer();
  1239. /**
  1240. * 排序器
  1241. */
  1242. class Sorter
  1243. {
  1244. protected :
  1245. /**
  1246. * 排序模式
  1247. */
  1248. Sorter( int nMode ) : m_nMode(nMode) { }
  1249. public :
  1250. /**
  1251. * 输出汉字排序模式
  1252. */
  1253. enum
  1254. {
  1255. /**
  1256. * 不排序
  1257. */
  1258. OrderByNone,
  1259. /**
  1260. * 按部首排序
  1261. */
  1262. OrderByBS,
  1263. /**
  1264. * 按拼音排序
  1265. */
  1266. OrderBySpell,
  1267. /**
  1268. * 按笔画排序
  1269. */
  1270. OrderByStrokes,
  1271. /**
  1272. * 按笔顺排序
  1273. */
  1274. OrderByStrokesOrder
  1275. };
  1276. /**
  1277. * 排序
  1278. */
  1279. virtual void Sort( WordEnumerator& enumer ) = 0;
  1280. /**
  1281. * 判断排序器是否相等
  1282. */
  1283. BOOL operator==( const Sorter& sb ) const
  1284. {
  1285. return m_nMode == sb.m_nMode;
  1286. }
  1287. /**
  1288. * 判断是否不等
  1289. */
  1290. BOOL operator!=( const Sorter& sb ) const
  1291. {
  1292. return m_nMode != sb.m_nMode;
  1293. }
  1294. /**
  1295. * 获得排序模式
  1296. */
  1297. int GetMode() const
  1298. {
  1299. return m_nMode;
  1300. }
  1301. protected :
  1302. /**
  1303. * 排序模式
  1304. */
  1305. int m_nMode;
  1306. };
  1307. /**
  1308. * 根据输入码, 查询汉字
  1309. */
  1310. BOOL QueryWords(  WordEnumerator& enumer, Sorter* pSorter=NULL );
  1311. typedef ChineseDictionary::BSQuery BSQuery;
  1312. /**
  1313. * 获得部首查询器
  1314. */
  1315. BSQuery* GetBSQuery()
  1316. {
  1317. return ChineseDictionary::GetBSQuery( );
  1318. }
  1319. typedef ChineseDictionary::SpellQuery SpellQuery;
  1320. /**
  1321. * 获得查询查询器
  1322. */
  1323. SpellQuery*  GetSpellQuery( )
  1324. {
  1325. return ChineseDictionary::GetSpellQuery();
  1326. }
  1327. typedef ChineseDictionary::StrokesQuery StrokesQuery;
  1328. /**
  1329. * 获得笔画查询器
  1330. */
  1331. StrokesQuery*  GetStroksQuery()
  1332. {
  1333. return ChineseDictionary::GetStrokesQuery();
  1334. }
  1335. typedef ChineseDictionary::StrokesOrderQuery StrokesOrderQuery;
  1336. /**
  1337. * 获得笔顺查询器
  1338. */
  1339. StrokesOrderQuery* GetStrokesOrderQuery()
  1340. {
  1341. return ChineseDictionary::GetStrokesOrderQuery();
  1342. }
  1343. /**
  1344. * 获得输入器
  1345. */
  1346. Inputer* GetInputer();
  1347. protected :
  1348. /**
  1349. * 输入器
  1350. */
  1351. Inputer m_Inputer;
  1352. protected :
  1353. /**
  1354. * 查询过滤器
  1355. */
  1356. class QueryFilter
  1357. {
  1358. public :
  1359. QueryFilter( const TCHAR* szFilter ) : m_strFilter(szFilter)
  1360. {
  1361. }
  1362. /**
  1363. * 析构函数
  1364. */
  1365. ~QueryFilter() { }
  1366. /**
  1367. * 查询
  1368. */
  1369. virtual BOOL QueryWords( WordEnumerator& enumer ) = 0;
  1370. /**
  1371. * 过滤字
  1372. */
  1373. virtual BOOL Pass( Word wd ) = 0;
  1374. /**
  1375. * 获得过滤器名称
  1376. */
  1377. const CString& GetFilter() const
  1378. {
  1379. return m_strFilter;
  1380. }
  1381. protected :
  1382. const ChineseDictionary::WordComment& GetComment(Word wd) 
  1383. {
  1384. ChineseDictionary::WordItemRef ref = ChineseDictionary::Get(wd);
  1385. ASSERT ( ref != ChineseDictionary::NullWordItemRef );
  1386. return ref.GetComment( );
  1387. }
  1388. protected :
  1389. /**
  1390. * 过滤器
  1391. */
  1392. CString m_strFilter;
  1393. };
  1394. /**
  1395. * 拼音过滤器
  1396. */
  1397. class SpellFilter : public QueryFilter
  1398. {
  1399. public :
  1400. /**
  1401. * 构造函数
  1402. */
  1403. SpellFilter( const TCHAR* szSpell );
  1404. ~SpellFilter() { }
  1405. /**
  1406. * 查询
  1407. */
  1408. BOOL QueryWords( WordEnumerator& enumer );
  1409. /**
  1410. * 过滤字
  1411. */
  1412. BOOL Pass( Word wd );
  1413. };
  1414. /**
  1415. * 部首过滤器
  1416. */
  1417. class BSFilter : public QueryFilter
  1418. {
  1419. public :
  1420. /**
  1421. * 构造函数
  1422. */
  1423. BSFilter( const TCHAR* szBS );
  1424. /**
  1425. * 查询
  1426. */
  1427. BOOL QueryWords( WordEnumerator& enumer );
  1428. /**
  1429. * 过滤字
  1430. */
  1431. BOOL Pass( Word wd );
  1432. };
  1433. /**
  1434. * 笔画过滤器
  1435. */
  1436. class StrokesFilter : public QueryFilter
  1437. {
  1438. public :
  1439. /**
  1440. * 构造函数
  1441. */
  1442. StrokesFilter( const TCHAR* szBS );
  1443. /**
  1444. * 查询
  1445. */
  1446. BOOL QueryWords( WordEnumerator& enumer );
  1447. /**
  1448. * 过滤字
  1449. */
  1450. BOOL Pass( Word wd );
  1451. /**
  1452. * 笔画数
  1453. */
  1454. int GetStrokes() const
  1455. {
  1456. return m_nStrokes;
  1457. };
  1458. protected :
  1459. /**
  1460. * 笔画数
  1461. */
  1462. int m_nStrokes;
  1463. };
  1464. /**
  1465. * 笔顺过滤器
  1466. */
  1467. class StrokesOrderFilter : public QueryFilter
  1468. {
  1469. public :
  1470. /**
  1471. * 构造函数
  1472. */
  1473. StrokesOrderFilter( const StrokesOrder& sodr );
  1474. /**
  1475. * 查询
  1476. */
  1477. BOOL QueryWords( WordEnumerator& enumer );
  1478. /**
  1479. * 过滤字
  1480. */
  1481. BOOL Pass( Word wd );
  1482. };
  1483. /**
  1484. * 查询代理器
  1485. */
  1486. class QueryBroker
  1487. {
  1488. public :
  1489. /**
  1490. * 析构函数
  1491. */
  1492. ~QueryBroker();
  1493. /**
  1494. * 加入过滤器
  1495. */
  1496. void AddFilter( QueryFilter* pFilter, BOOL bAutoDel=FALSE );
  1497. /**
  1498. * 查询
  1499. */
  1500. BOOL QueryWords( WordEnumerator& enumer );
  1501. protected :
  1502. /**
  1503. * 过滤器集合
  1504. */
  1505. vector<QueryFilter*> m_vFilters;
  1506. /**
  1507. * 自动删除标记
  1508. */
  1509. vector<BOOL> m_vDeletes;
  1510. };
  1511. /**
  1512. * 拼音排序
  1513. */
  1514. class SpellSort : public Sorter
  1515. {
  1516. public :
  1517. /**
  1518. * 排序器构造函数
  1519. */
  1520. SpellSort() : Sorter(OrderBySpell) {};
  1521. /**
  1522. * 排序
  1523. */
  1524. void Sort( WordEnumerator& enumer );
  1525. /**
  1526. * 获得前缀
  1527. */
  1528. const CString& GetPrefix() const
  1529. {
  1530. return m_strSpellPrefix;
  1531. }
  1532. /**
  1533. * 设置前缀
  1534. */
  1535. void SetPrefix( const TCHAR* szPrefix )
  1536. {
  1537. m_strSpellPrefix = szPrefix;
  1538. }
  1539. protected :
  1540. /**
  1541. * 排序得主拼音
  1542. */
  1543. CString m_strSpellPrefix;
  1544. };
  1545. /**
  1546. * 部首排序
  1547. */
  1548. class BSSort : public Sorter
  1549. {
  1550. public :
  1551. /**
  1552. * 排序器构造函数
  1553. */
  1554. BSSort() : Sorter(OrderByBS) {};
  1555. /**
  1556. * 排序
  1557. */
  1558. void Sort( WordEnumerator& enumer );
  1559. };
  1560. /**
  1561. * 笔画排序
  1562. */
  1563. class StrokesSort : public Sorter
  1564. {
  1565. public :
  1566. /**
  1567. * 排序器构造函数
  1568. */
  1569. StrokesSort() : Sorter(OrderByStrokes) {};
  1570. /**
  1571. * 排序
  1572. */
  1573. void Sort( WordEnumerator& enumer );
  1574. };
  1575. /**
  1576. * 笔顺排序
  1577. */
  1578. class StrokesOrderSort : public Sorter
  1579. {
  1580. public :
  1581. /**
  1582. * 排序器构造函数
  1583. */
  1584. StrokesOrderSort() : Sorter(OrderByStrokesOrder) {};
  1585. /**
  1586. * 排序
  1587. */
  1588. void Sort( WordEnumerator& enumer );
  1589. };
  1590. /**
  1591. * 空排序器
  1592. */
  1593. class NullSort : public Sorter
  1594. {
  1595. public :
  1596. /**
  1597. * 排序器构造函数
  1598. */
  1599. NullSort() : Sorter(OrderByNone) {};
  1600. /**
  1601. * 排序
  1602. */
  1603. void Sort( WordEnumerator& enumer ) {};
  1604. };
  1605. public :
  1606. /**
  1607. * 组合排序器
  1608. */
  1609. class CompositeSort : public SpellSort
  1610. {
  1611. public :
  1612. /**
  1613. * 构造函数
  1614. */
  1615. CompositeSort()  { m_nMode = -1;}
  1616. /**
  1617. * 加入排序模式
  1618. */
  1619. void AddMode( int uMode );
  1620. /**
  1621. * 排序
  1622. */
  1623. void Sort( WordEnumerator& enumer );
  1624. /**
  1625. * 清除所有模式
  1626. */
  1627. void ClearModes();
  1628. protected :
  1629. /**
  1630. * 排序模式
  1631. */
  1632. vector<int> m_vModes;
  1633. };
  1634. /**
  1635. * 空排序器
  1636. */
  1637. static NullSort* GetNullSort();
  1638. /**
  1639. * 拼音排序器
  1640. */
  1641. static SpellSort* GetSpellSort();
  1642. /**
  1643. * 笔画排序器
  1644. */
  1645. static StrokesSort* GetStrokesSort();
  1646. /**
  1647. * 部首排序器
  1648. */
  1649. static BSSort* GetBSSort();
  1650. /**
  1651. * 笔顺排序器
  1652. */
  1653. static StrokesOrderSort* GetStrokesOrderSort();
  1654. /**
  1655. * 组合排序起
  1656. */
  1657. static CompositeSort* GetCompositeSort();
  1658. };
  1659. /**
  1660. * 名称转换类
  1661. * 将中文名转换成拼音名
  1662. */
  1663. class NameTransform
  1664. {
  1665. public :
  1666. /**
  1667. * 将中文名转换成拼音文件名
  1668. */
  1669. static BOOL Chinese2PY( const TCHAR* szName, TCHAR* szNewName )
  1670. {
  1671. const char* pCurSrc = szName;
  1672. char* pCurDst = szNewName;
  1673. while ( *pCurSrc )
  1674. {
  1675. if ( *pCurSrc > 0 ) // digit and char
  1676. {
  1677. *pCurDst++ = *pCurSrc++;
  1678. }
  1679. else // chinese
  1680. {
  1681. char  strWord[3];
  1682. strWord[0] = *pCurSrc;
  1683. strWord[1] = *(pCurSrc+1);
  1684. strWord[2] = '';
  1685. ChineseDictionary::WordItemRef wordRef = ChineseDictionary::Get( Word(strWord) );
  1686. if ( wordRef == ChineseDictionary::NullWordItemRef )
  1687. return FALSE;
  1688. // 获得第一拼音
  1689. const SpellGroup& spells = wordRef.GetComment().GetSpellGroup();
  1690. SpellGroup::const_iterator it = spells.begin();
  1691. CString strEnglishName = *it;
  1692. int nLen = strEnglishName.GetLength();
  1693. strncpy( pCurDst, strEnglishName, nLen );
  1694. pCurSrc += 2;
  1695. pCurDst += nLen;
  1696. }
  1697. }
  1698. *pCurDst = '';
  1699. return TRUE;
  1700. }
  1701. };
  1702. //=========================================================================================
  1703. // 拼音组
  1704. //=========================================================================================
  1705. inline
  1706. SpellGroup::SpellGroup()
  1707. {
  1708. m_vSpell.reserve(3);
  1709. }
  1710. inline
  1711. SpellGroup::SpellGroup( const TCHAR* szSpellGroup )
  1712. {
  1713. AddGroup( szSpellGroup );
  1714. }
  1715. inline
  1716. int SpellGroup::GetCount() const
  1717. {
  1718. return m_vSpell.size();
  1719. }
  1720. };
  1721. #endif