www.pudn.com > CLanCompiler.rar > MainFrm.cpp
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "CLanCompiler.h"
#include "Compiler.h"
#include "MainFrm.h"
#include "LeftView.h"
#include "CLanCompilerView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_Error, OnError)
ON_COMMAND(ID_Source, OnSource)
ON_COMMAND(ID_StartCompile, OnStartCompile)
ON_UPDATE_COMMAND_UI(ID_Error, OnUpdateError)
ON_COMMAND(ID_StartCompiler, OnStartCompiler)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
//}}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()
{
IsDisplayed=false;
// 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
}
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);
err_dlg.Create(IDD_OutputErr,this);
return 0;
}
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext);
if(m_wndSplitter1.CreateStatic(&m_wndSplitter,2,1,WS_CHILD|WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 1))==NULL)
return FALSE;
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCLanCompilerView),CSize(100,450),pContext); //将CView3类连接到第二个分栏对象的0行1列
m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CCLanCompilerView),CSize(100,300),pContext);
m_pTreeCtrl=&((CLeftView*)m_wndSplitter.GetPane(0,0))->GetTreeCtrl();
m_pEdit=&((CEditView*)m_wndSplitter1.GetPane(0,0))-> GetEditCtrl();
m_pEdit1=&((CEditView*)m_wndSplitter1.GetPane(1,0))-> GetEditCtrl();
return TRUE;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
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
void CMainFrame::OnError()
{
}
void CMainFrame::OnSource()
{
OnFileOpen() ;
/* char *szStr;
CFile file("Compiler.txt",CFile::modeRead);
int nLength=file.GetLength();
szStr=new char[nLength+1];
file.Read(szStr,nLength);
szStr[nLength]='\0';
file.Close ();
m_pEdit->SetWindowText (szStr);
*/
// TODO: Add your command handler code here
}
void CMainFrame::OnStartCompile()
{
CFile file;
num=-1;
file.Open ("Compiler.txt",CFile::modeWrite|CFile::modeCreate);
m_pEdit->GetWindowText(s);
int nLength=s.GetLength();
file.Write (s,nLength);
file.Close();
com.Compile ("Compiler.txt");
com.flagVar=false;
com.flagErrSta=false;
com.flagErrNum=false;
com.flagChar=false;
TREENODE_LPV tnlpvTemp;
m_vectorTreeNode_Lpv.clear();
HTREEITEM hFindRoot=m_pTreeCtrl->GetRootItem();
if(m_pTreeCtrl->GetItemText(hFindRoot)=="段秀平")
m_pTreeCtrl->DeleteItem(hFindRoot);
HTREEITEM hRoot=m_pTreeCtrl->InsertItem("段秀平",0,0);
HTREEITEM hKeyWordSubRoot=m_pTreeCtrl->InsertItem("关键字",hRoot,0);
HTREEITEM hIdSubRoot=m_pTreeCtrl->InsertItem("变量和变量",hRoot,0);
HTREEITEM hOprSymSubRoot=m_pTreeCtrl->InsertItem("运算符",hRoot,0);
HTREEITEM hBndSymSubRoot=m_pTreeCtrl->InsertItem("界符",hRoot,0);
HTREEITEM hIllegalCharSubRoot=m_pTreeCtrl->InsertItem("非法字符",hRoot,0);
bool bKeyWord=0;
bool bId=0;
bool bOprSym=0;
bool bBndSym=0;
bool bIllegalChar=0;
int nLen=com.m_vectorSymbol.size ();
for(int i=0;iInsertItem(com.m_vectorSymbol[i].szStr,hKeyWordSubRoot,0);
bKeyWord=1;
}
break;
case Id:
if(!Ismemberof(com.m_vectorSymbol[i].szStr))
{
tnlpvTemp.hTreeItem=m_pTreeCtrl->InsertItem(com.m_vectorSymbol[i].szStr,hIdSubRoot,0);
bId=1;
}
break;
case OprSym:
if(!Ismemberof(com.m_vectorSymbol[i].szStr))
{
tnlpvTemp.hTreeItem=m_pTreeCtrl->InsertItem(com.m_vectorSymbol[i].szStr,hOprSymSubRoot,0);
bOprSym=1;
}
break;
case BndSym:
if(!Ismemberof(com.m_vectorSymbol[i].szStr))
{
tnlpvTemp.hTreeItem=m_pTreeCtrl->InsertItem(com.m_vectorSymbol[i].szStr,hBndSymSubRoot,0);
bBndSym=1;
}
break;
case IllegalChar:
if(!Ismemberof(com.m_vectorSymbol[i].szStr))
{
tnlpvTemp.hTreeItem=m_pTreeCtrl->InsertItem(com.m_vectorSymbol[i].szStr,hIllegalCharSubRoot,0);
bIllegalChar=1;
}
break;
}
num++;
}
if(!bKeyWord)
m_pTreeCtrl->DeleteItem(hKeyWordSubRoot);
if(!bId)
m_pTreeCtrl->DeleteItem(hIdSubRoot);
if(!bOprSym)
m_pTreeCtrl->DeleteItem(hOprSymSubRoot);
if(!bBndSym)
m_pTreeCtrl->DeleteItem(hBndSymSubRoot);
if(!bIllegalChar)
m_pTreeCtrl->DeleteItem(hIllegalCharSubRoot);
m_pTreeCtrl->Expand(hKeyWordSubRoot,TVE_EXPAND);
m_pTreeCtrl->EnsureVisible(hKeyWordSubRoot);
m_pTreeCtrl->Expand(hIdSubRoot,TVE_EXPAND);
m_pTreeCtrl->Expand(hOprSymSubRoot,TVE_EXPAND);
m_pTreeCtrl->Expand(hBndSymSubRoot,TVE_EXPAND);
m_pTreeCtrl->Expand(hIllegalCharSubRoot,TVE_EXPAND);
char *szStr;
CFile file1("Err.txt",CFile::modeRead);
nLength=file1.GetLength();
szStr=new char[nLength+1];
file1.Read(szStr,nLength);
szStr[nLength]='\0';
file1.Close ();
m_pEdit1->SetWindowText (szStr);
// TODO: Add your command handler code here
}
bool CMainFrame::Ismemberof(char sz[])
{
for(int i=0;iSetCheck (IsDisplayed);
// TODO: Add your command update UI handler code here
}
void CMainFrame::OnStartCompiler()
{
OnStartCompile();
// TODO: Add your command handler code here
}
void CMainFrame::OnFileOpen()
{
CFile f;
char sl[]="*.txt\0\0";
char *szStr;
CFileDialog fdlg(TRUE);
fdlg.m_ofn.lpstrFilter=(LPSTR)sl;
if(fdlg.DoModal ()==IDOK)
{
CString file=fdlg.GetFileName ();
CFile f;
f.Open(file,CFile::modeRead);
int nLength=f.GetLength();
szStr=new char[nLength+1];
f.Read(szStr,nLength);
szStr[nLength]='\0';
f.Close ();
m_pEdit->SetWindowText (szStr);
}
// TODO: Add your command handler code here
}
void CMainFrame::OnFileSave()
{
/*
char s1[]="*.txt\0\0";
CString str;
CFileDialog fdlg(FALSE);
fdlg.m_ofn.lpstrFilter=(LPSTR)s1;
if(fdlg.DoModal ()==IDOK)
{
CString file=fdlg.GetFileName ();
CFile f;
f.Open(file,CFile::modeWrite | CFile::modeCreate);
m_pEdit->GetWindowText(str);
int nLength=str.GetLength();
f.Write(str,nLength);
f.Close();
}
*/
}
void CMainFrame::OnFileSaveAs()
{
}