www.pudn.com > vc61667782466611111.rar > MainFrm.cpp


// MainFrm.cpp : implementation of the CMainFrame class 
 
#include "stdafx.h" 
#include "SS.h" 
#include "SourceEditView.h" 
 #include "MainFrm.h" 
 
#include "SetDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
 class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
// App command to run the dialog 
 
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_COMMAND(ID_CIFA, OnCifa) 
	ON_COMMAND(ID_YUFA, OnYufa) 
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout) 
	ON_COMMAND(ID_SET, OnSet) 
	ON_COMMAND(ID_TEST, OnTest) 
	ON_COMMAND(ID_SELECT_ALL, OnSelectAll) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // status line indicator 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	// TODO: add member initialization code here 
	 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
 
 
 
    m_wndToolBar.SetButtonText(0,"新建");   //你所需要做的工作只需要添加这些:) 
    m_wndToolBar.SetButtonText(1,"打开");   //第一个参数是图标索引, 第2个参数是想要显示的文本 
    m_wndToolBar.SetButtonText(2,"保存"); 
    m_wndToolBar.SetButtonText(4,"剪切"); 
    m_wndToolBar.SetButtonText(5,"复制"); 
    m_wndToolBar.SetButtonText(6,"粘贴"); 
    m_wndToolBar.SetButtonText(8,"打印"); 
    m_wndToolBar.SetButtonText(10,"关于"); 
    m_wndToolBar.SetButtonText(11,"词法"); 
    m_wndToolBar.SetButtonText(13,"语法"); 
    m_wndToolBar.SetButtonText(14,"设置"); 
    m_wndToolBar.SetButtonText(15,"测试"); 
    m_wndToolBar.SetButtonText(16,"退出"); 
 
    m_wndToolBar.SetSizes(CSize(45,45),CSize(24,24)); 
 
 
 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("Failed to create status bar\n"); 
		return -1;      // fail to create 
	} 
 
	// TODO: Delete these three lines if you don't want the toolbar to 
	//  be dockable 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
	EnableDocking(CBRS_ALIGN_ANY); 
	DockControlBar(&m_wndToolBar); 
 
	return 0; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	 
	cs.x=0; 
	cs.y=0; 
	cs.cx=::GetSystemMetrics(SM_CXSCREEN); 
	cs.cy=::GetSystemMetrics(SM_CYSCREEN)-30; 
 
 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
 
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)  
{ 
	if (!m_wndSplitter.CreateStatic(this, 1, 2))    //创建1行2列的切分窗口 
	{ 
		TRACE0("Failed to CreateStaticSplitter\n"); 
		return FALSE; 
	} 
 
	CRect rc;				//获得客户区大小 
	GetClientRect(rc); 
	int x=rc.Width()/2; 
	int y=rc.Height()/2; 
 
	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSourceEditView), CSize(x,y), pContext)) 
	{ 
		TRACE0("Failed to create second pane\n"); 
		return FALSE; 
	} //创建第1个视图 
 
	if (!m_wndSplitter.CreateView(0, 1,	pContext->m_pNewViewClass, CSize(x,y), pContext)) 
	{ 
		TRACE0("Failed to create first pane\n"); 
		return FALSE; 
	} //创建第2个视图 
 
 
	m_pEditSrc=&((CEditView*)m_wndSplitter.GetPane(0,0))->GetEditCtrl();  //获得CEditView视图中的编辑框控件的指针 
	m_pEditOut=&((CEditView*)m_wndSplitter.GetPane(0,1))->GetEditCtrl(); 
 
	 
 
 
