📄 workanadlg.cpp
字号:
// workanaDlg.cpp : implementation file
//
#include "stdafx.h"
#include "workana.h"
#include "workanaDlg.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#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<count;i++)
{
str=m_list->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<count;i++)
{
str="<";
str+=m_list->GetItemText(i,0);
str+=",";
str+=m_list->GetItemText(i,1);
str+=">\n";
dfile.WriteString(str);
}
dfile.Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -