www.pudn.com > ll1forwin.zip > AnalyzeDlg.cpp


// AnalyzeDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "ll1forwin.h" 
#include "AnalyzeDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAnalyzeDlg dialog 
 
 
CAnalyzeDlg::CAnalyzeDlg(CWnd* pParent /*=NULL*/) 
	: CResizingDialog(CAnalyzeDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAnalyzeDlg) 
	m_input = _T(""); 
	//}}AFX_DATA_INIT 
	m_strTempFilename = ""; 
	m_pTree = new CTreeDlg; 
	m_pTree->Create(IDD_DIALOG3, this); 
	m_pTree->SetControlInfo(IDC_TREE1, RESIZE_BOTH); 
	m_pTree->SetControlInfo(IDOK, ANCHORE_BOTTOM | ANCHORE_RIGHT); 
} 
 
CAnalyzeDlg::~CAnalyzeDlg() 
{ 
	m_pTree->DestroyWindow(); 
	delete m_pTree; 
} 
 
void CAnalyzeDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CResizingDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAnalyzeDlg) 
	DDX_Control(pDX, IDC_EDIT1, m_edit1); 
	DDX_Text(pDX, IDC_EDIT1, m_input); 
	DDX_Control(pDX, IDC_EXPLORER1, m_web); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CAnalyzeDlg, CResizingDialog) 
	//{{AFX_MSG_MAP(CAnalyzeDlg) 
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1) 
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2) 
	ON_WM_ACTIVATE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAnalyzeDlg message handlers 
 
