cifafenxi.cpp
来自「This application not only demonstrates 」· C++ 代码 · 共 447 行
CPP
447 行
// cifafenxi.cpp : implementation file
//
#include <iostream.h>
#include "stdafx.h"
#include "词法分析.h"
#include "cifafenxi.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
long i;
char ch,token[8];
int syn,p,m,sum,flag,flag1,r,e;
bool flag0;
char *prog=new char[128];
char keyword[5][8]={"do","if","include","begin","end"};
char border[10]={'(',')','{','}','[',']',',',';',':','#'};
char calopeartor[12][3]={"+","-","*","/",">","<","=","!","<=",">=","==","!="};
char wordlist[16]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','u'};
char error[3][25]={"unknow character error","too long error","illegal biaoshifu error"};
/////////////////////////////////////////////////////////////////////////////
// Ccifafenxi dialog
Ccifafenxi::Ccifafenxi(CWnd* pParent /*=NULL*/)
: CDialog(Ccifafenxi::IDD, pParent)
{
//{{AFX_DATA_INIT(Ccifafenxi)
//}}AFX_DATA_INIT
}
void Ccifafenxi::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Ccifafenxi)
DDX_Control(pDX, IDC_EDIT2, m_edit2);
DDX_Control(pDX, IDC_LIST4, m_list4);
DDX_Control(pDX, IDC_LIST3, m_list3);
DDX_Control(pDX, IDC_BUTTON4, m_button4);
DDX_Control(pDX, IDC_BUTTON3, m_button3);
DDX_Control(pDX, IDC_BUTTON2, m_button2);
DDX_Control(pDX, IDC_BUTTON1, m_button1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(Ccifafenxi, CDialog)
//{{AFX_MSG_MAP(Ccifafenxi)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Ccifafenxi message handlers
int inshuzhu(char s[],int t,char w)
{
int q=0;
for(;q<t;q++)
if(w==s[q])
return 1;
return 0;
}
int incondition(char w)
{
bool mark;
mark=(48<=(int)w && (int)w<=57);
if(inshuzhu(wordlist,16,w) || mark)
return 1;
else
return 0;
}
void scaner( )
{
m=0;
for(int n=0; n<8; n++)
token[n]=NULL;
ch=prog[p++];
while (ch==' ')
ch=prog[p++];
if(inshuzhu(wordlist,16,ch)) //首字母为字符时
{
while(incondition(ch))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
for (n=0;n<5;n++)
if(strcmp( token, keyword[n])==0)
{
syn=n+1;
flag=1;
break;
}
if(flag==0 && m<=8)
syn=6;
else
if(m>8)
syn=-2;
flag=0;
}
else
if (48<=(int)ch && (int)ch<=57)
{
m=0;
sum=0;
flag0=(48<=(int)ch && (int)ch<=57 );
while (flag0 || inshuzhu(wordlist,16,ch))
{
sum=sum*10+(int)ch-48;
token[m++]=ch;
ch=prog[p++];
flag0=(48<=(int)ch && (int)ch<=57 );
if(inshuzhu(wordlist,16,ch))
flag1=-3;
}
p-- ;
if(flag1!=-3)
syn=7;
else
syn=-3;
flag1=0;
}
else
switch(ch)
{
case '<':
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='=')
{
syn=9;
token[m++]=ch;
}
else
{
syn=8;
p--;
}
break;
case '>':
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='=')
{
syn=11;
token[m++]=ch;
}
else
{
syn=10;
p--;
}
break;
case '=':
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='=')
{
syn=12;
token[m++]=ch;
}
else
{
syn=13;
p--;
}
break;
case '!':
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch=='=')
{
syn=14;
token[m++]=ch;
}
else
{
syn=15;
p--;
}
break;
case '+':
syn=16;
token[0]=ch;
break;
case '-':
syn=17;
token[0]=ch;
break;
case '*':
syn=18;
token[0]=ch;
break;
case '/':
syn=19;
token[0]=ch;
break;
case '(':
syn=20;
token[0]=ch;
break;
case ')':
syn=21;
token[0]=ch;
break;
case '[':
syn=22;
token[0]=ch;
break;
case ']':
syn=23;
token[0]=ch;
break;
case '{':
syn=24;
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 '#':
syn=29;
token[0]=ch;
break;
case ' ':
syn=-4;
break;
case '\0':
syn=0;
break;
default:
syn=-1;
token[0]=ch;
break;
}
}
void Ccifafenxi::OnButton1()
{
CString name;
CFile file;
char *in=new char[65536];
int flag=0;
char szfilter[]="ALL Files(*.*)|*.*||";
CFileDialog filedlg(TRUE,"ALL",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szfilter);
filedlg.m_ofn.lpstrTitle="打开文件-〉";
filedlg.DoModal();
name=filedlg.GetFileName();
flag=file.Open(name,CFile::modeRead);
if(flag==0)
MessageBox("无法打开文件!","error",MB_ICONERROR);
else
{
i=file.GetLength();
if(i>65535)
MessageBox("文件太长(>=64K)!","错误",MB_ICONERROR);
else
{
file.Read(in,i);
in[i+1]='\0';
SetDlgItemText(IDC_EDIT2,in);
}
file.Close();
}
}
void Ccifafenxi::OnButton4()
{
// TODO: Add your control notification handler code here
m_list3.ResetContent();
m_list4.ResetContent();
int k=-1;
CString str;
str.Format("%2s","关键字:");
m_list4.AddString(str);
for(int m=0;m<5;m++)
{
str.Format("%02d:%s",m,keyword[m]);
m_list4.InsertString(m+1,str);
}
str.Format("%2s","界符:");
m_list4.AddString(str);
for(m=0;m<10;m++)
{
str.Format("%02d:%c",m+1,border[m]);
m_list4.InsertString(m+7,str);
}
str.Format("%2s","运算符:");
m_list4.AddString(str);
for(m=0;m<12;m++)
{
str.Format("%02d:%s",m+1,calopeartor[m]);
m_list4.InsertString(m+18,str);
}
str.Format("%2s","错误:");
m_list3.AddString(str);
for(m=0;m<3;m++)
{
str.Format("%d:%s",k--,error[m]);
m_list3.InsertString(m+1,str);
}
MessageBox("关键字1 数字2 标示符3 分界符4 运算符5","说明",MB_ICONINFORMATION);
}
void Ccifafenxi::OnButton2()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString name;
CStdioFile file;
char *in=new char[64];
char szfilter[]="ALL Files(*.*)|*.*||";
CFileDialog filedlg(false,"ALL",NULL,OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,szfilter);
filedlg.m_ofn.lpstrTitle="保存结果到文件-〉";
filedlg.DoModal();
name=filedlg.GetFileName();
if(file.Open(name,CFile::modeCreate|CFile::modeWrite|CFile::modeRead))
{
CListBox *plist=(CListBox*)GetDlgItem(IDC_LIST3);
int ncount=plist->GetCount();
for(int k=0;k<ncount;k++)
{
int length=plist->GetTextLen(k);
plist->GetText(k,in);
in[length]='\0';
CString str;
str.Format("%s\r\n",in);
file.Seek(0,CFile::end);
file.WriteString(str);
}
CListBox *plist1=(CListBox*)GetDlgItem(IDC_LIST4);
int ncount1=plist1->GetCount();
for(int t=0;t<ncount1;t++)
{
int length=plist->GetTextLen(t);
plist1->GetText(t,in);
in[length]='\0';
CString str;
str.Format("%s\r\n",in);
file.Seek(0,CFile::end);
file.WriteString(str);
}
file.Close();
}
}
void Ccifafenxi::OnButton3()
{
// TODO: Add your control notification handler code here
r=0;
e=r;
m_list3.ResetContent();
m_list4.ResetContent();
CString str;
CEdit *pedit=(CEdit *)GetDlgItem(IDC_EDIT2);
int ncount=pedit->GetLineCount();
for(int n=0;n<ncount;n++)
{
int nlength=pedit->LineLength(pedit->LineIndex(n));
pedit->GetLine(n,prog,nlength);
prog[nlength]='\0';
p=0;
do{
scaner();
switch(syn)
{
case 7:
str.Format("%3d:(%d,%d)%3d",r++,2,syn,sum);
m_list4.InsertString(r-1,str);
break;
case -1:
str.Format("%s%3d:(%s,%s)","line",n+1,"unknown character error",token);
m_list3.InsertString(e++,str);
break;
case -2:
str.Format("%s%3d:(%s,%s)","line",n+1,"too long error",token);
m_list3.InsertString(e++,str);
break;
case -3:
str.Format("%s%3d:(%s,%s)","line",n+1,"illegal biaoshifu error",token);
m_list3.InsertString(e++,str);
break;
case -4:
break;
case 0:
break;
default:
if(8<=syn && syn<=19)
str.Format("%3d:(%d,%2d)%s",r++,5,syn,token);
else
if(20<=syn && syn<=29)
str.Format("%3d:(%d,%2d)%s",r++,4,syn,token);
else
if(syn>=1 && syn<=5)
str.Format("%3d:(%d,%2d)%s",r++,1,syn,token);
else
str.Format("%3d:(%d,%2d)%s",r++,3,syn,token);
m_list4.InsertString(r-1,str);
}
}while(syn!=0);
}
str.Format("%d %s",e,"error founds");
m_list3.InsertString(e++,str);
str.Format("%d %s",r,"symbols founds");
m_list3.InsertString(e++,str);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?