对该段代码进行详细介绍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; }
时间: 2023-06-26 09:04:57 浏览: 134
这是一个 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>` 标签用于设置字体大小。最后返回该字符串。
相关问题
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; }代码超详细介绍
这段代码是在 CAnalyzeDlg 类中定义的 GetStepInfo 函数,主要用于生成语法分析器的分析表。函数接受五个参数:
1. iStep:当前步骤的编号。
2. Status:当前状态。
3. Symbol:当前输入符号。
4. sInput:剩余输入串。
5. Action:当前动作。
6. Goto:下一个状态。
函数返回一个 CString 类型的字符串,其中包含了当前步骤的信息,用于在界面上显示。
具体实现:
1. 创建 rtn 变量,用于存储函数返回结果。
2. 使用 Format 函数将当前步骤编号添加到 rtn 字符串中。
3. 创建 t2 变量,用于存储当前状态的 HTML 格式字符串。
4. 遍历 Status 数组,根据当前数组索引的奇偶性,将当前状态以不同的格式添加到 t2 变量中。
5. 将 t2 字符串添加到 rtn 字符串中。
6. 创建 t 变量,用于存储当前输入符号的 HTML 格式字符串。
7. 遍历 Symbol 数组,将每个输入符号以单个字符的形式添加到 t 变量中。
8. 将 t 变量添加到 rtn 字符串中。
9. 将剩余输入串 sInput 添加到 rtn 字符串中。
10. 如果当前动作不是接受动作,则将当前动作以 HTML 格式字符串的形式添加到 t2 变量中;否则将字符串 "acc" 添加到 t2 变量中。
11. 将 t2 变量添加到 rtn 字符串中。
12. 如果下一个状态是 -1,则在 rtn 字符串中添加空格;否则将下一个状态以 HTML 格式字符串的形式添加到 rtn 字符串中。
13. 在 rtn 字符串末尾添加 HTML 标签,返回 rtn 字符串。
总之,这段代码是用于生成语法分析表的 HTML 格式字符串,方便在用户界面上展示。
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; };代码详细介绍
这是一个 MFC 对话框类 CAnalyzeDlg,继承自 CResizingDialog。其中包含了以下成员函数:
- GetStepInfo:根据当前分析步骤的状态、符号、输入、动作以及 Goto 表信息,构造一个分析步骤的信息字符串。
- SetGrammar:设置语法规则。
- OnOK、OnCancel:处理对话框的 OK 和 Cancel 按钮消息。
- OnInitDialog:初始化对话框。
- OnButton1、OnButton2:处理对话框中的两个按钮消息。
- OnActivate:处理对话框激活消息。
此外,该类还包含了以下成员变量:
- m_g:语法规则。
- m_pTree:指向语法分析树对话框的指针。
- m_strTempFilename:临时文件名。
- TreeStack:用于构造语法分析树的栈。
阅读全文