AjaxParserDlg.cpp
上传用户:kalinte
上传日期:2013-04-07
资源大小:127k
文件大小:9k
源码类别:

DNA

开发平台:

C++ Builder

  1. // AjaxParserDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "AjaxParser.h"
  5. #include "AjaxParserDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. // this is comment
  14. class CAboutDlg : public CDialog
  15. {
  16. public:
  17. CAboutDlg();
  18. // Dialog Data
  19. //{{AFX_DATA(CAboutDlg)
  20. enum { IDD = IDD_ABOUTBOX };
  21. //}}AFX_DATA
  22. // ClassWizard generated virtual function overrides
  23. //{{AFX_VIRTUAL(CAboutDlg)
  24. protected:
  25. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  26. //}}AFX_VIRTUAL
  27. // Implementation
  28. protected:
  29. //{{AFX_MSG(CAboutDlg)
  30. //}}AFX_MSG
  31. DECLARE_MESSAGE_MAP()
  32. };
  33. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  34. {
  35. //{{AFX_DATA_INIT(CAboutDlg)
  36. //}}AFX_DATA_INIT
  37. }
  38. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. //{{AFX_DATA_MAP(CAboutDlg)
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  45. //{{AFX_MSG_MAP(CAboutDlg)
  46. // No message handlers
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CAjaxParserDlg dialog
  51. CAjaxParserDlg::CAjaxParserDlg(CWnd* pParent /*=NULL*/)
  52. : CDialog(CAjaxParserDlg::IDD, pParent)
  53. {
  54. //{{AFX_DATA_INIT(CAjaxParserDlg)
  55. // NOTE: the ClassWizard will add member initialization here
  56. //}}AFX_DATA_INIT
  57. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  58. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  59. double a = 1.21e1;
  60. }
  61. void CAjaxParserDlg::DoDataExchange(CDataExchange* pDX)
  62. {
  63. CDialog::DoDataExchange(pDX);
  64. //{{AFX_DATA_MAP(CAjaxParserDlg)
  65. DDX_Control(pDX, IDC_EDIT1, m_edit);
  66. //}}AFX_DATA_MAP
  67. }
  68. BEGIN_MESSAGE_MAP(CAjaxParserDlg, CDialog)
  69. //{{AFX_MSG_MAP(CAjaxParserDlg)
  70. ON_WM_SYSCOMMAND()
  71. ON_WM_PAINT()
  72. ON_WM_QUERYDRAGICON()
  73. ON_BN_CLICKED(IDC_PARSE, OnParse)
  74. //}}AFX_MSG_MAP
  75. END_MESSAGE_MAP()
  76. /////////////////////////////////////////////////////////////////////////////
  77. // CAjaxParserDlg message handlers
  78. BOOL CAjaxParserDlg::OnInitDialog()
  79. {
  80. CDialog::OnInitDialog();
  81. // Add "About..." menu item to system menu.
  82. // IDM_ABOUTBOX must be in the system command range.
  83. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  84. ASSERT(IDM_ABOUTBOX < 0xF000);
  85. CMenu* pSysMenu = GetSystemMenu(FALSE);
  86. if (pSysMenu != NULL)
  87. {
  88. CString strAboutMenu;
  89. strAboutMenu.LoadString(IDS_ABOUTBOX);
  90. if (!strAboutMenu.IsEmpty())
  91. {
  92. pSysMenu->AppendMenu(MF_SEPARATOR);
  93. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  94. }
  95. }
  96. // Set the icon for this dialog.  The framework does this automatically
  97. //  when the application's main window is not a dialog
  98. SetIcon(m_hIcon, TRUE); // Set big icon
  99. SetIcon(m_hIcon, FALSE); // Set small icon
  100. // TODO: Add extra initialization here
  101. CStateChangeRule rule;
  102. rule.nCurState = 0;
  103. rule.nNextState = 1;
  104. rule.route[0].byStart = '_';
  105. rule.route[0].byEnd = '_';
  106. rule.route[1].byStart = 'A';
  107. rule.route[1].byEnd = 'Z';
  108. rule.route[2].byStart = 'a';
  109. rule.route[2].byEnd = 'z';
  110. m_ruleArr.Add(rule);
  111. rule.Clear();
  112. rule.nCurState = 0;
  113. rule.nNextState = 0;
  114. rule.route[0].byStart = 'r';
  115. rule.route[0].byEnd = 'r';
  116. rule.route[1].byStart = 'n';
  117. rule.route[1].byEnd = 'n';
  118. rule.route[2].byStart = ' ';
  119. rule.route[2].byEnd = ' ';
  120. rule.route[3].byStart = 't';
  121. rule.route[3].byEnd = 't';
  122. m_ruleArr.Add(rule);
  123. rule.Clear();
  124. rule.nCurState = 1;
  125. rule.nNextState = 1;
  126. rule.route[0].byStart = '_';
  127. rule.route[0].byEnd = '_';
  128. rule.route[1].byStart = 'A';
  129. rule.route[1].byEnd = 'Z';
  130. rule.route[2].byStart = 'a';
  131. rule.route[2].byEnd = 'z';
  132. rule.route[3].byStart = '0';
  133. rule.route[3].byEnd = '9';
  134. m_ruleArr.Add(rule);
  135. rule.Clear();
  136. rule.nCurState = 0;
  137. rule.nNextState = 2;
  138. rule.route[0].byStart = '+';
  139. rule.route[0].byEnd = '+';
  140. rule.route[1].byStart = '-';
  141. rule.route[1].byEnd = '-';
  142. m_ruleArr.Add(rule);
  143. rule.Clear();
  144. rule.nCurState = 0;
  145. rule.nNextState = 3;
  146. rule.route[0].byStart = '0';
  147. rule.route[0].byEnd = '9';
  148. m_ruleArr.Add(rule);
  149. rule.Clear();
  150. rule.nCurState = 2;
  151. rule.nNextState = 3;
  152. rule.route[0].byStart = '0';
  153. rule.route[0].byEnd = '9';
  154. m_ruleArr.Add(rule);
  155. rule.Clear();
  156. rule.nCurState = 2;
  157. rule.nNextState = 6;
  158. rule.route[0].byStart = '.';
  159. rule.route[0].byEnd = '.';
  160. m_ruleArr.Add(rule);
  161. rule.Clear();
  162. rule.nCurState = 0;
  163. rule.nNextState = 6;
  164. rule.route[0].byStart = '.';
  165. rule.route[0].byEnd = '.';
  166. m_ruleArr.Add(rule);
  167. rule.Clear();
  168. rule.nCurState = 3;
  169. rule.nNextState = 3;
  170. rule.route[0].byStart = '0';
  171. rule.route[0].byEnd = '9';
  172. m_ruleArr.Add(rule);
  173. rule.Clear();
  174. rule.nCurState = 3;
  175. rule.nNextState = 4;
  176. rule.route[0].byStart = '.';
  177. rule.route[0].byEnd = '.';
  178. m_ruleArr.Add(rule);
  179. rule.Clear();
  180. rule.nCurState = 4;
  181. rule.nNextState = 5;
  182. rule.route[0].byStart = '0';
  183. rule.route[0].byEnd = '9';
  184. m_ruleArr.Add(rule);
  185. rule.Clear();
  186. rule.nCurState = 6;
  187. rule.nNextState = 7;
  188. rule.route[0].byStart = '0';
  189. rule.route[0].byEnd = '9';
  190. m_ruleArr.Add(rule);
  191. rule.Clear();
  192. rule.nCurState = 7;
  193. rule.nNextState = 7;
  194. rule.route[0].byStart = '0';
  195. rule.route[0].byEnd = '9';
  196. m_ruleArr.Add(rule);
  197. rule.Clear();
  198. rule.nCurState = 5;
  199. rule.nNextState = 5;
  200. rule.route[0].byStart = '0';
  201. rule.route[0].byEnd = '9';
  202. m_ruleArr.Add(rule);
  203. rule.Clear();
  204. DFA_STATE state;
  205. // 0
  206. state.nFlag = STATE_START;
  207. m_stateArr.Add(state);
  208. // 1
  209. state.nFlag = STATE_END;
  210. m_stateArr.Add(state);
  211. // 2
  212. state.nFlag = 0;
  213. m_stateArr.Add(state);
  214. // 3
  215. state.nFlag = STATE_END;
  216. m_stateArr.Add(state);
  217. // 4
  218. state.nFlag = STATE_END;
  219. m_stateArr.Add(state);
  220. // 5
  221. state.nFlag = STATE_END;
  222. m_stateArr.Add(state);
  223. // 6
  224. state.nFlag = 0;
  225. m_stateArr.Add(state);
  226. // 7
  227. state.nFlag = STATE_END;
  228. m_stateArr.Add(state);
  229. return TRUE;  // return TRUE  unless you set the focus to a control
  230. }
  231. void CAjaxParserDlg::OnSysCommand(UINT nID, LPARAM lParam)
  232. {
  233. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  234. {
  235. CAboutDlg dlgAbout;
  236. dlgAbout.DoModal();
  237. }
  238. else
  239. {
  240. CDialog::OnSysCommand(nID, lParam);
  241. }
  242. }
  243. // If you add a minimize button to your dialog, you will need the code below
  244. //  to draw the icon.  For MFC applications using the document/view model,
  245. //  this is automatically done for you by the framework.
  246. void CAjaxParserDlg::OnPaint() 
  247. {
  248. if (IsIconic())
  249. {
  250. CPaintDC dc(this); // device context for painting
  251. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  252. // Center icon in client rectangle
  253. int cxIcon = GetSystemMetrics(SM_CXICON);
  254. int cyIcon = GetSystemMetrics(SM_CYICON);
  255. CRect rect;
  256. GetClientRect(&rect);
  257. int x = (rect.Width() - cxIcon + 1) / 2;
  258. int y = (rect.Height() - cyIcon + 1) / 2;
  259. // Draw the icon
  260. dc.DrawIcon(x, y, m_hIcon);
  261. }
  262. else
  263. {
  264. CDialog::OnPaint();
  265. }
  266. }
  267. // The system calls this to obtain the cursor to display while the user drags
  268. //  the minimized window.
  269. HCURSOR CAjaxParserDlg::OnQueryDragIcon()
  270. {
  271. return (HCURSOR) m_hIcon;
  272. }
  273. int InRoute(BYTE c, CHAR_RANGE *pRange)
  274. {
  275. int i=0;
  276. while(i<ROUTE_BUF_LEN && pRange->byEnd!=0xff)
  277. {
  278. if(pRange[i].byEnd>=c && pRange[i].byStart<=c)
  279. {
  280. return 1;
  281. }
  282. i++;
  283. }
  284. return 0;
  285. }
  286. int CAjaxParserDlg::Route(int nCurState, BYTE c)
  287. {
  288. int i, nSize;
  289. nSize = m_ruleArr.GetSize();
  290. CStateChangeRule rule;
  291. for(i=0; i<nSize; i++)
  292. {
  293. rule = m_ruleArr[i];
  294. if(rule.nCurState==nCurState
  295. && InRoute(c, rule.route))
  296. {
  297. return rule.nNextState;
  298. }
  299. }
  300. if(nCurState==0)
  301. {
  302. Logln("start state, cannot recognize char");
  303. }
  304. // return to state 0 the start state
  305. return 0;
  306. }
  307. void CAjaxParserDlg::Accept(int nCurrent, int nNext, LPCTSTR pszLine, int nLen)
  308. {
  309. char psz[256];
  310. if(nNext==0 && nCurrent!=0)
  311. {
  312. sprintf(psz, "Accept word(s:%d)[", nCurrent);
  313. Log(psz);
  314. strncpy(psz, pszLine, nLen);
  315. psz[nLen] = 0;
  316. Log(psz);
  317. if(!(m_stateArr[nCurrent].nFlag&STATE_END))
  318. {
  319. Logln("]unrecogized char, can't accept");
  320. }
  321. else
  322. {
  323. Logln("]");
  324. }
  325. }
  326. }
  327. void CAjaxParserDlg::OnParse() 
  328. {
  329. char *pszLine = " void CAjaxParserDlg::OnParse() +12.3 12.3 -12.3 -.12 +.12 .12 +12. -12. 12. .023 .  +. -. + -";
  330. int i=0, nLen, nState=0, nNext=-1, nStart;
  331. nLen = strlen(pszLine);
  332. while(i<nLen)
  333. {
  334. if(nState==0)
  335. {
  336. nStart = i;
  337. }
  338. nNext = Route(nState, *(pszLine+i));
  339. Accept(nState, nNext, pszLine+nStart, i-nStart);
  340. if(!(nState!=0 && nNext==0))
  341. i++;
  342. nState = nNext;
  343. }
  344. Accept(nState, 0, pszLine+nStart, i-nStart);
  345. }
  346. void CAjaxParserDlg::Logln(LPCTSTR psz)
  347. {
  348. m_edit.SetSel(-1,-1);
  349. m_edit.ReplaceSel(psz);
  350. m_edit.ReplaceSel("rn");
  351. }
  352. void CAjaxParserDlg::Log(LPCTSTR psz)
  353. {
  354. m_edit.SetSel(-1,-1);
  355. m_edit.ReplaceSel(psz);
  356. }