class CAnalyzeDlg : public CResizingDialog { // Construction public: CString GetStepInfo(int iStep, const vector <int> & Status, const vector <char> & Symbol, CString sInput, Pair Action, int Goto); CAnalyzeDlg(CWnd* pParent = NULL); // standard constructor ~CAnalyzeDlg(); void SetGrammar(const Grammar & g); // Dialog Data //{{AFX_DATA(CAnalyzeDlg) enum { IDD = IDD_DIALOG2 }; CEdit m_edit1; CExplorer1 m_web; CString m_input; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAnalyzeDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: Grammar m_g; CTreeDlg * m_pTree; string m_strTempFilename; // Generated message map functions //{{AFX_MSG(CAnalyzeDlg) virtual void OnOK(); virtual void OnCancel(); afx_msg void OnButton1(); virtual BOOL OnInitDialog(); afx_msg void OnButton2(); afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: void MakeTree(); stack <int> TreeStack; };代码解释
时间: 2023-07-14 18:11:52 浏览: 97
这是 MFC 中一个用于语法分析的对话框类 CAnalyzeDlg 的定义。它继承自 CResizingDialog 类,具有自适应大小的特性。其中包含了成员函数 GetStepInfo、SetGrammar、MakeTree 等。GetStepInfo 用于获取语法分析过程中每一步的信息,SetGrammar 用于设置语法分析所使用的文法,MakeTree 用于生成分析树。在对话框上,包含了一个编辑框和一个 CExplorer1 控件,用于显示分析结果和分析树。
相关问题
CString CAnalyzeDlg::GetStepInfo(int iStep, const vector<int> & Status, const vector<char> & Symbol, CString sInput, Pair Action, int Goto) { CString rtn; rtn.Format("<tr><td nowrap> %d </td>\n",iStep); CString t2 = ""; CString t; int nCount = 0; for (int i = 0; i < Status.size(); i++) { if (nCount % 2) t.Format("%d", Status[i]); else t.Format("<u>%d</U>", Status[i]); t2 += t; nCount++; } rtn = rtn + "<td nowrap> " + t2 + " </td>\n<td nowrap> "; t2 = ""; for(i = 0; i < Symbol.size(); i++) { t.Format("%c", Symbol[i]); t2 += t; } rtn = rtn + t2 + " </td>\n"; rtn = rtn + "<td nowrap> " + sInput + " </td>\n"; if (Action.one != 'a') t2.Format("%c<font size=\"1\">%d</font>", Action.one, Action.two); else t2 = "acc"; rtn = rtn + "<td nowrap> " + t2 + " </td>\n"; if (Goto == -1) rtn += "<td nowrap> </td>\n"; else { t2.Format("<td nowrap> %d </td>\n", Goto); rtn += t2; } rtn += "</tr>\n"; return rtn; }代解释
这是一个 MFC 对话框程序中的函数,用于获取语法分析过程中每个步骤的信息并以 HTML 表格形式返回。函数的参数包括:
- iStep:当前步骤的编号
- Status:状态栈中的状态序列,其中某些状态被加下划线表示
- Symbol:符号栈中的符号序列
- sInput:输入串
- Action:当前动作,包括一个字符和一个整数,如果字符为 'a' 则表示接受
- Goto:跳转到的状态编号,如果为 -1 则表示不需要跳转
函数返回一个 CString 类型的字符串,包含 HTML 表格的一行信息,其中包括每个步骤的编号、状态栈序列、符号栈序列、输入串、当前动作和跳转到的状态编号等信息。
对该段代码进行详细介绍CString CAnalyzeDlg::GetStepInfo(int iStep, const vector<int> & Status, const vector<char> & Symbol, CString sInput, Pair Action, int Goto) { CString rtn; rtn.Format("<tr><td nowrap> %d </td>\n",iStep); CString t2 = ""; CString t; int nCount = 0; for (int i = 0; i < Status.size(); i++) { if (nCount % 2) t.Format("%d", Status[i]); else t.Format("<u>%d</U>", Status[i]); t2 += t; nCount++; } rtn = rtn + "<td nowrap> " + t2 + " </td>\n<td nowrap> "; t2 = ""; for(i = 0; i < Symbol.size(); i++) { t.Format("%c", Symbol[i]); t2 += t; } rtn = rtn + t2 + " </td>\n"; rtn = rtn + "<td nowrap> " + sInput + " </td>\n"; if (Action.one != 'a') t2.Format("%c<font size=\"1\">%d</font>", Action.one, Action.two); else t2 = "acc"; rtn = rtn + "<td nowrap> " + t2 + " </td>\n"; if (Goto == -1) rtn += "<td nowrap> </td>\n"; else { t2.Format("<td nowrap> %d </td>\n", Goto); rtn += t2; } rtn += "</tr>\n"; return rtn; }
这是一个 MFC 对话框类 CAnalyzeDlg 的成员函数,用于获取分析表的某一步信息,并返回一个 CString 对象。
参数列表中:
- iStep 表示步骤号;
- Status 是一个整型向量,表示状态集合;
- Symbol 是一个字符向量,表示输入符号序列;
- sInput 是一个 CString 对象,表示当前输入符号;
- Action 是一个 Pair 对象,表示分析动作;
- Goto 表示转移状态号。
函数返回的 CString 对象包含了 HTML 的表格行数据,格式如下:
```
<tr>
<td nowrap> 步骤号 </td>
<td nowrap> 状态集合 </td>
<td nowrap> 输入符号序列 </td>
<td nowrap> 当前输入符号 </td>
<td nowrap> 分析动作 </td>
<td nowrap> 转移状态号 </td>
</tr>
```
其中,状态集合中的奇数项用 `<u>` 标签表示,输入符号序列和当前输入符号用空格隔开,分析动作中的 `a` 表示接受状态,`<font>` 标签用于设置字体大小。最后返回该字符串。
阅读全文