/*--------------------------------设置字体--------------------------*/ 
	m_font.CreateFont(14, 0,0,0,FW_NORMAL, 0,0,0, 
		DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, 
		DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Verdana"); 
	 
	m_font2.CreateFont(12, 0,0,0,FW_NORMAL, 0,0,0, 
		DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, 
		DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "fixedsys"); 
	 
	m_pEditOut->SetFont(&m_font); 
	m_pEditSrc->SetFont(&m_font2);  
/*--------------------------------设置字体--------------------------*/ 
 
 
	::Sleep(500); 
	if ( ((CSSApp*)AfxGetApp())->m_pLogoThread != NULL) 
	     ((CSSApp*)AfxGetApp())->m_pLogoThread->HideSplash();     //在创建了主对话框 并初始化了各个子对话框以后,隐藏启动画面	 
 
	return true; 
 
} 
 
void CMainFrame::OnCifa()  
{ 
	m_pEditOut->SetWindowText("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t正在进行词法分析,稍等...."); 
 	CWaitCursor cur; 
 
	CString str, strTemp; 
	m_pEditSrc->GetWindowText(strTemp); 
	if(strTemp.IsEmpty()) 
	{ 
		m_pEditOut->SetWindowText("\r\n\r\n\r\n\r\n\r\n\r\n\r\n请在左边编辑源程序或打开一个源程序文件!\r\n\r\n然后再进行词法分析"); 
		return; 
	} 
	 
 
	char buf[10000]; 
	int sz=m_pEditSrc->GetWindowText(buf,10000);   //获得源代码 
  
	::strcpy(m_fenxi.m_str,buf); 
 
	m_fenxi.CiFaFenXi();   //进行词法分析 
 
	CIFA * * p=m_fenxi.m_cifa; 
 
	int s=0; 
	int a=p[s]->nType; 
	while ((p[s]->nType)>=0) 
		s++; 
	char (*ep)[100]; 
	ep=m_fenxi.m_szErrMsg; 
	//result to : p,s,ep 
 
 
	int ErrorCount=0; 
	str.Format("\r\n\t\t词法分析结果\r\n\r\n\r\n输出格式:二元式序列(类型,值)单词\r\n\r\n"); 
	 
	for (int i=0;inType>0) 
		{ 
			strTemp.Format("(%d,%d)\t%s\r\n",p[i]->nType,p[i]->nValue,p[i]->szText); 
			str+=strTemp; 
		} 
		else 
		{ 
			ErrorCount++; 
			if (p[i]->nValue==2 && (p[i]->szText[0]>126 || p[i]->szText[0]<32)) 
			{ 
				strTemp.Format("错误号:%d %s 【 无法显示该字符! 】\r\n",	p[i]->nValue,ep[p[i]->nValue]); 
				str+=strTemp; 
			} 
			else 
			{ 
				strTemp.Format("错误号:%d %s 【 %s 】\r\n",p[i]->nValue,ep[p[i]->nValue],p[i]->szText); 
				str+=strTemp; 
			} 
		} 
	} 
	strTemp.Format("\r\n 发现 %d 个错误!\r\n",ErrorCount); 
	str+=strTemp; 
 
	m_pEditOut->SetWindowText(str); 
	 
 
} 
 
