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 + -
显示快捷键?