void CAnalyzeDlg::OnButton1()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(TRUE); 
	m_pTree->m_tree.DeleteAllItems(); 
	for(int i = 0; i < m_input.GetLength(); i ++) 
	{ 
		if (!m_g.IsInVt(m_input.GetAt(i))) 
		{ 
			MessageBox("输入的句子不全部由终结符组成", "错误", MB_OK | MB_ICONSTOP); 
			return; 
		} 
	} 
	char szTempPath[MAX_PATH];  
	char szTempName[MAX_PATH];  
	if (m_strTempFilename != "") 
		::DeleteFile(m_strTempFilename.c_str()); 
	::GetTempPath(100,szTempPath); 
	::GetTempFileName(szTempPath,"LL1",0,szTempName); 
	m_strTempFilename = szTempName; 
	CStdioFile out; 
	out.Open(szTempName, CFile::modeCreate | CFile::modeWrite); 
	out.WriteString("\n"); 
	out.WriteString("\n"); 
	out.WriteString("Untitled Document\n"); 
	out.WriteString("\n"); 
	out.WriteString("\n"); 
	out.WriteString("\n"); 
	out.WriteString("\n"); 
    out.WriteString(""); 
	stack  input; 
	input.push('#'); 
	for(i = m_input.GetLength() -1; i >= 0; i --) 
		input.push(m_input.GetAt(i)); 
	stack  s; 
	s.push('#'); 
	s.push(m_g.GetStart()); 
	Precept p; 
	bool error = false; 
	int iStep = 0; 
	stack  st; 
	HTREEITEM hRoot = m_pTree->m_tree.InsertItem(CString(m_g.GetStart())); 
	st.push(hRoot); 
	while(true) 
	{ 
		out.WriteString(GetStepInfo(s, input, iStep++, p)); 
		p.Clear(); 
		if (s.top() == input.top()) 
		{ 
			if (input.top() == '#') 
				break; 
			else 
			{ 
				s.pop(); 
				st.pop(); 
				input.pop(); 
			} 
		} 
		else 
		{ 
			if (!m_g.IsInVn(s.top())) 
			{ 
				error = true; 
				break; 
			} 
			if ((p = m_g.GetToDo(s.top(),input.top())).GetLeft() != "") 
			{ 
				s.pop(); 
				HTREEITEM t = st.top(); 
				st.pop(); 
				if (p.GetRight() != "@") 
				{ 
					for(int i = (int) p.GetRight().length() -1; i >=0; i --) 
					{ 
						s.push(p.GetRight()[i]); 
						st.push(m_pTree->m_tree.InsertItem(CString(p.GetRight()[i]), t)); 
					} 
				} 
				else 
				{ 
					m_pTree->m_tree.InsertItem("@", t); 
				} 
			} 
			else 
			{ 
				error = true; 
				break; 
			} 
		} 
	} 
	out.WriteString("
 步骤  符号栈  输入串  所用生成式 
"); if (error) { out.WriteString("

分析失败,输入的字符串是不符合预定文法的!

\n"); m_pTree->m_tree.DeleteAllItems(); } else { out.WriteString("

分析完成,输入的字符串是预定文法的句子

\n"); HTREEITEM h = m_pTree->m_tree.GetRootItem(); ExpandTree(h); } out.WriteString("\n"); out.Close(); m_web.Navigate(szTempName,NULL,NULL,NULL,NULL); m_edit1.SetFocus(); m_edit1.SetSel(0, -1); } CString CAnalyzeDlg::GetStepInfo(stack s, stack input, int iStep, Precept p) { CString rtn; CString t; CString t2; rtn.Format("  %d  \n",iStep); t2 = ""; while(!s.empty()) { t.Format("%c", s.top()); if(m_g.IsInVn(s.top())) t2 = "" + t + "" + t2; else if (s.top() != '#') t2 = "" + t + "" + t2; else t2 = t + t2; s.pop(); } rtn = rtn + "  " + t2 + "  \n"; t2 = "  "; while(!input.empty()) { t.Format("%c", input.top()); if (input.top() != '#') t2 = t2 + "" + t + ""; else t2 += t; input.pop(); } rtn = rtn + t2 + "  \n"; if (p.GetLeft() != "") { rtn = rtn + "  " + p.GetLeft().c_str() + "->" + p.GetRight().c_str() + "  \n"; string strRight = p.GetRight(); } else rtn = rtn + " \n"; return rtn; } void CAnalyzeDlg::ExpandTree(HTREEITEM h) { m_pTree->m_tree.Expand(h, TVE_EXPAND); HTREEITEM hChild = m_pTree->m_tree.GetChildItem(h); while (hChild != NULL) { if (m_pTree->m_tree.ItemHasChildren(hChild)) ExpandTree(hChild); hChild = m_pTree->m_tree.GetNextItem(hChild, TVGN_NEXT); } } void CAnalyzeDlg::SetGrammar(const Grammar & g) { m_g = g; } void CAnalyzeDlg::OnButton2() { // TODO: Add your control notification handler code here CRect rect; GetWindowRect(rect); //int iWidth = GetSystemMetrics(SM_CXSCREEN) - rect.right; //if (iWidth < 200) // iWidth = 200; if(!m_pTree->IsWindowVisible()) m_pTree->SetWindowPos(&wndTopMost,GetSystemMetrics(SM_CXSCREEN) - 280, 0, 250, 350, SWP_SHOWWINDOW); m_pTree->SetFocus(); } BOOL CAnalyzeDlg::OnInitDialog() { CResizingDialog::OnInitDialog(); SetIcon(LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)),FALSE); // TODO: Add extra initialization here m_web.Navigate("about:blank",NULL,NULL,NULL,NULL); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CAnalyzeDlg::OnOK() { // TODO: Add extra validation here //CResizingDialog::OnOK(); } //DEL BOOL CAnalyzeDlg::OnNcActivate(BOOL bActive) //DEL { //DEL // TODO: Add your message handler code here and/or call default //DEL //DEL return CResizingDialog::OnNcActivate(bActive); //DEL } void CAnalyzeDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CResizingDialog::OnActivate(nState, pWndOther, bMinimized); if (nState == WA_INACTIVE) m_pTree->SetWindowPos(&wndNoTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE |SWP_NOACTIVATE ); else m_pTree->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE |SWP_NOACTIVATE ); // TODO: Add your message handler code here } void CAnalyzeDlg::OnCancel() { // TODO: Add extra cleanup here if (m_strTempFilename != "") DeleteFile(m_strTempFilename.c_str()); CResizingDialog::OnCancel(); }