www.pudn.com > compile.rar > workanaDlg.cpp
// workanaDlg.cpp : implementation file // #include "stdafx.h" #include "workana.h" #include "workanaDlg.h" #include#include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CEdit * m_edit; extern CListCtrl * m_list; extern CEdit * m_info; extern char filename[256]; char prog[80],token[10]; int key[1000]; char ch; int errcifa=1; int syn,p,m,n,sum; char *keep[6]={"begin","if","then","while","do","end"}; int mm; int kk=0; ///////////////////////////////////////////////////////////////////////////// // CWorkanaDlg dialog CWorkanaDlg::CWorkanaDlg(CWnd* pParent /*=NULL*/) : CDialog(CWorkanaDlg::IDD, pParent) { //{{AFX_DATA_INIT(CWorkanaDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CWorkanaDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CWorkanaDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CWorkanaDlg, CDialog) //{{AFX_MSG_MAP(CWorkanaDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTONOPEN, OnOpenSFile) ON_BN_CLICKED(IDC_BUTTONSAVE, OnOpenDFile) ON_WM_CTLCOLOR() ON_WM_DROPFILES() ON_BN_CLICKED(IDC_BUTTONANA, OnCompile) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWorkanaDlg message handlers BOOL CWorkanaDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_edit=(CEdit *)GetDlgItem(IDC_EDITSOURCE); m_list=(CListCtrl *)GetDlgItem(IDC_LISTTWO); m_info=(CEdit *)GetDlgItem(IDC_EDITINFO); m_info->SetSel(-1,-1); m_info->ReplaceSel("******这里将显示词法分析的相关结果******\r\n"); m_info1=(CEdit *)GetDlgItem(IDC_EDITINFO1); m_info1->SetSel(-1,-1); m_info1->ReplaceSel("******这里将显示词法分析的相关结果******\r\n"); m_list->SetBkColor(RGB(0,0,0)); m_list->SetTextBkColor(RGB(0,0,0)); m_list->SetTextColor(RGB(255,0,255)); m_list->InsertColumn(0,"种别码",LVCFMT_CENTER,75); m_list->InsertColumn(1,"字符串",LVCFMT_CENTER,122); m_list->SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); GetDlgItem(IDC_BUTTONANA)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CWorkanaDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CWorkanaDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CWorkanaDlg::OnOpenSFile() { // TODO: Add your control notification handler code here CString filename; CString str="C 源文件 (*.c)|*.c | 文本文件(*.txt)|*.txt||"; CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,str,NULL); if(dlg.DoModal()==IDOK) { CString str,temp; CStdioFile file; filename=dlg.GetPathName(); str=filename; temp=str; //outputyufaerror(filename); GetDlgItem(IDC_EDITOPEN)->SetWindowText(filename); filename.Replace(".","_output."); GetDlgItem(IDC_EDITSAVE)->SetWindowText(filename); if(!file.Open(str,CFile::modeRead)) { AfxMessageBox("抱歉,打开源文件失败"); GetDlgItem(IDC_EDITOPEN)->SetWindowText(""); GetDlgItem(IDC_EDITSAVE)->SetWindowText(""); return; } while(file.ReadString(str)) { str+="\r\n"; m_edit->SetSel(-1,-1); m_edit->ReplaceSel(str); m_s+=str; UpdateData(false); } file.Close(); } GetDlgItem(IDC_BUTTONANA)->EnableWindow(true); } void CWorkanaDlg::OnOpenDFile() { // TODO: Add your control notification handler code here CString filename; CString str="C 源文件 (*.c)|*.c | 文本文件(*.txt)|*.txt||"; CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,str,NULL); if(dlg.DoModal()==IDOK) { filename=dlg.GetPathName(); //outputyufaerror(filename); GetDlgItem(IDC_EDITSAVE)->SetWindowText(filename); } } HBRUSH CWorkanaDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here switch(pWnd->GetDlgCtrlID()) { case IDC_STATIC: pDC->SetTextColor(RGB(255,0,0)); break; case IDC_BUTTONSAVE: case IDC_BUTTONOPEN: pDC->SetTextColor(RGB(192,0,192)); break; case IDC_BUTTONANA: pDC->SetTextColor(RGB(176,64,255)); break; case IDC_EDITOPEN: case IDC_EDITSAVE: case IDC_EDITSOURCE: case IDC_EDITINFO: case IDC_EDITINFO1: pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0,255,0)); HBRUSH hResult=CreateSolidBrush(RGB(0,0,0)); return hResult; // TODO: Return a different brush if the default is not desired } return hbr; } void CWorkanaDlg::OnDropFiles(HDROP hDropInfo) { // TODO: Add your message handler code here and/or call default CString str,temp,m_s; CStdioFile file; DragQueryFile(hDropInfo, 0, filename, 256); str=filename; temp=str; int n = temp.ReverseFind('.'); temp=temp.Mid(n,temp.GetLength()); if(temp==".c" || temp==".txt") { if(!file.Open(filename,CFile::modeRead)) { AfxMessageBox("抱歉,打开源文件失败"); return; } while(file.ReadString(str)) { str+="\r\n"; m_edit->SetSel(-1,-1); m_edit->ReplaceSel(str); //UpdateData(false); } file.Close(); } else { AfxMessageBox("抱歉,程序不处理 "+temp+" 类型文件"); return; } str=filename; GetDlgItem(IDC_EDITOPEN)->SetWindowText(str); str.Replace(".","_output."); GetDlgItem(IDC_EDITSAVE)->SetWindowText(str); //m_edit->SetSel(-1,-1); //m_edit->ReplaceSel(str); GetDlgItem(IDC_BUTTONANA)->EnableWindow(true); CDialog::OnDropFiles(hDropInfo); } void CWorkanaDlg::OnCompile() { // TODO: Add your control notification handler code here CStdioFile sfile; CString str; char temp[128]; kk=0; errcifa=1; m_list->DeleteAllItems(); m_info->SetWindowText(""); m_info1->SetWindowText(""); m_info->SetSel(-1,-1); m_info->ReplaceSel("******这里将显示词法分析的相关结果******\r\n"); m_info1->SetSel(-1,-1); m_info1->ReplaceSel("******这里将显示词法分析的相关结果******\r\n"); if(!sfile.Open(filename,CFile::modeRead)) { AfxMessageBox("抱歉,打开源文件失败"); return; } m_edit->SetWindowText(""); while(sfile.ReadString(str)) { str+="\r\n"; m_edit->SetSel(-1,-1); m_edit->ReplaceSel(str); //UpdateData(false); } sfile.Close(); sfile.Open(filename,CFile::modeRead); while(sfile.ReadString(str)) { p=0; int i=0; strcpy(temp,str); ch=temp[i++]; while(ch!='\0') { prog[p++]=ch; ch=temp[i++]; } prog[p]='\0'; p=0; do { scaner(); switch(syn) { case 11: outputdigit(); break; case -1: errcifa=0; outputerror(); break; case 999: break; default: outputother(); } }while(syn!=999); } syn=0; token[0]='#'; outputother(); sfile.Close(); if(errcifa) { //outputyufaerror("zfq"); outputsuccess(); getsyn(); syn=key[0]; mm=1; lrparser(); } infile(); } void CWorkanaDlg::scaner() { for(m=0;m<10;m++) token[m]=NULL; m=0; sum=0; ch=prog[p++]; while(ch==' ') { ch=prog[p++]; } if(isalpha(ch)) { while(isalpha(ch) || isdigit(ch)) { token[m++]=ch; ch=prog[p++]; } token[m]='\0'; p--; syn=10; for(n=0;n<6;n++) { if(strcmp(token,keep[n])==0) { syn=n+1; break; } } } else if(isdigit(ch)) { while(isdigit(ch)) { token[m++]=ch; sum=sum*10+ch-'0'; ch=prog[p++]; } if(isalpha(ch)) { while(isalpha(ch) || isdigit(ch)) { token[m++]=ch; ch=prog[p++]; } token[m]='\0'; syn=-1; } else { p--; syn=11; } } else { switch(ch) { case '<': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=21; token[m++]=ch; } else if(ch=='=') { syn=22; token[m++]=ch; } else { syn=20; p--; } break; case '>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; p--; } break; case ':': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; p--; } break; case '+': syn=13; token[0]=ch; break; case '-': syn=14; token[0]=ch; break; case '*': syn=15; token[0]=ch; break; case '/': syn=16; token[0]=ch; break; case '=': syn=25; token[0]=ch; break; case ';': syn=26; token[0]=ch; break; case '(': syn=27; token[0]=ch; break; case ')': syn=28; token[0]=ch; break; case '\0': syn=999; token[0]=ch; break; default: syn=-1; token[0]=ch; } } } void CWorkanaDlg::outputdigit() { LVITEM lvIt; CString temp1,temp2; char s1[30]; char s2[30]; temp1.Format("%d",syn); temp2.Format("%d",sum); strcpy(s1,temp1); strcpy(s2,temp2); int nItem=m_list->GetItemCount(); lvIt.mask=LVIF_TEXT; lvIt.pszText=(LPSTR)s1; lvIt.iSubItem=0; lvIt.iItem=nItem; int iPos=m_list->InsertItem(&lvIt); lvIt.mask=LVIF_TEXT; lvIt.iItem=iPos; lvIt.pszText=(LPSTR)s2; lvIt.iSubItem=1; m_list->SetItem(&lvIt); } void CWorkanaDlg::outputerror() { CString temp; temp="ERROR :\'"; temp+=token; temp+="\' is invalid word!"; m_info->SetSel(-1,-1); m_info->ReplaceSel(temp+"\r\n"); } void CWorkanaDlg::outputother() { LVITEM lvIt; /* CStdioFile file; CSring str; char dfile[256]; GetDlgItemText(IDC_EDITSAVE,str); strcpy(dfile,str); file.Open(dfile,CFile::modeWrite | CFile::modeCreate); */ CString temp; char s[20]; temp.Format("%d",syn); strcpy(s,temp); int nItem=m_list->GetItemCount(); lvIt.mask=LVIF_TEXT; lvIt.pszText=(LPSTR)s; lvIt.iSubItem=0; lvIt.iItem=nItem; int iPos=m_list->InsertItem(&lvIt); lvIt.mask=LVIF_TEXT; lvIt.iItem=iPos; lvIt.pszText=(LPSTR)token; lvIt.iSubItem=1; m_list->SetItem(&lvIt); } void CWorkanaDlg::outputsuccess() { CString temp; temp="Success in CIFA analysis!"; m_info->SetSel(-1,-1); m_info->ReplaceSel(temp+"\r\n"); } void CWorkanaDlg::getsyn() { CString str; int count=m_list->GetItemCount(); for(int i=0;i GetItemText(i,0); key[i]=atoi(str); } //CString temp; //temp.Format("%d %d %d %d %d %d ",key[0],key[1],key[2],key[3],key[4],key[5]); //outputyufaerror(temp); } void CWorkanaDlg::lrparser() { if(syn==1) { syn=key[mm++]; yucu(); if(syn==6) { syn=key[mm++]; if(syn==0 && kk==0) { outputyufaerror("success"); } } else { if(kk!=1) { outputyufaerror("end is required"); kk=1; } } } else { outputyufaerror("no begin"); kk=1; } } void CWorkanaDlg::yucu() { statement(); while(syn==26) { syn=key[mm++]; statement(); } } void CWorkanaDlg::statement() { if(syn==10) { syn=key[mm++]; if(syn==18) { syn=key[mm++]; expression(); } else { outputyufaerror("':=' error"); kk=1; } } else { outputyufaerror("statement error"); kk=1; } } void CWorkanaDlg::expression() { term(); while(syn==13 || syn==14) { syn=key[mm++]; term(); } } void CWorkanaDlg::term() { factor(); while(syn==15 || syn==16) { syn=key[mm++]; factor(); } } void CWorkanaDlg::factor() { if(syn==10 ||syn==11) { syn=key[mm++]; } else if(syn==27) { syn=key[mm++]; expression(); if(syn==28) { syn=key[mm++]; } else { outputyufaerror("')' error"); kk=1; } } else { outputyufaerror("expression error"); kk=1; } } void CWorkanaDlg::outputyufaerror(CString str) { if(str=="success") { m_info1->SetSel(-1,-1); m_info1->ReplaceSel("Success in YUFA analysis!\r\n"); } else { m_info1->SetSel(-1,-1); m_info1->ReplaceSel("ERROR : "+str+"\r\n"); } } void CWorkanaDlg::infile() { CStdioFile dfile; CString str,temp; GetDlgItemText(IDC_EDITSAVE,temp); dfile.Open(temp,CFile::modeCreate | CFile::modeWrite); int count=m_list->GetItemCount(); for(int i=0;i GetItemText(i,0); str+=","; str+=m_list->GetItemText(i,1); str+=">\n"; dfile.WriteString(str); } dfile.Close(); }