void CMainFrame::OnYufa()  
{ 
	CWaitCursor cur; 
 
	CString str,strTemp; 
	m_pEditSrc->GetWindowText(strTemp); 
	if(strTemp.IsEmpty()) 
	{ 
		m_pEditOut->SetWindowText("\r\n\r\n\r\n\r\n\r\n\r\n\r\n请在左边编辑源程序或打开一个源程序文件!\r\n\r\n然后再进行语法分析"); 
		return; 
	} 
 
	 
	char buf[30003];           //源代码缓冲区 
	int sz=m_pEditSrc->GetWindowText(buf,30000); 
	buf[sz]=0; 
	::strcpy(m_fenxi.m_str,buf); 
 
	m_fenxi.CiFaFenXi();   //词法分析 
 
	CIFA * * cp=m_fenxi.m_cifa; 
 
	int s=0; 
	while ((cp[s]->nType)>=0) 
		s++; 
	char (*ep)[100]; 
	ep=m_fenxi.m_szErrMsg; 
 
	for (int i=0;inType==0) 
			break; 
 
	m_fenxi.YuFaFenXi();   //语法分析 
 
	//result to : cp,s,ep 
 
	m_pEditOut->SetWindowText(""); 
 
 
 	str.Format("\r\n\t\t语法分析结果\r\n\r\n\r\n"); 
 
 
	if (m_fenxi.m_nErrNo==0) 
	{ 
		strTemp.Format("源程序语法正确!\r\n"); 
		str+=strTemp; 
	} 
	else 
	{ 
		strTemp.Format("语法上有错误!!\r\n"); 
		str+=strTemp; 
 
		m_pEditSrc->SetSel(cp[m_fenxi.m_nErrAddr]->nAddr, 
			cp[m_fenxi.m_nErrAddr]->nAddr 
			+::strlen(cp[m_fenxi.m_nErrAddr]->szText)); 
 
		strTemp.Format("\r\n错误号:%d %s\r\n", 
			m_fenxi.m_nErrNo, 
			ep[m_fenxi.m_nErrNo]); 
 
		str+=strTemp; 
	} 
 
	m_pEditOut->SetWindowText(str); 
} 
 
void CMainFrame::AppendText(CEdit *pEdit, char *pText) 
{ 
	int nLen=pEdit->GetWindowTextLength(); 
	if (nLen>29000) 
		return; 
 
	pEdit->SetSel(nLen,nLen); 
	pEdit->ReplaceSel(pText); 
} 
 
 
 
 
void CMainFrame::OnAppAbout()  
{ 
 
 
 
	this->m_pEditOut->SetWindowText(""); 
 
	AppendText(m_pEditOut,"\r\n\r\n\r\n\r\n\tPL/0语言的词法和语法分析程序\r\n"); 
	AppendText(m_pEditOut,"---------------------------------------------------------------------\r\n"); 
	AppendText(m_pEditOut,"\r\n\r\n程序作者:2002112105 程红秀"); 
	AppendText(m_pEditOut,"\r\n\r\n完成日期:2005-06-13"); 
	AppendText(m_pEditOut,"\r\n\r\n使用说明:PL/0语言是Pascal语言的一个子集,"); 
	AppendText(m_pEditOut,"\r\n\t这里只是演示了词法和语法分析"); 
	AppendText(m_pEditOut,"\r\n\r\n我的网站:http://www.59hao.com/chx"); 
 
 
} 
 
void CMainFrame::OnSet()  
{ 
	CSetDlg sd; 
	if(sd.DoModal()==IDOK) 
	{ 
		((CSourceEditView*)this->m_wndSplitter.GetPane(0,0))->SetTextColor(sd.m_crTextColor); 
		((CSourceEditView*)this->m_wndSplitter.GetPane(0,0))->SetBackColor(sd.m_crBackColor); 
		 
	} 
	 
 
	//	m_wndSplitter.GetPane(0,1)->SetTextColor(sd.m_crTextColor2); 
	//	m_wndSplitter.GetPane(0,1)->SetBackColor(sd.m_crBackColor2); 
 
	 
} 
 
void CMainFrame::OnTest()  
{ 
	CStdioFile sf; 
	if(sf.Open("Test.pl0",CFile::modeRead)) 
	{ 
		CString  strTemp,strOut; 
		while(sf.ReadString(strTemp)) 
		{ 
			strOut+=strTemp; 
			strOut+="\r\n"; 
		}	 
		 
		m_pEditSrc->SetWindowText(strOut); 
		sf.Close(); 
 
		m_pEditOut->SetWindowText(""); 
		AppendText(m_pEditOut,"\r\n\r\n\r\n\r\n\r\n\r\n左边是一个正确PL/0程序,请进行词法和语法分析看看!"); 
 
	} 
} 
 
void CMainFrame::OnSelectAll()  
{ 
		m_pEditSrc->SetSel(0,-1); 
}